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

时间:2013-02-25 23:52:52

标签: c++ shadow directx-11 deferred-shading

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

1 个答案:

答案 0 :(得分:2)

一个直接的解决方案是使用屏幕空间环境遮挡方法。在那里,您尝试根据邻域的采样来估计遮挡。我所知道的一种方法是SSDO,它直接针对屏幕空间中阴影的创建。可能你会在复杂的场景中得到很多文物。优点是SSDO还增加了一些全局照明效果。

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

  1. 静态闪电:如果您的光源没有移动(建筑物中的灯光......),请计算光照贴图或包含光线的一些额外顶点属性。

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

  3. 一些自己的想法:根据您对灯光的表现(球体/圆盘?),您可以计算灯光的修剪形状。墙后面的像素不会位于新的光量范围内,并且不会以这种方式照亮。如果你不能任意塑造你的光量,那么每个光定义墙壁可能会增加一个或两个平面。对于大多数灯光,这些平面可能是不确定的,只有在墙壁附近的灯光下才会被推到GPU上。在相应灯光的照明过程中,可以检查像素位于哪一侧。