官方文件對這部分並沒有很詳細的說明,網路上也有各種解法,但都沒有回答到核心問題哪( -_-)ノ
剛好公司入手了「Unity3D ShaderLab開發實戰詳解」裡面有提到這個部分!
也能解釋網路上各種解法的原因惹~
需求
一個專門處理 LightMode 為 ShadowCaster 的 Pass
※ShadowCaster: Renders object as shadow caster.
解法
1. 利用 Fallback 來使用內建的 shader 來處理 shadow。
ex: Fallback “VertexLit"
2. 自己寫一個!(廢話
要對影子有任何處理或改變,基本上就是從這裡下手。
目前我的需求還沒那麼複雜,所以詳細的操作也就不誤導各位了XD
有興趣自己動手的,可參考內建的 shader「DefaultResourcesExtra/AlphaTest-VertexLit.shader」
※可到「Unity download archive」下載對應版本的 “Built-in shaders"
以下來自4.5.0的AlphaTest-VertexLit:
// Pass to render object as a shadow caster Pass { Name "Caster" Tags { "LightMode" = "ShadowCaster" } Offset 1, 1 Fog {Mode Off} ZWrite On ZTest LEqual Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_shadowcaster #include "UnityCG.cginc" struct v2f { V2F_SHADOW_CASTER; float2 uv : TEXCOORD1; }; uniform float4 _MainTex_ST; v2f vert( appdata_base v ) { v2f o; TRANSFER_SHADOW_CASTER(o) o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); return o; } uniform sampler2D _MainTex; uniform fixed _Cutoff; uniform fixed4 _Color; float4 frag( v2f i ) : SV_Target { fixed4 texcol = tex2D( _MainTex, i.uv ); clip( texcol.a*_Color.a - _Cutoff ); SHADOW_CASTER_FRAGMENT(i) } ENDCG }
當然,上面提到的那本實戰詳解有詳細的教學,有需要的可以去弄來瞅瞅~