4

我正在渲染几个图层,这些图层不能只在一个帧缓冲区上渲染,因为修改会影响它下面的所有其他图层。

如何以可以将它们组合成一个最终图层的方式单独渲染这些图层?图层将以透明度渲染,因此在组合它们时,它们将相应地混合到下面的所有图层。

我目前正在使用 FBO 将它们全部呈现在一层中,但正如我上面所说,当最顶层也影响所有底层时,它不会很好地工作。

那么我怎样才能尽可能有效地将两个(或更多?(无论哪种方式更快))FBO(或一些更好的FBO方法?)组合在一起?目前我可以将它们一个一个渲染,放入我的 RAM,然后我自己按像素组合它们,但这似乎是一种缓慢的方法。

最快的方法是什么?

4

3 回答 3

4

使用 2D 纹理数组。数组的每一层都是一个渲染层。

将每一层渲染成自己的颜色附件纹理层(可以随时切换FBO颜色附件),使用glFramebufferTexture3D可以选择目标层。

然后在片段着色器中根据需要组合 2D 阵列纹理的层。

您还可以通过将不同的纹理层绑定到不同的渲染目标来使用多渲染目标。

于 2012-10-10T10:49:03.393 回答
3

您可以使用 MRT(多个渲染目标)。您将需要创建和绑定帧缓冲区(似乎您已经知道该怎么做),然后将几个纹理附加到它上

glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texA, 0 );
glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, texB, 0 );

在这里,我附加了两个纹理(texA& texB,它们是使用 创建的glGenTextures),作为颜色附件编号01. 然后,您只需在着色器中编写颜色,而不是使用gl_FragColor输出变量,而是gl_FragData[0]使用第一个颜色附件和gl_FragData[1]第二个颜色附件。

然后,您可以使用第二遍来组合存储在其中的图像texAtexB纹理。

PS这些是OpenGL 2的函数调用。如果你使用OpenGL 3,函数调用是相似的(只是没有EXT),但是你需要手动为你的着色器指定输出。如有必要,我可以发布解决方案。

于 2012-10-10T10:38:08.470 回答
0


也许我错了,但是您可以创建按级别排序的图层管理。然后,您只需将第一层绘制到最后一层,如果您有正确的混合功能,您就可以实现所需的 alpha 效果……而且,您可以控制所有场景的总 alpha。清除DEPTH BIT BUFFER以独立渲染每一层是很重要的。

这个想法的一些伪代码如下,

Total Alpha = 0.9
For l in layer_list // render layers
    // clear depth bit (important before render every layer)
    glClear(GL_DEPTH_BIT_BUFFER)   

    // render all objects layer of layer 'l' with alpha = layer_alpha * total_alpha
    renderLayer(l, TotalAlpha*l.getAlpha())

End For
于 2013-10-03T22:33:04.997 回答