トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

unity_shader_vertex_color

頂点カラーの反映


Surface Shaderとして以下のように記述。

VertexColor.shader

Shader "Custom/Vertex color" {
   Properties {
       _MainTex ("Base (RGB)", 2D) = "white" {}
   }
   SubShader {
       Tags { "RenderType"="Opaque" }
       LOD 200
           
       CGPROGRAM
       #pragma surface surf Lambert
           
       // サーフェスShaderとしての処理.
       sampler2D _MainTex;
           
       struct Input {
           float2 uv_MainTex;
           float4 color : COLOR;   // 頂点カラーを受け取る.
       };

       void surf (Input IN, inout SurfaceOutput o) {
           half4 c = tex2D (_MainTex, IN.uv_MainTex);
           c *= IN.color;      // 頂点カラーの反映.
           o.Albedo = c.rgb;
           o.Alpha  = c.a;
       }
       ENDCG
   }
           
   Fallback "Diffuse"
}

Meshを生成したときに「Mesh.colors」にColorの配列を渡すと、それが頂点カラーになります。
なお、格納する要素数はverticesと同じである必要があります。

 影響度を指定


Shaderのパラメータとして「Influence」というのを追加。
これは0.0-1.0の数値を指定することができ、1.0に近づくほど頂点カラーの影響を受けます。

VertexColor.shader

Shader "Custom/Vertex color" {
   Properties {
       _MainTex ("Base (RGB)", 2D) = "white" {}
       _Influence ("Influence", Range(0, 1)) = 1.0   // <== これを追加.
   }
   SubShader {
       Tags { "RenderType"="Opaque" }
       LOD 200
           
       CGPROGRAM
       #pragma surface surf Lambert
           
       // サーフェスShaderとしての処理.
       sampler2D _MainTex;
       float _Influence;    // <== これを追加.
           
       struct Input {
           float2 uv_MainTex;
           float4 color : COLOR;   // 頂点カラーを受け取る.
       };

       void surf (Input IN, inout SurfaceOutput o) {
           half4 c = tex2D (_MainTex, IN.uv_MainTex);
           c *= (IN.color * _Influence) + (half4(1, 1, 1, 1) * (1.0f - _Influence));  // <== 変更.
           o.Albedo = c.rgb;
           o.Alpha  = c.a;
       }
       ENDCG
   }
           
   Fallback "Diffuse"
}


最終更新時間:2013年11月27日 13時58分49秒