glFramebufferTexture2D()之后的glReadPixels()的结果

时间:2013-01-16 19:19:47

标签: opengl-es opengl-es-2.0 gpgpu

我在代码中成功使用FBO作为渲染目标。然而,我不清楚当我这样做时可以得到什么结果:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                       GL_TEXTURE_2D, someRgbaTexture, 0);
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, *someRgbaBuffer);

在OpenGL ES 2.0中(假设FBO为GL_FRAMEBUFFER_COMPLETE)。

我的目标是获取someRgbaTexture引用的纹理的内容。桌面OpenGL具有glGetTexImage()功能,但在ES中不存在。

someRgbaTexture设置为读取纹理,然后将屏幕填充纹理四边形设置到另一个FBO目标中,然后回读肯定会做到这一点,但我想避免额外的传递。

因此:在调用glFramebufferTexture2D()之后,帧缓冲区的内容是否等于纹理的内容,或者该调用是否意味着任何将来的渲染操作都将以指定的纹理为目标?
如果是后者:如果我的渲染操作只写一个像素或什么都没有,会发生什么?那么someRgbaTexture中的内容会有什么保证?

1 个答案:

答案 0 :(得分:2)

这看起来完全合法,并且应该根据glReadPixels()为您提供纹理的内容。

在ES 2.0规范的第114页上,在glFramebufferTexture2D()的说明中,说明包括:

  

未对纹理对象的状态进行更改

这意味着如果纹理以前有一个定义良好的内容,它仍然具有glFramebufferTexture2D()之后的内容。由于它现在是当前帧缓冲区的颜色缓冲区,因此其内容将由glReadPixels()读取。