关于阴影的一些问题

发布时间 2023-11-30 14:35:38作者: terrificia

通常来讲,在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)