如何在延迟着色系统中实现光遮挡

How to implement light occlusion in deferred shading system?

本文关键字:实现 遮挡 系统 延迟      更新时间:2023-10-16

我正在实现一个延迟着色系统,该系统使用计算着色器(在DirectX 11中(来剔除瓦片中的灯光,因此我可以以稳定的帧速率获得数千个灯光。当我必须确定灯光是否被场景几何体遮挡时,问题就来了。我是说我的聚光灯穿过墙壁和桥梁。我在主光源(太阳(的视点上有一个阴影贴图,但为场景中的每个点光源生成阴影贴图需要生成一千个立方体,这是不可能的。那么这个问题通常是如何处理的呢?像《死亡空间3》和《战地3》这样的游戏在场景中有很多灯光,但它们不会通过固体物体流血。

一个直接的解决方案是使用屏幕空间环境遮挡方法。在那里,您可以尝试基于邻域的采样来估计遮挡。我知道的一种方法是SSDO,它直接针对屏幕空间中的阴影创建。也许你最终会在复杂的场景中看到很多人工制品。优点是SSDO还添加了一些全局照明效果。

我认为大多数游戏/引擎都试图通过预处理步骤来克服这些问题。

  1. 静态照明:如果光源不移动(建筑物中的灯光…(,则计算光照贴图或包含灯光的一些额外顶点属性。

  2. 调整灯光:只需调整衰减距离、强度或位置,直到没有明显的出血。

  3. 一些自己的想法:根据你对光的表示(球体/圆盘?(,你可以计算出光的修剪形状。墙后的像素不会位于新的光量内,也不会以这种方式点亮。如果你不能任意塑造你的光量,你可能可以为每个定义灯光的墙添加一到两个平面。对于大多数灯光,这些平面可以是未定义的,并且仅对于墙附近的灯光,可以推送到GPU。然后,可以在各个光的发光过程中检查像素位于哪一侧。