我有一个OpenGL纹理,并希望能够读回单个像素的值,所以我可以在屏幕上显示它.如果纹理是常规的旧RGB纹理等,这是没有问题的:我采用一个空的Framebuffer对象,我已经躺在周围,将纹理附加到帧缓冲区上的COLOR0并调用:
glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, &c);
Run Code Online (Sandbox Code Playgroud)
其中c基本上是浮子[4].
但是,当它是深度纹理时,我必须沿着不同的代码路径,设置DEPTH附件而不是COLOR0,并调用:
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &c);
Run Code Online (Sandbox Code Playgroud)
其中c是浮点数.这在运行NVIDIA GeForce 580的Windows 7计算机上运行良好,但在我的旧版2008 MacBook Pro上出错.具体来说,在将深度纹理附加到帧缓冲区后,如果我调用glCheckFrameBufferStatus(GL_READ_BUFFER),我会得到GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER.
搜索OpenGL的文档后,我发现这条线,这似乎意味着,OpenGL的不不支持从帧缓冲区的深度分量阅读,如果没有附色:
GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER is returned if GL_READ_BUFFER is not GL_NONE
and the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE for the color
attachment point named by GL_READ_BUFFER.
Run Code Online (Sandbox Code Playgroud)
果然,如果我创建一个临时颜色纹理并将其绑定到COLOR0,当我从深度纹理读取像素时不会发生错误.
现在通过这段代码每次创建一个临时纹理(编辑:甚至一次并将GPU内存绑定)都很烦人且可能很慢,所以我想知道是否有人知道从深度读取单个像素的替代方法质地?(当然,如果没有更好的方法,我会保留一个纹理,以便在需要时调整大小,并仅使用临时颜色附件,但这似乎相当迂回).
答案包含在您的错误消息中:
如果GL_READ_BUFFER不是GL_NONE
那样做; 将读缓冲区设置为GL_NONE.随着glReadBuffer.像这样:
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); //where fbo is your FBO.
glReadBuffer(GL_NONE);
Run Code Online (Sandbox Code Playgroud)
这样,FBO就完全正确,即使它只有深度纹理.
| 归档时间: |
|
| 查看次数: |
1703 次 |
| 最近记录: |