接触阴影 是改善场景视觉深度和保真度的有效方法。 因为提供了一个更为准确的阴影近似, 实现其他阴影算法难以达到的波状外形阴影。
接触阴影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中。
这次的光线追踪目的是让阴影不会因为步进而漏掉。