OpenGL从深度恢复z

时间:2017-04-22 08:40:09

标签: opengl math matrix projection

我试图了解如何从深度缓冲区恢复z并尝试根据这两个帖子进行数学运算:

Getting the true z value from the depth buffer(stackoverflow) http://ogldev.atspace.co.uk/www/tutorial46/tutorial46.html

这两个帖子使用不同的投影矩阵(具体来说,右下角2x2部分是不同的,一个区别是在[3] [4]中使用-1与+1)。不太确定为什么会这样,带有-1的那个是“正确的OpenGL投影矩阵”(对吧?)

现在我尝试对两者进行计算,奇怪的是在SO-post中它提到-A-B / z(或在我的计算-S-T / z中)。然后代码显示

enter image description here

为A和B(或S和T)求解

enter image description here

好的,现在从头开始计算两个投影矩阵,(左= ogldev.atspace.co.uk,右= stackoverflow)现在它变得混乱,因为直到-ST / z部分一切都很好,但是当我们比较解决的公式应该是stackoverflow-case(-1 projection-matrix)时,它匹配来自ogldev.atspace.co.uk(+1投影矩阵)的那个 - 用红色着色......

enter image description here

这令人困惑,任何线索我做错了什么?!

更新了计算,请参阅下面“derhass”的评论: enter image description here

1 个答案:

答案 0 :(得分:2)

  

这两个帖子使用不同的投影矩阵(特别是   右下2x2部分是不同的,一个区别是使用-1对比   [3] [4]中的+1。不确定为什么会这样,远离那个   -1是"正确的OpenGL投影矩阵" (右?)

没有。没有"权利"并且"错误"这里。只有惯例。 "正确"对于您选择使用的约定,矩阵是做正确的事情的。经典GL' glFrustum函数确实使用了StackOverflow帖子中的矩阵。这里的惯例是投影中心位于原点,视图方向为-zx为右,y为向上。但是你可以使用任意约束,任意主点和任意投影方向。另一个矩阵仅为+z作为投影方向,可以解释为坐标空间的翻转手性。它也可以被解释为只是在相反的方向上看,同时仍保持左手坐标系。

  

这是令人困惑的,任何线索我做错了什么?!

我不确定你在这里要证明的是什么,除了引入小符号错误会导致虚假结果......

您对" + z"的推导投影矩阵似乎没问题。它将depth=0映射到z=n,将depth=1映射到z=f,这是映射这些的标准方式 - 而且只是另一种惯例。您还可以使用Reversed-Z映射,其中近平面映射到深度1,远平面映射到深度0。

<强>更新

对于第二个矩阵,即使在我的评论更正之后,您再次翻转了符号。当您将ST替换回最终公式时,您实际上已在-S中替换。如果你做了正确的替换,你就会得到 [现在你再次修复了计算后,你就得到了]  与+z矩阵情况完全相反的formala - depth = 0映射到-n,depth = 1映射到-f,这很好地说明了这些参数是如何定义的在经典GL惯例中,nf只是在观察方向(-z)中描述到这些平面的距离。