通常来讲,在shader中添加阴影最普遍的方式就是
①添加tag{"LightMode"="ForwardBase"};
②添加#include "Autolight.cginc",#include "Lighting.cginc",#pragma multi_compile_fwdbase_fullshadows
③结构体v2f中添加LIGHTING_COORDS(X,X+1)(使用了X-1个TEXCOORD)
④顶点着色器中添加TRANSFER_VERTEX_TO_FRAGMENT(o)
⑤片段着色器中添加float shadow = LIGHT_ATTENUATION(i);
⑥添加FallBack“某个内置着色器"
但在某些情况下,我们的着色器需要改变顶点信息,但同时又要保留阴影,这个时候就需要
①添加第二个pass
②我们在第一个pass里改变了顶点信息,比如说v.vertex += 10;
那么第二个pass的顶点信息也需要同第一个pass一样进行相同的操作,这里有两种方法
- 先写TRANSFER_SHADOW_CASTER_NORMALOFFSET(o),再写最终的裁剪顶点坐标o.pos = UnityObjectToClipPos(v.vertex);
- 将本地顶点坐标整理写好,再写TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
这两种方式产生的结果也会有所不同:
参考资料:vert/frag shader with shadows on offset vertices - Unity Forum
TRANSFER_VERTEX_TO_FRAGMENT(o)