ShaderLab学习小结(六)接收点光源阴影
  5WVVrgL6K2nc 2023年11月02日 23 0

运行环境: Win10 x64 Unity 5.5.4 在“ShaderLab学习小结(五)接收平行光阴影”中,通过修改代码,让原来的shader可以接收主平行光的阴影。但是没有点光源的阴影。

在原有的pass通道下面再添加一个pass通道,用于接收点光源阴影。 直接将原来的pass复制粘贴成新的pass通道,再进行一些修改即可。

pass {
		tags{ "lightmode" = "forwardadd" }  //1.
		blend one one               //2.
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		#include "lighting.cginc"
		#include "autolight.cginc"
		#pragma multi_compile_fwdadd_fullshadows  //3.
		fixed4 _Spec;
		float _Shin;
		struct v2f {
			float4 pos:POSITION;
			float3 normal:NORMAL;
			float4 vertex:TEXCOORD2;
			SHADOW_COORDS(0)
		};
		v2f vert(appdata_base v)
		{
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
			o.normal = normalize(v.normal);
			o.vertex = v.vertex;
			TRANSFER_SHADOW(o)
				return o;
		}
		fixed4 frag(v2f IN) :COLOR
		{
			float3 wpos = mul(unity_ObjectToWorld, IN.vertex).xyz;
			UNITY_LIGHT_ATTENUATION(atten, IN, wpos)
				//diffuse
				float3 N = UnityObjectToWorldNormal(IN.normal);
				float3 L = normalize(_WorldSpaceLightPos0).xyz;
				float ndotl = saturate(dot(N, L));
				fixed4 col = _LightColor0*ndotl;
				
				//shadow
				col.rgb *= atten;
				return col;
		}
			ENDCG
	}

效果如下图: 图1.

原有平板已成功接收了点光源照射球体产生的阴影。

代码中三处标记有改动

1.

tags{ "lightmode" = "forwardadd" } //1.

原来的pass中是forwardbase,改为forwardadd

2.

在CGPROGRAM前添加一行

blend one one //2.

将前面pass计算的颜色和此pass one one相加,如果不加这一行的话效果如下: 图2.

3.

#pragma multi_compile_fwdadd_fullshadows //3.

原pass中为 fwdbase,现改为fwdadd_fullshadows。同样见Making multiple shader program variants

4.

在新pass中删除高光及点光反射的计算,且最后不再加环境光UNITY_LIGHTMODEL_AMBIENT。

这样就得出了如上 图1的效果。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jo5M4GCiOHdG   2023年11月12日   15   0   0 Unity教程Unity
5WVVrgL6K2nc