如何渲染到不同的图层,然后将它们与OpenGL结合在一起?

时间:2012-10-10 10:09:58

标签: c++ opengl

我正在渲染多个图层,这些图层无法仅在一个帧缓冲区上呈现,因为修改会影响其下的所有其他图层。

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

我目前正在使用FBO在一个图层中对它们进行屏幕外渲染,但正如我上面所说,当最顶层影响所有底层时,它不会很好地工作。

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

这样做的最快方式是什么?

3 个答案:

答案 0 :(得分:3)

您可以使用MRT(多个渲染目标)。您将需要创建并绑定framebuffer(似乎您已经知道如何操作),然后将几个纹理附加到它上面

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纹理存储的图像。

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分: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