基于平铺的剔除概念问题的延迟渲染

Spa*_*701 8 opengl lighting culling deferred-rendering deferred-shading

编辑:我仍在寻找有关使用OpenCL或计算着色器的一些帮助.我更喜欢继续使用OGL 3.3并且不必处理对OGL 4.3和OpenCL 1.2的坏驱动程序支持,但我无论如何都不能想到这种类型的着色而不使用其中一个(用于匹配灯和砖).是否可以在不使用GPGPU的情况下实现基于区块的剔除?

我在OpenGL 3.3中编写了一个延迟渲染.现在我没有对光通道进行任何剔除(我只为每个灯光渲染一个全屏四边形).这(显然)有很多透支.(有时它是~100%).因此,我一直在研究在光通过期间提高性能的方法.似乎(几乎)每个人的意见中最好的方法是使用屏幕空间图块来剔除场景.这是Frostbite 2中使用的方法.我在SIGGRAPH 2010期间阅读了Andrew Lauritzen的演示文稿(http://download-software.intel.com/sites/default/files/m/d/4/1/d/8 /lauritzen_deferred_shading_siggraph_2010.pdf),我不确定我是否完全理解这个概念.(为此,为什么它比其他任何东西都好,如果它对我更好)

在演示中,Laurtizen通过轻量,四边形和瓷砖进行延迟着色,以剔除场景.根据他的数据,基于区块的延迟渲染器是最快的(到目前为止).我不明白为什么会这样.我猜这与事实有关,即每个瓷砖都将所有灯光一起分批.在演示文稿中,它说要读取G-Buffer一次然后计算光照,但这对我来说没有意义.在我看来,我会这样实现:

for each tile {
  for each light effecting the tile {
    render quad (the tile) and compute lighting
    blend with previous tiles (GL_ONE, GL_ONE)
  }
}
Run Code Online (Sandbox Code Playgroud)

这仍然需要对G-Buffer进行大量采样.我认为这样做会产生与为每个灯光渲染四边形屏幕相同(如果不是更差)的性能.从它的措辞来看,似乎这就是发生的事情:

for each tile {
 render quad (the tile) and compute all lights
}
Run Code Online (Sandbox Code Playgroud)

但我没有看到如何在不超过某些GPU上片段着色器的指令限制的情况下执行此操作.谁能帮我这个?看起来几乎每个基于tile的延迟渲染器都使用计算着色器或OpenCL(批量灯),为什么会这样,如果我没有使用它们会发生什么?

Nic*_*las 4

但我不知道如何在不超出某些 GPU 上片段着色器的指令限制的情况下执行此操作。

这取决于你有多少灯。“指令限制”相当高;除了退化情况之外,通常不需要担心。即使 100 多个灯光影响一个图块,您的灯光计算也很可能不会超出指令限制。

现代 GL 3.3 硬件可以在片段着色器中运行至少 65536 条动态指令,甚至可能更多。对于 100 个灯,每个灯仍然有 655 条指令。即使您使用 2000 条指令来计算相机空间位置,每个灯光仍然剩下 635 条指令。即使您直接在 GPU 中执行 Cook-Torrance,这可能仍然足够了。