HDRP-接触阴影ContactShadows

本文深入探讨了接触阴影技术的工作原理及其实现细节,包括在不同光源类型下的处理方式,如平行光、点光源和聚光灯,并介绍了如何利用光线追踪补足传统方法的不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

接触阴影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中。

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

### 创建复杂3D城市环境的渲染 为了创建复杂的3D城市环境,在Unity中可以充分利用高清晰度渲染管线(HDRP)的功能和后处理效果。感言(Reflections)是其中一项重要特性,它能显著提升场景的真实性和视觉冲击力[^1]。 #### 使用HDRP设置基础环境 首先,确保项目配置支持HDRP。这涉及到调整项目的图形设置以启用HDRP并导入必要的包。接着,通过Asset Store获取高质量的城市街区模型作为起点。例如,可以选择一个具有100米×100米区域范围的城市区块资产来构建基本框架[^3]。 ```csharp // 设置HDRenderPipelineAsset实例化对象 var hdRenderPipeline = ScriptableObject.CreateInstance<HDRenderPipeline>(); GraphicsSettings.renderPipelineAsset = hdRenderPipeline; ``` #### 添加光照与反射探针 对于大型户外场景而言,全局照明至关重要。放置多个Light Probes节点于不同位置可以帮助捕捉周围光线的变化情况;而Reflection Probe则用于模拟物体表面反射周围的景象,从而增加真实感。特别是当涉及玻璃幕墙建筑时,良好的反射效果可以使整个城市的外观更加生动逼真。 #### 应用材质与纹理细节 针对建筑物外墙和其他结构部分应用高级别的材质球(Material),这些材质应该具备物理属性如粗糙度、金属质感等参数调节选项。此外,还可以加入动态天气系统影响下的湿滑路面表现形式——即Water Shader,让玩家感受到下雨天街道上的积水反光现象。 #### 实现高效的LOD管理 考虑到性能优化方面的需求,合理安排Level Of Detail (LOD),使得远处的对象采用简化版本显示而不失整体观感的一致性。这对于大规模开放世界的探索类游戏尤为重要,因为这样可以在不影响用户体验的前提下降低GPU负担。 #### 利用合成数据增强真实性 除了依靠实际拍摄的照片外,也可以借助Unity这样的引擎自动生成合成图像资料库来进行训练或测试目的。随着近年来图形硬件的进步以及VR/AR技术的发展,现在完全可以依赖Unity生成极其逼真的三维视图,并且已经被广泛应用于工业界及科研领域内诸多成功的案例之中[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值