【发布时间】:2013-09-12 13:14:38
【问题描述】:
我正在尝试将深度缓冲区从 OpenGL 提取到 CPU 上的数组中。
我在下面的代码(稍微修改为原始代码是一个旨在提取渲染图像并成功提取的现有组件)“有效”,但总是返回正好 0。
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_PIXEL_PACK_BUFFER, buffer);
int size = w*h*sizeof(GLubyte);
glBufferData(GL_PIXEL_PACK_BUFFER, size, NULL, GL_STREAM_READ);
glReadPixels(0, 0, w, h, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
GLubyte* depth = (GLubyte*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
return depth;
我在glBindBuffer 调用之后尝试了glReadBuffer(GL_DEPTH),以及使用GL_DEPTH_COMPONENT24(每个资源都推荐但似乎没有人解释原因),但两者都会产生无效的枚举错误。 GL_DEPTH_TEST 已启用,并且没有生成错误。
【问题讨论】:
-
第一件事让我跳出来,这可能是因为你正在将深度缓冲区作为一个字节读取,这应该导致所有字节为 0 或 1;如果您的场景中没有任何内容处于饱和深度值,您可能只会看到零,除非您将其读取为 GL_FLOAT。只是一个想法。
-
GL_FLOAT 产生了类似的结果,但一切都是白色的。更改为使用 GL_INT (并将深度值右移 8,我在另一个源中读取是必要的,否则图像完全是灰色的),它正在提取深度缓冲区,但有些东西搞砸了。该图像显示了四个子图像,这些子图像显然是深度图,每个子图像的大小为 1/4(因此底部的 3/4 为纯灰色),但有变化,几乎就像字节以某种方式交错一样。
-
glReadBuffer()不接受GL_DEPTH。