可视化深度缓冲区

时间:2010-04-30 16:24:41

标签: c++ opengl

我正在尝试将深度缓冲区可视化以进行调试,方法是在按下某个键时将其绘制在实际渲染的顶部。它主要是工作,但结果图像似乎放大了。(它不仅仅是原始图像,在一个奇怪的灰度级)为什么它与颜色缓冲区的大小不同?

这就是我使用深度缓冲区的视图:

void get_gl_size(int &width, int &height)
{
    int iv[4];
    glGetIntegerv(GL_VIEWPORT, iv);
    width = iv[2];
    height = iv[3];
}

void visualize_depth_buffer()
{
    int width, height;

    get_gl_size(width, height);

    float *data = new float[width * height];

    glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, data);
    glDrawPixels(width, height, GL_LUMINANCE, GL_FLOAT, data);

    delete [] data;
}

5 个答案:

答案 0 :(得分:1)

我不确定这是否是您的实际错误,但我建议您检查一些事情。如果你真的提供了它放大的确切截图,那就太好了。

首先,确保投影/模型视图矩阵与渲染完全相同。我看不出它会对它产生什么影响,但这是值得研究的。

其次,spec指定glPixelStore,glPixelTransfer和glPixelMap可以影响结果,你需要确保正确设置它们。

如果你最终得到这个工作,请分享出错的地方 - 这似乎是一个有趣的问题。 :)

答案 1 :(得分:0)

该代码应该有效。你是否有机会打电话给glPixelZoom?值得重新设置以检查您是否真的要求缩放。

答案 2 :(得分:0)

要检查的另一件事是你的光栅位置是否正确。看glRasterPos。 发布的代码应该可以工作,但是我可以看到状态是如何在其他地方被搞砸的(在可视化深度之前你确实画了一些东西......) 那就是说,你可能处于一个没有经过良好测试的gl驱动器领域,因为它很不寻常。 你应该做什么下一个: - 与其他供应商(ati / nv ..)一起测试 - 将读取的数据写入文件,以查看绘图或读取是否按预期工作

答案 3 :(得分:0)

模型和投影矩阵对此没有影响。

也许尝试使用glRasterPos或glWindowPos将绘制位置设置为0,0。 显然还有glPixelZoom。

答案 4 :(得分:-4)

1)将原始深度缓冲区数据转储到文件中。

2)使用IrfanView(打开为 - > RAW文件)

打开它

3)根据深度缓冲区BPP(8位,16位,...)调整参数(宽度,高度)和像素格式。确保选中了灰度。

4)喝啤酒。