Opengl es OpenGl ES:使用多个FBO

Opengl es OpenGl ES:使用多个FBO,opengl-es,Opengl Es,我需要有任意数量的过程,其中每个过程渲染到某种缓冲区,然后作为下一个过程的输入纹理使用 目前,每个缓冲区都由一个FBO实现,该FBO将一个纹理附加到COLOR0。首先,我用 然后,每当我需要渲染到缓冲区时,我调用 glBindFramebuffer(GL_FRAMEBUFFER, fboIds[0]); 每当我需要将缓冲区的内容设置为下一个过程的输入时,我都会这样做 glBindTexture(GL_TEXTURE_2D, texIds[0]); 一切正常 问题是,我在许多资料中读到Bind

我需要有任意数量的过程,其中每个过程渲染到某种缓冲区,然后作为下一个过程的输入纹理使用

目前,每个缓冲区都由一个FBO实现,该FBO将一个纹理附加到COLOR0。首先,我用

然后,每当我需要渲染到缓冲区时,我调用

glBindFramebuffer(GL_FRAMEBUFFER, fboIds[0]);
每当我需要将缓冲区的内容设置为下一个过程的输入时,我都会这样做

glBindTexture(GL_TEXTURE_2D, texIds[0]);
一切正常

问题是,我在许多资料中读到BindFramebuffer调用非常慢(刷新整个管道),特别是在我使用的OpenGL ES目标上。例如,安松浩(SongHo Ahn)明确表示

“(…)切换帧缓冲区可附加的图像比 在FBO之间切换。”

()

因此,我想切换到只有1个帧缓冲区和许多纹理的设计;每次我需要渲染到缓冲区时,我只会将给定的纹理附加到唯一帧缓冲区的COLOR0

你认为这是个好主意吗?或者,这里最好采用完全不同的设计——渲染缓冲垫呢

根据(第65页),您不应交换单个FBO上的附件:

“不要创建一个FBO,然后交换其上的附件。这 导致在驱动程序中进行大量验证,从而导致性能不佳 表现。”

这是因为当您将新纹理附加到FBO的颜色附件时,OpenGL驱动程序必须检查附件是否正确以及FBO是否完整,如果经常这样做,这可能会非常昂贵

还可以一次渲染多个颜色附件,但这仅在OpenGL ES 3.0+中可用

但是一般来说,你的问题的答案是否定的。你应该坚持使用多个FBOS,而不是改变它的附件。

< P>(与MarGenDo的英伟达介绍)(还有一个矛盾),这里有一个链接,它似乎与(部分)相反:

每次创建1个FBO并将纹理绑定到它是否更好 需要渲染到纹理吗?FBO本身不会占用太多内存。 它是一个状态向量对象。在性能方面,每次 绑定时,驱动程序需要验证耗费CPU时间的状态。 从逻辑上讲,每个渲染到纹理最好有1个FBO (RTT)。然而,有人发现,如果你的车 纹理大小相同,使用1个FBO。如果你有10个 64x64的纹理和512x64的10个纹理构成2个FBO。 每组一名FBO


Leszek的评论必须结合上下文来完成当前接受的答案

如果使用的是 使用3.0+,可以附加多个纹理/渲染缓冲区,并有效地使用draw_buffer_附件以最小的状态开销进行渲染。FBO或GL_颜色_缓冲区_附件根本不需要更改

glBindTexture(GL_TEXTURE_2D, texIds[0]);