关于SHADOWS_SCREEN

本文详细介绍了Unity中SHADOWS_SCREEN的概念,它是屏幕空间阴影的表示。文章通过分析源码,揭示了SHADOWS_SCREEN在主灯影衰减和实时阴影中的作用,以及在开启屏幕空间阴影后的渲染流程,包括绘制ShadowMap、CameraDepthTexture、生成屏幕空间阴影贴图和渲染场景四个步骤。此外,还讨论了屏幕空间阴影在移动设备上的性能考量和优化。
摘要由CSDN通过智能技术生成

关于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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值