9

编辑:我仍在寻找有关使用 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)
  }
}

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

for each tile {
 render quad (the tile) and compute all lights
}

但我看不出如何在不超过某些 GPU 上片段着色器的指令限制的情况下做到这一点。谁能帮我这个?似乎几乎每个基于 tile 的延迟渲染器都使用计算着色器或 OpenCL(批处理灯光),为什么会这样,如果我不使用这些会发生什么?

4

1 回答 1

4

但我看不出如何在不超过某些 GPU 上片段着色器的指令限制的情况下做到这一点。

这取决于你有多少灯。“指令限制”非常高;在退化的情况下,这通常不是您需要担心的事情。即使 100 多个灯影响一个图块,您的照明计算也不会超过指令限制的可能性相当大。

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

于 2013-04-14T00:44:36.210 回答