Unity – shadow in custom shader

官方文件對這部分並沒有很詳細的說明,網路上也有各種解法,但都沒有回答到核心問題哪( -_-)ノ

剛好公司入手了「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

	}

當然,上面提到的那本實戰詳解有詳細的教學,有需要的可以去弄來瞅瞅~

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s