Version: Unity 6.0 (6000.0)
言語 : 日本語
ビルトインレンダーパイプラインの頂点モディファイアサーフェスシェーダーの例
ビルトインレンダーパイプラインで最終色のモディファイアを使用するサーフェスシェーダーの例

ビルトインレンダーパイプラインのカスタムデータサーフェスシェーダーの例

頂点モディファイア関数を使用すると、頂点シェーダーのカスタムデータを計算することもできます。計算されたカスタムデータはピクセルごとにサーフェスシェーダー関数に渡されます。同じコンパイルディレクティブ vertex:functionName が使用されますが、この関数は inout appdata_fullout Input の 2 つのパラメーターを取る必要があります。ビルトイン値ではない任意の Input メンバーを入力できます。

注意この方法では、名前が ‘uv’ で始まるカスタム Input メンバーは正常に動作しないため、使用しないでください。

以下の例では、カスタム float3 customColor メンバーを定義します。これは頂点関数で計算されます。

  Shader "Example/Custom Vertex Data" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert vertex:vert
      struct Input {
          float2 uv_MainTex;
          float3 customColor;
      };
      void vert (inout appdata_full v, out Input o) {
          UNITY_INITIALIZE_OUTPUT(Input,o);
          o.customColor = abs(v.normal);
      }
      sampler2D _MainTex;
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
          o.Albedo *= IN.customColor;
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }

この例では、customColor が法線の絶対値に設定されます。

さらに実用的な用途としては、ビルトイン Input 変数によって与えられない頂点ごとのデータの計算や、シェーダー演算の最適化が考えられます。例えば、ピクセルごとにサーフェスシェーダーでリムライティングを計算する代わりに、オブジェクトの頂点でそれを行うことが可能です。

ビルトインレンダーパイプラインの頂点モディファイアサーフェスシェーダーの例
ビルトインレンダーパイプラインで最終色のモディファイアを使用するサーフェスシェーダーの例