Shadow产生阴影必需的Pass

发表于2018-04-01
评论0 6k浏览
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
        }

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论