让物体投射阴影

作者:追风剑情 发布于:2017-11-10 20:24 分类:Shader

一、新建场景

55.png


3333.png


Directional Light开启阴影

2222.png

Cube和Plane开启阴影

11111.png

这里有个有趣的现象,右侧的Plane1如果背面朝向Cube是看不到阴影的

66666.png

选择Cast Shadows: Two Sided

444.png

3333.png

原因:在默认情况下,我们在计算光源的阴影映射纹理时会剔除掉物体的背面,如果将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也能显示出阴影。

标签: Shader

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号