1つのShaderには複数のSubshaderを記述できる。Unityは上からSubshaderを見ていき、現在のマシン(GraphicCard)に適用できるシェーダがあれば、それを適用する。
1つのSubshaderの中には、1つ以上のレンダリングパス(Pass)を指定できる。また、オプションとして特定のタグ(Tag)を指定できる。
レンダリングパスには - Regular Pass (Pass) - Use Pass (UsePass) - Grab Pass (GrapPass) の3種類がある。
次の例は、シングルパスで、ライトを消し、_MainTexというテクスチャを設定してメッシュを表示するもの。
// ... SubShader { Pass { Lighting Off SetTexture [_MainTex] {} } } // ...
Passは
Pass {[Name and Tags\] [RenderSetup\] [TextureSetup] }
という構造になる。
Name and Tagsは、Passの名前と、複数の任意のタグを指定するもの。
- レンダリング設定
パスの中にはレンダリングに関するさまざまな設定を記述する。レンダリング設定には次のブロックがある。
- Material 下のMaterialブロックを参照
- Lighting: Materialブロックの設定を有効にするには、LightingをOnにする必要あり。
- Cull
- ZTest
- ZWrite
- Fog
- AlphaTest
- Blend
- Color
- ColorMask
- Offset
- SeparateSpecular: テクスチャリングの後にスペキュラを設定するか?
- ColorMaterial: Materialの設定カラーではなく、Per-vertexカラーを使う。AmbientAndDiffuseとEmissionの2つがある。
レンダリングパスの最初は、Vertex ColoringとLighting。ここではColor、Material、Lightingが関係する。
Materialブロックには次の設定がある。
Diffuse color:オブジェクトの基本色
Ambient color: アンビエントライトの色
Specular color:スペキュラの色
Shininess number:スペキュラの集中度。0(全体に拡散)~1(一点に集中)
Emission color: オブジェクトの発光色。ライトの影響を受けない。
サンプル
Shader "VertexLit" { Properties { _Color ("Main Color", Color) = (1,1,1,0) _SpecColor ("Spec Color", Color) = (1,1,1,1) _Emission ("Emmisive Color", Color) = (0,0,0,0) _Shininess ("Shininess", Range (0.01, 1)) = 0.7 _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Pass { Material { Diffuse [_Color] Ambient [_Color] Shininess [_Shininess] Specular [_SpecColor] Emission [_Emission] } Lighting On SeparateSpecular On SetTexture [_MainTex] { Combine texture * primary DOUBLE, texture * primary } } } }
※SetTextureについては、ShaderLab:Texture Cobiners、または、ShaderLabの基礎:Texture Combinersを理解するを参照のこと。