2014-11-23 60 views
0

了解z战斗如何工作我得到了这个问题。z战斗的数学视图

考虑在本地坐标系 摄像机中给出的点p = (0, 0, −500)。导出 上述流水线不同阶段中分配给p的深度值,即导出眼图空间中p的深度值, 归一化设备坐标([−1, 1]),范围[0,1]和最终深度 缓冲值,n = 200,f = 1000,m = 24

我觉得这个程序的secound步骤是:z1=z * -(f+n)/(f-n) - 2fn/(f-n) 从预期的转换矩阵。 之后z2= (1/2)*z1 + 1/2

但我不知道如何转换应该看起来像在眼睛空间和最后一步是什么。

我希望有人能帮助我:)`

+0

最后一步是均匀分割,即v'= v/v.w - 然而要理解Z战斗这是无关紧要的。 Z-格斗是由几乎相同边界值(顶点位置)的插值中的数值舍入误差引起的,导致某些排序算子(<, >等)的变化。 – datenwolf 2014-11-23 12:09:49

回答

0

对象空间(“局部坐标系”),让你不得不采取模型(对象到世界)和视图(世界来 - 眼)转换考虑在内。通常,这些是由某些矩阵描述的仿射变换。由于世界空间并非明确需要,因此模型和视图变换可以组成模型视图矩阵。这就是旧的GL固定功能管道的工作方式。

由于不清楚到底给出了什么,我只是假设我们知道矩阵,或者可以根据给定的方法来确定/计算它们。由于您只需要z_eye,因此您可以将这些矩阵的第三行的点积与您的输入矢量p(正如您在投影时所做的那样)一起使用。

投影后,你得到了clip space,需要做w_clip的均匀除法 - 这意味着仅计算z是不够的。您还需要应用投影矩阵定义的w坐标。在典型情况下,w_clip=-z_eye。但在一般情况下,你可能会得到别的东西。这意味着您也可能需要x_eye,y_eyew_eye,因为模型和视图转换可能不是仿射(非常不可能),请使用w(缩放的粗略方式)或投影方向与z轴不相同(仍然不太可能,但理论上完全可能)。

z_ndc=z_clip/w_clip之后,您需要视口变换。在默认情况下,OpenGL会将范围[-1,1]转换为[0,1],并且您的问题假定为相同。最后,该值被转换为最终格式。由于默认情况下使用整数深度缓冲区,因此[0,1]范围线性映射到[0,max],并忽略小数部分。 你的队列似乎表明使用了一个24位深度缓冲区,所以max=2^24-1