Shadow产生阴影必需的Pass
发表于2018-04-01
Unity中可以使一个物体向其他物体投射阴影,以及让一个物体接收其他物体的阴影,从而使场景看起来更加真实。Unity的实时渲染中,使用一种Shadow Map技术,这种技术将摄像机放在光源位置,场景中的阴影区域即为摄像机看不到的区域。阴影映射纹理本质上是一张深度图,记录从光源位置出发,能看到的场景中距离距离它最近的表面位置的深度信息。Unity使用一个额外的Pass专门用于更新光源的阴影映射纹理,该Pass为 LightMode标签设置为 ShadowCaster的Pass。当使用屏幕空间阴影映射时,Unity先调用 LightMode为 ShadowCaster的Pass来得到可投射阴影的光源的阴影映射纹理以及摄像机的深度纹理。根据光源的阴影映射纹理和深度纹理得到屏幕空间的阴影图,一个物体若想接收其他物体的阴影,则需要在Shader中对阴影进行采样。阴影图是屏幕空间下的,先对表面坐标从模型空间变换到屏幕空间,再对阴影图进行采样。
Unity中,物体产生阴影有几个条件:
1. 灯光开启阴影
2. shader中存在“LightMode”=“ShadowCaster”的pass,如果没有,在Fallback中存在也可以。
代码如下:
Pass{ Name "ShadowCaster" Tags{"LightMode" = "ShadowCaster"} CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_shadowcaster #include "UnityCG.cginc" struct v2f { V2F_SHADOW_CASTER; }; v2f vert( appdata_base v) { v2f o; TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) return o; } float4 frag(v2f i):SV_Target { SHADOW_CASTER_FRAGMENT(i) } ENDCG }
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引