关于SHADOWS_SCREEN
在读Unity内置shader源码的过程中,我们经常看到这样的代码:
#if SHADOWS_SCREEN
// xxx
#else
// xxx
#endif
那么,上面代码中的 SHADOWS_SCREEN 代表的是什么呢?
通过仔细阅读代码发现,SHADOWS_SCREEN 代表的是 屏幕空间阴影。
以 URP 管线 主灯的实时阴影 为例,我们看一下相关代码:
主灯影衰减的入口
Light GetMainLight(float4 shadowCoord)
{
Light light = GetMainLight();
light.shadowAttenuation = MainLightRealtimeShadow(shadowCoord);
return light;
}
主灯实时阴影的主要函数
half MainLightRealtimeShadow(float4 shadowCoord)
{
#if !defined(_MAIN_LIGHT_SHADOWS) || defined(_RECEIVE_SHADOWS_OFF)
return 1.0h;
#endif
#if SHADOWS_SCREEN
return SampleScreenSpaceShadowmap(shadowCoord);
#else
ShadowSamplingData shadowSamplingData = GetMainLightShadowSamplingData();
half4 shadowParams = GetMainLightShadowParams();
return SampleShadowmap(TEXTURE2D_ARGS(_MainLightShadowmapTexture, sampler_MainLightShadowmapTexture), shadowCoord, shadowSamplingData, shadowParams, false);
#endif
}
这里我们看到,如果定义了 SHADOWS_SCREEN,那么会走 屏幕空间阴影 的采样流程,否则,走 ShadowMap 的采样流程。
SHADOWS_SCREEN的定义
那么 SHADOWS_SCREEN 在什么情况下会被定义呢?我们继续看代码:
#ifndef SHADOWS_SCREEN
#if defined(_MAIN_LIGHT_SHADOWS) && de