4

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

4

1 回答 1

2

一种直接的解决方案是使用屏幕空间环境遮挡方法。在那里,您尝试根据邻域的采样来估计遮挡。我知道的一种方法是SSDO,它直接针对在屏幕空间中创建阴影。可能您最终会在复杂场景中遇到大量伪影。好处是SSDO还增加了一些全局光照效果。

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

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

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

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

于 2013-05-01T09:21:42.323 回答