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(批处理灯光),为什么会这样,如果我不使用它们会发生什么?