Unity顶点动画的阴影实现

Shader "Custom/Chapter11-Billboard" {
	Properties
	{
		_MainTex("Main Tex",2D) = "White"{}
		_Color("Color Tint",Color) = (1,1,1,1)
		_VerticalBillboarding("Vertical Restraints",Range(0,1)) = 1
	}
	
	SubShader
	{
		Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "DisableBatching" = "True"}
		pass
		{
			Tags {"LightMode" = "ForwardBase"}

			ZWrite off
			Blend SrcAlpha OneMinusSrcAlpha
			Cull off

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "Lighting.cginc"
			#include "unityCG.cginc"

			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed4 _Color;
			fixed _VerticalBillboarding;

			struct a2v
			{
				float4 vertex :POSITION;
				float4 texcoord:TEXCOORD0;
			};
			struct v2f
			{
				float4 pos:SV_POSITION;
				float2 uv:TEXCOORD0;
				//V2F_SHADOW_CASTER;
			};

			v2f vert(a2v v)
			{
				v2f o;
				float3 center = float3(0,0,0);//设置广告牌的锚点
				float3 viewer =mul(_World2Object,float4(_WorldSpaceCameraPos,1));//获取模型空间下的视角坐标
				float3 normalDir = viewer-center;//根据视角以及锚点的位置,计算目标法线方向

				float3 upDir = abs(normalDir.y>0.999?float3(0,0,1):float3(0,1,0));//计算向上的方向,前提是保证其不与法线方向平行,

				float3 rightDir = normalize(cross(upDir,normalDir));//根据向上方向和法线方向得到向右的方向
				upDir = normalize(cross(normalDir,rightDir));//根据向右方向和法线方向得到向上防线
				float3 centerOffs = v.vertex.xyz-center;//计算当前顶点与锚点的偏移量
				//更新模型坐标
				float3 localPos = center+rightDir*centerOffs.x+upDir*centerOffs.y+normalDir*centerOffs.z;
				//模型空间坐标转换到剪裁空间下的坐标
				o.pos = mul(UNITY_MATRIX_MVP,float4(localPos,1));
				o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
				//TRANSFER_SHADOW_CASTER_NORMALOFFSET(o);
				return o;
			}
			fixed4 frag(v2f i):SV_TARGET
			{

				fixed4 c = tex2D(_MainTex,i.uv);
				c.rgb*=_Color.rgb;
				//SHADOW_CASTER_FRAGMENT(i);
				return c;
			}
			ENDCG
		}
		Pass {
			Tags { "LightMode" = "ShadowCaster" }
			
			CGPROGRAM
			
			#pragma vertex vert
			#pragma fragment frag
			
			#pragma multi_compile_shadowcaster
			
			#include "UnityCG.cginc"
			
			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed4 _Color;
			fixed _VerticalBillboarding;
			
			struct v2f { 
			    float4 pos:SV_POSITION;
                float2 uv:TEXCOORD0;
			};
			
			v2f vert(appdata_base v) {
				v2f o;
				float4 offset;
				o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
				float3 center = float3(0,0,0);//设置广告牌的锚点
				float3 viewer =mul(_World2Object,float4(_WorldSpaceCameraPos,1));//获取模型空间下的视角坐标
				float3 normalDir = viewer-center;//根据视角以及锚点的位置,计算目标法线方向

				float3 upDir = abs(normalDir.y>0.999?float3(0,0,1):float3(0,1,0));//计算向上的方向,前提是保证其不与法线方向平行,

				float3 rightDir = normalize(cross(upDir,normalDir));//根据向上方向和法线方向得到向右的方向
				upDir = normalize(cross(normalDir,rightDir));//根据向右方向和法线方向得到向上防线
				float3 centerOffs = v.vertex.xyz-center;//计算当前顶点与锚点的偏移量
				//更新模型坐标
				float3 localPos = center+rightDir*centerOffs.x+upDir*centerOffs.y+normalDir*centerOffs.z;
				//模型空间坐标转换到剪裁空间下的坐标
				
				
				//TRANSFER_SHADOW_CASTER_NORMALOFFSET(o);
				o.pos = mul(UNITY_MATRIX_MVP,float4(localPos,1));

				TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
			    fixed4 tex=tex2D(_MainTex,i.uv);
                if(tex.a<0.5){
                    discard;
                }
                SHADOW_CASTER_FRAGMENT(i);
				
			}
			ENDCG
		}
		
	}
	Fallback "VertexLit"
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值