一个投射阴影的Pass-ShadowCaster实例

如果说在有顶点动画的情况加,我们在常规的Pass修改了模型空间的坐标位置,如果还是使用内置的ShadowCaste去投射阴影的话就会产生错误,因为它用的还是没有修改过的模型顶点信息,所以这就需要自定义这个ShadowCaste的Pass了。

Pass {
	Tags { "LightMode" = "ShadowCaster" }
			
	CGPROGRAM
			
	#pragma vertex vert
	#pragma fragment frag
			
	#pragma multi_compile_shadowcaster
			
	#include "UnityCG.cginc"
			
	float _Magnitude;
	float _Frequency;
	float _InvWaveLength;
	float _Speed;
			
	struct v2f { 
		//定义阴影投射的变量
		V2F_SHADOW_CASTER;
	};
			
	v2f vert(appdata_base v) {
		v2f o;
				
		//和常规Pass一样的顶点信息改变
		float4 offset;
		offset.yzw = float3(0.0, 0.0, 0.0);
		offset.x = sin(_Frequency * _Time.y + v.vertex.z * _InvWaveLength) * _Magnitude;
		v.vertex = v.vertex + offset;

		//直接使用定义好的宏去计算就好了,注意使用v,有vertex和normal
		TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
				
		return o;
	}
			
	fixed4 frag(v2f i) : SV_Target {
		SHADOW_CASTER_FRAGMENT(i) //定义好的宏
	}
	ENDCG
}

首页 我的博客
粤ICP备17103704号