之前学习CRomputer罗老师的这篇文章,文章写得很详细,但在实测中发现改代码并没有接受阴影,只有投影,排查发现在
#pragma multi_compile _MAIN_LIGHT_SHADOWS
#pragma multi_compile _MAIN_LIGHT_SHADOWS_CASCADE
#pragma multi_compile _SHADOWS_SOFT
这段代码中少了一个“_”,修改后应该是这样
//接受物体投射出来的阴影
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
//软阴影
#pragma multi_compile _ _SHADOWS_SOFT
三个都加上“_”后接受阴影才会显示正常;
完整代码我就不复制了,直接复制罗老师代码修改下划线就行;
我这里放出简化过后的代码,Mix了fog,方便使用:
Shader "CeShiShadow"
{
Properties
{
_Color ("Color", Color)=(1,1,1,1)
}
SubShader
{
Tags { "RenderPipeline"="UniversalPipeline" "RenderType"="Opaque" "Queue" = "Geometry"}
AlphaToMask Off
LOD 100
Pass
{
Tags{"LightMode"="UniversalForward"}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
//接受物体投射出来的阴影
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
//软阴影
#pragma multi_compile _ _SHADOWS_SOFT
struct appdata
{
float4 vertex : POSITION;
float2 uv0 : TEXCOORD0;
float3 normal : NORMAL;
float4 tangent: TANGENT;
};
struct v2f
{
float4 uv : TEXCOORD0;
float3 worldPos : TEXCOORD1;
half fogCoord : TEXCOORD5; //单个fog可以写half
float4 vertex : SV_POSITION;
};
CBUFFER_START(UnityPerMaterial)
float4 _Color,_ShadowMainColor;
CBUFFER_END
v2f vert (appdata v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex.xyz);
o.worldPos = TransformObjectToWorld(v.vertex.xyz);
o.fogCoord = ComputeFogFactor(o.vertex.z);
return o;
}
half4 frag (v2f i) : SV_Target
{
float4 SHADOW_COORDS = TransformWorldToShadowCoord(i.worldPos);
Light light = GetMainLight(SHADOW_COORDS);
half shadow_coord = light.shadowAttenuation;
//half3 ambient = _GlossyEnvironmentColor.rgb;
half3 finalCol =_Color.rgb;
finalCol.rgb = MixFog(finalCol.rgb,i.fogCoord);
finalCol.rgb = lerp(_ShadowMainColor.rgb * finalCol.rgb, finalCol.rgb, shadow_coord);
return float4(finalCol,1);
}
ENDHLSL
}
UsePass "Universal Render Pipeline/Lit/ShadowCaster"
UsePass "Universal Render Pipeline/Lit/DepthOnly" //深度绘制Pass防止消失
}
FallBack "Packages/com.unity.render-pipelines.universal/FallbackError"
}
另外补充一下投射阴影也不一定非要使用UsePass "Universal Render Pipeline/Lit/ShadowCaster"
有时候需要单独处理阴影做偏移的时候,也可以单独写一个阴影Pass;