我试图了解如何从深度缓冲区恢复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中)。然后代码显示
为A和B(或S和T)求解
好的,现在从头开始计算两个投影矩阵,(左= ogldev.atspace.co.uk,右= stackoverflow)现在它变得混乱,因为直到-ST / z部分一切都很好,但是当我们比较解决的公式应该是stackoverflow-case(-1 projection-matrix)时,它匹配来自ogldev.atspace.co.uk(+1投影矩阵)的那个 - 用红色着色......
这令人困惑,任何线索我做错了什么?!
答案 0 :(得分:2)
这两个帖子使用不同的投影矩阵(特别是 右下2x2部分是不同的,一个区别是使用-1对比 [3] [4]中的+1。不确定为什么会这样,远离那个 -1是"正确的OpenGL投影矩阵" (右?)
没有。没有"权利"并且"错误"这里。只有惯例。 "正确"对于您选择使用的约定,矩阵是做正确的事情的。经典GL' glFrustum
函数确实使用了StackOverflow帖子中的矩阵。这里的惯例是投影中心位于原点,视图方向为-z
,x
为右,y
为向上。但是你可以使用任意约束,任意主点和任意投影方向。另一个矩阵仅为+z
作为投影方向,可以解释为坐标空间的翻转手性。它也可以被解释为只是在相反的方向上看,同时仍保持左手坐标系。
这是令人困惑的,任何线索我做错了什么?!
我不确定你在这里要证明的是什么,除了引入小符号错误会导致虚假结果......
您对" + z"的推导投影矩阵似乎没问题。它将depth=0
映射到z=n
,将depth=1
映射到z=f
,这是映射这些的标准方式 - 而且只是另一种惯例。您还可以使用Reversed-Z映射,其中近平面映射到深度1,远平面映射到深度0。
<强>更新强>
对于第二个矩阵,即使在我的评论更正之后,您再次翻转了符号。当您将 [现在你再次修复了计算后,你就得到了]
与S
和T
替换回最终公式时,您实际上已在-S
中替换。如果你做了正确的替换,你就会得到+z
矩阵情况完全相反的formala - depth = 0映射到-n
,depth = 1映射到-f
,这很好地说明了这些参数是如何定义的在经典GL惯例中,n
和f
只是在观察方向(-z
)中描述到这些平面的距离。