本文共 1861 字,大约阅读时间需要 6 分钟。
运行环境:Win10 x64Unity 5.5.4
在“”中,通过修改代码,让原来的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.原有平板已成功接收了点光源照射球体产生的阴影。
代码中三处标记有改动
tags{ "lightmode" = "forwardadd" } //1.
原来的pass中是forwardbase,改为forwardadd
在CGPROGRAM前添加一行
blend one one //2.
将前面pass计算的颜色和此pass one one相加,如果不加这一行的话效果如下:
图2.#pragma multi_compile_fwdadd_fullshadows //3.
原pass中为 fwdbase,现改为fwdadd_fullshadows。同样见
在新pass中删除高光及点光反射的计算,且最后不再加环境光UNITY_LIGHTMODEL_AMBIENT。
这样就得出了如上 图1的效果。
转载于:https://blog.51cto.com/shuxiayeshou/2065532