opengl-es - 在 glFramebufferTexture2D() 之后 glReadPixels() 的结果

标签 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 引用的纹理的内容。 Desktop OpenGL 具有用于此目的的 glGetTexImage() 函数,但它在 ES 中不存在。

someRgbaTexture 设置为读取纹理,然后在另一个 FBO 目标中执行屏幕填充纹理四边形,然后回读肯定会成功,但我想避免额外的传递。
< br/> 因此:在调用 glFramebufferTexture2D() 之后帧缓冲区的内容是否等于纹理的内容,或者该调用是否仅意味着任何 future 的渲染操作都将以指定的纹理为目标?
如果是后者:如果我的渲染操作只写一个像素或什么都不写,会发生什么?那么someRgbaTexture中的内容会有什么保证呢?

最佳答案

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

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

No change is made to the state of the texture object

这意味着如果纹理之前有明确定义的内容,它在 glFramebufferTexture2D() 之后仍然有该内容。因为它现在是当前帧缓冲区的颜色缓冲区,所以它的内容将由 glReadPixels() 读取。

关于opengl-es - 在 glFramebufferTexture2D() 之后 glReadPixels() 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14366073/

相关文章:

objective-c - glUseProgram 在 iOS 中不起作用

c++ - 在抛出 'cl::sycl::detail::exception_implementation<(cl::sycl::detail::exception_types)9>' 实例后调用终止

gpgpu - CPU和GPU之间的指令传输

gpu - 使用 Sun Grid Engine (SGE) 调度 GPU 资源

android - framebuffer OES 不完整,android

c++ - glDrawElements 异常

android - 将 android open GL 代码移植到 iPhone

Android OpenGL ES 2.0 屏幕坐标转世界坐标

android - 无法在 OpenGL ES 2.0 for Android 中绘制正方形,但可以绘制三角形

rendering - 解释预乘 alpha 的工作原理