如何在“直接渲染到纹理”之后渲染到FBO而不影响纹理

时间:2014-05-03 08:17:23

标签: opengl opengl-es-2.0 fbo glreadpixels

我试图重复使用我以前用于直接渲染到纹理中的FBO。

我想渲染到这个FBO,不影响纹理并使用glReadPixels 抓取像素。

通常情况下,我会渲染任何东西并使用glReadPixels获取像素并且它可以正常工作,但我以前的纹理会受到影响。出于这个原因,我尝试使用glFramebufferTexture2D将纹理与FBO分离,纹理句柄为0.之后,glReadPixels只返回黑屏,为什么?

CODE:

Gdx.gl20.glBindFramebuffer(GL20.GL_FRAMEBUFFER, getFBOHandle());                    
Gdx.gl20.glFramebufferRenderbuffer(GL20.GL_FRAMEBUFFER, GL20.GL_DEPTH_ATTACHMENT, GL20.GL_RENDERBUFFER, getDBOHandle());

//detach texture previously used, if I dont detach, glReadPixels works, but overwrites the texture
Gdx.gl20.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL20.GL_COLOR_ATTACHMENT0, GL20.GL_TEXTURE_2D, 0, 0);  

int status = Gdx.gl20.glCheckFramebufferStatus(GL20.GL_FRAMEBUFFER);
if (status != GL20.GL_FRAMEBUFFER_COMPLETE) System.out.println("FBO ATTACHMENT INCOMPLETE");

Gdx.gl20.glViewport(0, 0, 2048, 1500);


//CLEAR SCREEN USING SPECIFIC COLOR TO SEE WHAT HAS BEEN REDRAWN
Gdx.gl20.glClearColor(0.5f, 1, 1, 1);
Gdx.gl20.glClear( GL20.GL_DEPTH_BUFFER_BIT | GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl20.glFlush();

...

glReadPixels follows

...

我想正确分离前一个纹理,在此FBO中渲染一些内容并抓取像素,然后再次使用FBO直接渲染到纹理中(恢复之前的状态)。

我如何实现这一目标?

  • 由于资源限制,我不想创建另一个FBO
  • 使用Opengl ES2

1 个答案:

答案 0 :(得分:1)

我不确定这是否真的是你想做的但听起来像是: 您想要在没有颜色附件集的情况下渲染到FBO,然后想要回读不存在的图像数据。

http://www.opengl.org/wiki/Framebuffer_Object#Empty_framebuffers

可以渲染到空帧缓冲区,但如果渲染到仅设置了深度缓冲区的FBO,则只能获得有关渲染场景深度的信息。一种解决方案是首先渲染要读回的场景,然后再次覆盖该数据,或者如果使用双缓冲上下文,请使用此场景绘制场景以读回像素并使用进一步渲染覆盖该像素。