glFramebufferTexture2D()之后glReadPixels()的结果

3

我在代码中成功地将FBOs用作渲染目标。然而,当我这样做时,我无法确定可以期望什么结果:

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中的内容保证是什么?

FBO 不应该像这样使用。请参阅此页面 - Fabien R
@Fabien R,请在您的评论中添加更详细的解释,并描述在songho上可以找到什么来回答上述问题。 - rsp1984
在描述FBO的页面上,您将找到示例代码。它会给您关于FBO如何工作的提示。 - Fabien R
只是为了明确:我在我的代码中成功地使用FBO作为渲染目标(就像songho所解释的那样)。然而,这并不是我的问题所在。 - rsp1984
我之前误解了你的意思,因为在调用glFramebufferTexture2D()之后调用glReadPixels()有点令人惊讶。你绑定缓冲区在哪里?能展示一下完整的渲染序列吗? - Fabien R
所包含的代码仅为一部分,为了简单起见省略了与问题无直接关系的所有内容。 - rsp1984
1个回答

2
这看起来完全合法,应该会将纹理的内容作为glReadPixels()的结果返回。
在ES 2.0规范的第114页中,在glFramebufferTexture2D()的说明中,描述如下:

不会对纹理对象的状态进行任何更改

这意味着如果纹理先前具有明确定义的内容,则在glFramebufferTexture2D()之后仍具有该内容。并且由于它现在是当前帧缓冲区的颜色缓冲区,因此其内容将被glReadPixels()读取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接