在OpenGL ES中绑定多个缓冲区

时间:2011-10-25 16:49:23

标签: ios opengl-es framebuffer

可以在OpenGL ES中绑定多个帧缓冲区和渲染缓冲区吗?我正在渲染到屏幕外的帧缓冲区/渲染缓冲区,并且更喜欢使用我现有的渲染代码。

以下是我目前正在做的事情:

// create/bind framebuffer and renderbuffer (for screen display)

// render all content

// create/bind framebuffer2 and renderbuffer2 (for off-screen rendering)

// render all content again (would like to skip this)

这是我想做的事情:

// create/bind framebuffer and renderbuffer (for screen display)

// create/bind framebuffer2 and renderbuffer2 (for off-screen rendering)

// render all content (only once)

这可能吗?

1 个答案:

答案 0 :(得分:3)

您无法一次渲染到多个帧缓冲区。您可以使用MRT通过在片段着色器中放置多种颜色来渲染属于同一FBO的多个渲染目标(纹理/渲染缓冲区),但不能使用多个FBO,如屏幕外FBO和默认帧缓冲区。但是如果我得到正确的通知,无论如何,ES目前都不支持MRT。

但在你的情况下,你仍然不需要渲染场景两次。如果你需要在屏幕外渲染缓冲区中,为什么不用纹理而不是渲染缓冲来保存屏幕外数据(不应该有所作为)。这样,您只需将场景渲染一次到屏幕外缓冲区(纹理),然后通过使用简单的直通片段着色器绘制一个简单的纹理四边形,将此纹理显示到屏幕帧缓冲区。

但是,在OpenGL ES中,如果使用渲染缓冲区或纹理来保存屏幕外数据,则可能会有所不同,因为ES没有glGetTexImage。因此,如果您需要将屏幕外数据复制到CPU,您将无法绕过glReadPixels因此需要渲染缓冲区。但在这种情况下,您仍然不需要渲染场景两次。你只需要引入另一个附有纹理的FBO。因此,您使用此FBO将场景渲染一次到纹理中,然后将此纹理渲染到offsrceen FBO和屏幕帧缓冲区中。这可能比绘制整个场景两次更快,但只有评估可以告诉你。

但是如果你需要将数据复制到CPU进行处理,你也可以直接从屏幕帧缓冲区复制它,而不需要屏幕外的FBO。如果您只需要基于GPU的处理的屏幕外数据,那么纹理总是比渲染缓冲区更好。因此,如果它实际上需要一个额外的屏幕外缓冲区,如果它只包含与屏幕帧缓冲区相同的数据,那么它可能是有用的。这可能会导致整个问题过时。