3

我成功地在我的代码中使用 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然后?

4

1 回答 1

2

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

在 ES 2.0 规范的第 114 页,在 的解释中glFramebufferTexture2D(),描述包括:

纹理对象的状态没有改变

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

于 2014-12-21T07:54:17.020 回答