一、新建场景
Directional Light开启阴影
Cube和Plane开启阴影
这里有个有趣的现象,右侧的Plane1如果背面朝向Cube是看不到阴影的
选择Cast Shadows: Two Sided
原因:在默认情况下,我们在计算光源的阴影映射纹理时会剔除掉物体的背面,如果将Cast Shadows设置为Two Sided,则所有面都会计算阴影信息。
Unity内置的阴影Pass在内置的着色器里可以找到:
builtin-shaders-xxx->DefaultResourcesExtra->Normal-VertexLit.shader
// Pass to render object as a shadow caster
Pass {
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#pragma multi_compile_shadowcaster
#pragma multi_compile_instancing // allow instanced shadow pass for most of the shaders
#include "UnityCG.cginc"
struct v2f {
V2F_SHADOW_CASTER;
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert( appdata_base v )
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
return o;
}
float4 frag( v2f i ) : SV_Target
{
SHADOW_CASTER_FRAGMENT(i)
}
ENDCG
}
上面的代码中的宏和指令实际上就是为了把深度信息写入渲染目标中。在Unity5中,这个Pass的渲染目标可以是光源的阴影映射纹理,或是摄像机的深度纹理。
Unity会通过Fallback一层一层往上找,如果能找到ShadowCaster也能显示出阴影。