首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenGL ES中绑定多个缓冲区

在OpenGL ES中绑定多个缓冲区
EN

Stack Overflow用户
提问于 2011-10-26 00:49:23
回答 1查看 2.7K关注 0票数 3

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

这是我目前正在做的事情:

代码语言:javascript
复制
// 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)

这是我想要做的:

代码语言:javascript
复制
// create/bind framebuffer and renderbuffer (for screen display)

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

// render all content (only once)

这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的处理,那么纹理无论如何都比渲染缓冲区更好。因此,如果你真的需要一个额外的屏幕外缓冲区,如果它只包含与屏幕帧缓冲区相同的数据,这可能是有用的。这可能会使整个问题过时。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7892811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档