在 Opengl ES 中在 FBO 上调用多个 glReadPixels 和 glDrawArrays

Posted

技术标签:

【中文标题】在 Opengl ES 中在 FBO 上调用多个 glReadPixels 和 glDrawArrays【英文标题】:Calling multiple glReadPixels & glDrawArrays on a FBO, in Opengl ES 【发布时间】:2014-02-17 03:25:58 【问题描述】:

在 OpenGL ES 中,是否可以在 FBO 上一个接一个地多次调用 glReadPixelsglDrawArrays? 我面临的问题是我得到的图像都是乱码。

示例代码:

// Activate Off-Screen FBO
glBindFramebuffer(GL_FRAMEBUFFER, fboHandle);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureHandle);
glViewport(0, 0, 640, 480);

// 1st Render
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(filter_A);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 480, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgb_pixels_A);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glReadPixels(0, 0, 640, 480, GL_RGBA, GL_UNSIGNED_BYTE, pixels_A);

// 2st Render
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(filter_B);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 480, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgb_pixels_B);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glReadPixels(0, 0, 640, 480, GL_RGBA, GL_UNSIGNED_BYTE, pixels_B);

// Back to the screen FB
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glActiveTexture(GL_TEXTURE0);

【问题讨论】:

【参考方案1】:

在使用 glDrawArrays() 渲染和使用 glReadPixels() 读取之间需要调用 eglSwapBuffers()。这是因为大多数 OpenGL ES GPU 执行基于图块的延迟渲染。这篇文章应该会有所帮助:

http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES

【讨论】:

以上是关于在 Opengl ES 中在 FBO 上调用多个 glReadPixels 和 glDrawArrays的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES 学习教程(十四) 帧缓冲区对象(FBO) 实现渲染到纹理(Render To Texture/RTT)

OpenGL ES 无法使 LUMINANCE FBO 在 Android 中工作

Framebuffer FBO渲染到纹理很慢,在Android上使用OpenGL ES 2.0,为啥?

OpenGL ES 2.0 FBO 创建出错并出现未知错误

iOS OpenGL ES Analyzer 列出“不存在的帧缓冲区附件”和“缺少帧缓冲区附件”,但 FBO 工作

OpenGL ES FBO 缩放