gpt4 book ai didi

python - PyOpenGL - 获取绘制图像的深度图

转载 作者:行者123 更新时间:2023-12-01 09:06:08 62 4
gpt4 key购买 nike

我从特定的角度(使用 View 和投影矩阵)绘制了一个特定的场景。我使用了三角形的 VBO 等等。我可以使用以下方法获取图像的 RGB:

data = glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE)
data = np.frombuffer(data, dtype=np.uint8).reshape(width, height, 3)[::-1]
cv2.imwrite(r"c:\temp\image1.png", data)

但是获取深度图会得到一些奇怪的结果,主要由 255 组成:

data2 = glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE)
data2 = np.frombuffer(data2, dtype=np.uint8).reshape(width, height)[::-1]
cv2.imwrite(r"c:\temp\image2.png", data2)

我尝试替换 GL_UNSIGNED_BYTE -> GL_FLOATuint8 -> float32

但这并没有帮助

最佳答案

深度图初始化为 1.0,如果读取到 GL_UNSIGNED_BYTE 缓冲区,则为 255。注意,深度图的范围是[0.0, 1.0],如果读取到GL_UNSIGNED_BYTE,那么这个范围就会映射到[0, 255]。

在透视投影中,z 坐标不会线性映射到深度缓冲区。深度值快速增加,靠近远平面的几何体将导致深度值达到 255。

如果深度值在 [0.0, 1.0] 范围内,并且您想要计算 View (眼睛)空间 z 坐标,那么您必须将深度值转换为归一化值设备z坐标拳头(z_ndc):

z_ndc = 2.0 * depth - 1.0;

该坐标可以通过以下公式转换为眼空间z坐标(z_eye):

z_eye = 2.0 * n * f / (f + n - z_ndc * (f - n));

其中 n 是近平面,f 是远平面。

请注意,此转换仅适用于透视投影。

在正交投影中,z 坐标线性映射到深度。所以向后转换要简单得多:

z_eye = depth * (f-n) + n; 

另请参阅How to render depth linearly in modern OpenGL with gl_FragCoord.z in fragment shader?

关于python - PyOpenGL - 获取绘制图像的深度图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52036176/

62 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com