可视化深度缓冲区
Posted
技术标签:
【中文标题】可视化深度缓冲区【英文标题】:Visualize the depth buffer 【发布时间】:2010-04-30 16:24:40 【问题描述】:我正在尝试以进行调试,方法是在按下键时将其绘制在实际渲染之上。它大部分工作正常,但生成的图像似乎被放大了。(不仅仅是原始图像,灰度奇怪)为什么它与颜色缓冲区的大小不同?
这就是我正在使用的视图深度缓冲区:
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;
【问题讨论】:
【参考方案1】:我不确定这是否是您的实际错误,但我可以建议您检查一些事项。如果您真的提供了放大的屏幕截图,那就太好了。
首先,确保投影/模型视图矩阵与您的渲染完全相同。我看不出它会如何影响它,但值得研究一下。
其次,spec 指定 glPixelStore、glPixelTransfer 和 glPixelMap 会影响结果,您需要确保这些设置正确。
如果你最终得到这个工作,请分享哪里出了问题 - 这似乎是一个有趣的问题。 :)
【讨论】:
【参考方案2】:该代码应该可以工作。你有什么机会打电话给glPixelZoom吗?值得重置它以检查您实际上不是在要求缩放。
【讨论】:
【参考方案3】:要检查的另一件事是您的光栅位置是否正确。请参见 glRasterPos。 发布的代码应该可以工作,但我可以看到其他地方的状态是如何搞砸的(你确实在可视化深度之前画了一些东西......) 也就是说,您可能处于未经过良好测试的 gl 驱动程序区域,因为它不寻常。 你接下来应该做什么: - 使用不同的供应商进行测试 (ati/nv..) - 将读取的数据写入文件以查看绘图或读取是否按预期工作
【讨论】:
【参考方案4】:模型和投影矩阵对此没有影响。
也许尝试使用 glRasterPos 或 glWindowPos 将绘制位置设置为 0,0。 显然还有 glPixelZoom。
【讨论】:
【参考方案5】:1) 将原始深度缓冲区数据转储到文件中。
2) 使用IrfanView 打开它(打开为 -> RAW 文件)
3) 根据您的深度缓冲区 BPP (8bits, 16bits, ...) 调整参数(宽度、高度)和像素格式。确保选中灰度。
4) 喝杯啤酒。
【讨论】:
以上是关于可视化深度缓冲区的主要内容,如果未能解决你的问题,请参考以下文章