HDRP-接触阴影ContactShadows

23 篇文章 2 订阅
22 篇文章 0 订阅

接触阴影 是改善场景视觉深度和保真度的有效方法。 因为提供了一个更为准确的阴影近似, 实现其他阴影算法难以达到的波状外形阴影。

 

接触阴影cpu设置:

在HDRenderPipeline中的Render下执行ExecuteRenderRequest的时候,是跟ue5的延迟渲染的做法一样,把需要的效果都在这里展现了,其中接触阴影RenderContactShadows就在这里执行。

在RenderContactShadows中var parameters = PrepareContactShadowsParameters(hdCamera, firstMipOffsetY);这里定义了这个cs的路径Runtime/Lighting/Shadow/ContactShadows.compute以及其他参数。

然后RenderContactShadows这里有两步,

步进获取阴影:

首先是执行ComputecontactShadowsCS的内核DeferredContactShadow

如果是天空盒或者超过接触阴影的范围则不渲染

 

平行光

如果是平行光执行ComputeContactShadow,在ComputeContactShadow里面会执行ScreenSpaceShadowRayCast,ScreenSpaceShadowRayCast里主要是获取当前的像素点以及光照方向来步进。

ScreenSpaceShadowRayCast里首先要转到裁剪空间,然后在裁剪空间来获取深度信息来获取比较深度时的目标点的粗细比较,如果粗度比较大那么比较大范围都认为是阴影(所以这里容易漏光,后面会通过光线追踪来补上)

 

然后再从裁剪空间转回世界空间进行步进

 

通过CompareDepth来通过刚才我们的深度目标的粗细与步进后的深度比较,如果在一个阈值则认为相交了

 

如果有相交则认为是阴影

 

然后后面的fade会记录阴影的衰减,衰减跟开始位置的距离有关。

 

做了ScreenSpaceShadowRayCast屏幕空间的步进后后面对进入接触阴影和结束接触阴影做一些衰减

 

点光源与聚光灯

如果不是平行光,而是点光源或者聚光灯,则对光源列表中所有光源执行ComputeContactShadow,然后注意这里的globalFade,是从平行光到点光源聚光灯一起计算的全局阴影衰减值。

 

然后无论平行光还是点光源聚光灯都有contactShadowMask,这个是用一位来记录阴影遮罩信息。

uav记录

最终_ContactShadowTextureUAV是记录阴影信息的。这个uav是dx的概念是可读写的纹理。

 

这里的PackContactShadowData是对衰减以及阴影遮蔽拿一个最大值来确定阴影的信息大小

 

光线追踪补光

做完了ComputecontactShadowsCS后如果可以执行光线追踪则会执行Runtime/RenderPipeline/Raytracing/Shaders/Shadows/RayTracingContactShadow.raytrace,执行里面的RayGenContactShadows

里面核心是对平行光以及点光源聚光灯执行RayTraceContactShadow光线追踪,查找光源方向的相交信息

 

 

RayTraceContactShadow里面就是通过RayDesc给到发射点以及方向,最大最小范围等信息执行TraceRay

 

如果没有相交的颜色信息则说明是阴影中,设置为1。最终还是存在_ContactShadowTextureUAV中。

这次的光线追踪目的是让阴影不会因为步进而漏掉。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Unity的最新渲染管线HDRP中,可以通过Volume来控制阴影的最大距离(MaxDistance)。超出该最大距离的物体将不会投射阴影。具体实现是通过VolumeProfile类中的HDShadowSettings来进行设置。在代码中,可以通过获取VolumeProfile并尝试获取HDShadowSettings类的实例来控制阴影的最大距离。在HDShadowSettings类中,可以使用maxShadowDistance字段来设置阴影的最大距离。例如,可以创建一个VolumeMgr类来管理Volume,并通过SetHDShadowDistance方法来设置阴影的最大距离。在方法中,首先通过globalVolumeProfile.TryGet方法获取HDShadowSettings实例,然后使用maxShadowDistance.SetValue方法来设置阴影的最大距离。 另外,在示例场景中,如果勾选了HDRI Sky,就需要为Volume指定一个HDRI Sky,并进行相应的设置。目前默认关联的是Unity自带的DefaultHDRISky高动态图。此外,还可以调整Exposure(曝光度)来影响阴影的显示效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [unity HDRP 代码控制阴影距离](https://blog.csdn.net/weixin_44542069/article/details/122976134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Unity HDRP示例场景解析](https://blog.csdn.net/qq_40120946/article/details/121592674)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值