gpt4 book ai didi

opengl - glReadPixels() 如何获取实际深度而不是标准化值?

转载 作者:行者123 更新时间:2023-12-04 01:54:30 69 4
gpt4 key购买 nike

我正在使用 pyopengl 获取深度图。

我可以使用 glReadPixels() 获得标准化的深度图。如何将归一化值恢复为世界坐标中的实际深度?

我试过使用 glDepthRange(),但它总是执行一些规范化。我可以完全禁用规范化吗?

最佳答案

当您绘制几何体时,您的顶点着色器应该通过 View /投影矩阵将所有内容转换为标准化设备坐标(其中每个分量都在 -1 和 1 之间)。没有办法避免它,超出此范围的所有内容都会被剪裁(或夹紧,如果启用深度夹紧)。然后,将这些设备坐标转换为窗口坐标 - X 和 Y 坐标映射到 glViewport 指定的范围,Z 映射到 glDepthRange 设置的范围。

您不能禁用规范化,因为最终值需要在 0..1 范围内。但您可以应用反向转换:首先,将您的深度值映射回 -1..1 范围(如果您没有使用 glDepthRange,您所要做的就是将它们乘以 2 然后减去1).然后,您需要应用投影矩阵的逆矩阵——您可以通过计算它的逆矩阵来明确地做到这一点,或者通过查看透视矩阵的计算方式来避免矩阵运算。对于一个典型的矩阵,逆变换将是

zNorm = 2 * zBuffer - 1
zView = 2 * near * far / ((far - near) * zNorm - near - far)

(请注意,zView 将为负值,介于 -near 和 -far 之间,因为在 OpenGL 中,您的 Z 轴通常指向相机)。

虽然通常您不只需要深度 - 您需要完整的 3D 点,因此您不妨在归一化坐标中重建矢量,然后应用逆投影/ View 变换。

关于opengl - glReadPixels() 如何获取实际深度而不是标准化值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51315865/

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