c++ - OpenGL - 使用 glReadPixels 读取深度分量返回不正确的值

标签 c++ opengl framebuffer depth

我试图读出只有深度分量的纹理像素,但是 glReadPixels 给了我一个数组,其中每个值 = 1。

纹理/帧缓冲区创建:

GLuint frameBuffer;
glGenFramebuffers(1,&frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER,frameBuffer);

GLuint texture;
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT,width,height,0,GL_DEPTH_COMPONENT,GL_FLOAT,0);
glFramebufferTexture(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,m_depthTexture,0);

从纹理读取:

glBindFramebuffer(GL_FRAMEBUFFER,frameBuffer);
float *depths = new float[width *height];
glReadPixels(0,0,width,height,GL_DEPTH_COMPONENT,GL_FLOAT,&depths[0]);
// glGetError reports no errors, but every value inside 'depths' is 1.
delete[] depths;

我没有将实际渲染包含到纹理中,因为我知道它应该正常工作。 这是我在主屏幕帧缓冲区上绘制深度纹理时的样子:

它肯定不是空的,那为什么它告诉我所有像素的深度都是 1?

最佳答案

由于您使用的是桌面 OpenGL 版本,我建议您使用 glGetTexImage而不是 glReadPixels。

关于c++ - OpenGL - 使用 glReadPixels 读取深度分量返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21139404/

相关文章:

C++ 指向函数的静态指针

具有 ARGB32 的 Linux 帧缓冲区。 Α?帧缓冲区如何支持 Alpha?

c++ - OpenGL - 将帧缓冲区纹理设置为完全透明

c# - 卡在显示器上打开

c++ - 如何欺骗编译器优化内存读取?

c++ - 排队循环中的节点自引用

c++ - 具有雅可比行列式和伪逆的 7 DOF 逆运动学

c - C 中的段错误、核心转储、gdb 输出

linux - 用于 Linux 的 OpenGL 3D 网格提取

rotation - 嵌入式linux framebuffer旋转