Unityのシェーダのプロパティを使ってみる

はじめに

前回の記事では、頂点シェーダ内で行われている座標変換について説明しました。 ちょっと前回の分量が多かったので今回は軽めに。

自分の作ったシェーダのマテリアルのインスペクタにプロパティを追加してみます。

カラーのプロパティ

Unityのバージョン: 2018.2.6f1

プロパティの定義

まず最初に今回のシェーダのコードを載せます。

Shader "MyShader/ShaderProperties"
{
  Properties
  {
    _Color ("Color", Color) = (1.0, 1.0, 1.0, 1.0)
  }
  SubShader
  {
    Pass
    {
      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag
      #include "UnityCG.cginc"

      struct appdata
      {
        float4 vertex : POSITION;
      };

      struct v2f
      {
        float4 vertex : SV_POSITION;
      };

      uniform float3 _Color;

      v2f vert (appdata v)
      {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
        return o;
      }

      float4 frag (v2f i) : SV_Target
      {
        return float4(_Color, 1);
      }
      ENDCG
    }
  }
}

前々回の単色塗りつぶしシェーダがベースになっています。 塗りつぶし色をプロパティから選べるようにしました。

プロパティのスクリーンショット

Cg/HLSLコード内でuniformをつけて宣言している変数と、 最初のShaderLabの領域のPropertiesブロックがポイントです。

uniformをつけて宣言されている変数はuniform型の変数という特別な変数になります。 頂点シェーダの頂点ごとに変わる入力変数や、 フラグメントシェーダのフラグメントごとに変わる入力変数とは異なり、 uniform型の変数はすべての頂点、すべてのフラグメントで等しい値となります。

Cg/HLSLでは宣言時にuniformが必須ですが、Unityではトップレベルの変数宣言は自動で uniformがついている扱いになるのでuniform修飾子は省略できます。 uniformをつけておいた方がuniform変数であることがわかりやすいのでつけてあります。

プロパティの値はこのuniform変数として受け取ることになります。 頂点ごとに別の値を渡したい場合はMeshのUVや頂点色などを利用します。

ShaderLabのPropertiesブロックでは、Cg/HLSLコードのuniform型の変数と同じ名前で プロパティを定義します。 プロパティの定義では、表示名とプロパティのタイプ、そしてデフォルト値を指定します。 ここではColorを指定しましたが、他にもVectorFloat2Dなど いくつかのものが指定できます。 詳しくはこちらのドキュメントに記載されています。

カラーのプロパティ

おわりに

今回は自作シェーダのマテリアルのプロパティについて解説しました。

ソースコードはこちらのリポジトリに置いてあります。

  • Unity
新しい投稿
だるま商店街