在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)这个是可能的吗?
发布于 2011-10-26 01:02:28
不能一次渲染到多个帧缓冲区。通过在片段着色器中输出多个颜色,可以使用MRT渲染到属于同一FBO的多个渲染目标(纹理/渲染器),但不能渲染到多个FBO中,如屏幕外FBO和默认帧缓冲区。但如果我没记错的话,ES目前还不支持MRT。
但在您的情况下,仍然不需要渲染场景两次。如果你需要一个离屏渲染缓冲区,为什么不使用一个纹理而不是一个渲染缓冲区来保存离屏数据(不应该有什么不同)。这样,您只需将场景渲染到屏幕外缓冲区(纹理)中一次,然后通过使用简单的穿透片段着色器绘制一个简单的纹理四边形,将此纹理显示到屏幕帧缓冲区。
然而,在OpenGL ES中,如果你使用渲染缓冲区或纹理来保存屏幕外的数据,这可能会有所不同,因为ES没有glGetTexImage。因此,如果您需要将屏幕外数据复制到CPU,您将无法绕过glReadPixels,因此需要一个renderbuffer。但是在这种情况下,您仍然不需要渲染场景两次。你只需要引入另一个附加了纹理的FBO。因此,使用此FBO将场景渲染到纹理中一次,然后将此纹理渲染到偏移FBO和屏幕帧缓冲区中。这可能仍然比绘制两次整个场景更快,尽管只有求值才能告诉您。
但是,如果您需要将数据复制到CPU进行处理,您也可以直接从屏幕帧缓冲区复制数据,而不需要屏幕外的FBO。如果你只需要屏幕外的数据用于基于GPU的处理,那么纹理无论如何都比渲染缓冲区更好。因此,如果你真的需要一个额外的屏幕外缓冲区,如果它只包含与屏幕帧缓冲区相同的数据,这可能是有用的。这可能会使整个问题过时。
https://stackoverflow.com/questions/7892811
复制相似问题