基于瓦片剔除的延迟渲染概念问题

9

EDIT: 我仍然在寻找关于使用OpenCL或计算着色器的帮助。我更喜欢继续使用OGL 3.3,而不必处理OGL 4.3和OpenCL 1.2的差劣驱动程序支持,但我无法想出任何不使用其中之一(以匹配光源和瓦片)进行此类着色的方法。是否可以在没有使用GPGPU的情况下实现基于瓦片的剔除?

我在OpenGL 3.3中编写了延迟渲染。目前,我在光通道中不做任何剔除(我只为每个光源渲染一个全屏幕四边形)。这(显然)存在大量重叠绘制(有时达到约100%)。因此,我一直在寻找提高光通道性能的方法。几乎每个人的意见都认为,在屏幕空间瓦片上剔除场景是最好的方法。这是Frostbite 2中使用的方法。我阅读了Andrew Lauritzen在SIGGRAPH 2010中的演示文稿 (http://download-software.intel.com/sites/default/files/m/d/4/1/d/8/lauritzen_deferred_shading_siggraph_2010.pdf),但我不确定自己是否完全理解了这个概念(及为什么它比其他任何东西更好,以及它是否适用于我)。

在演示文稿中,Laurtizen讨论了使用光体积、四边形和瓦片对场景进行剔除的延迟着色。根据他的数据,基于瓦片的延迟渲染器是最快的(远远领先于其他方法)。但我不明白为什么。我猜想这与每个瓦片将所有光源批处理在一起有关。在演示文稿中,它说要读取G缓冲区一次,然后计算光照,但这对我来说毫无意义。在我看来,我会这样实现:

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的片段着色器指令限制内完成此操作。有人能帮助我吗?此外,几乎每个基于瓷砖的延迟渲染器都使用计算着色器或OpenCL(批处理灯光),为什么会这样,如果我不使用它们会发生什么?

1个回答

4
但我不知道如何在某些GPU上不超过片段着色器的指令限制来完成这个操作。
这要取决于你有多少光源。 "指令限制"相当高;通常您不必担心除了退化情况以外的任何事情。即使100+的灯光影响到一个tile,很有可能您的照明计算也不会超过指令限制。
现代GL 3.3硬件可以在片段着色器中运行至少65536个动态指令,并且可能还有更多。对于100个灯光来说,仍然是每个灯光655个指令。即使您需要2000个指令来计算相机空间位置,这仍然留给每个灯光635个指令。即使您直接在GPU上进行Cook-Torrance计算,这也可能足够了。

有趣。曾经我在一个着色器中计算了超过一个光源(7个),在某些显卡上(特别是像GT 540这样的中低端笔记本GPU)似乎超出了指令限制。通过大量的试错,我得出了这个结论,并在我的早期帖子中询问了这个问题。我错了吗? - Spaceman1701
1
事实上,我使用NVidia 8600GT时遇到了同样的问题。我在20个灯光左右达到了极限。@NicolBolas,你所说的是什么样的硬件? - Michael IV
希望我这个周末有时间来实现它。我会看看情况再说。 - Spaceman1701

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接