0

要了解 z-fighting 是如何工作的,我得到了这个问题。

考虑p = (0, 0, −500)相机局部坐标系中给定的点。推导在上述流水线的不同阶段分配给 p 的深度值,即推导出 p 在眼睛空间、标准化设备坐标([−1, 1])中、范围 [0, 1] 中的深度值和最终的深度缓冲区值。 n = 200 和 f = 1000 和 m = 24

我认为这个过程的第二步是:z1=z * -(f+n)/(f-n) - 2fn/(f-n) 从前瞻性转换矩阵。在那之后z2= (1/2)*z1 + 1/2

但我不知道眼睛空间中的转换应该是什么样子,最后一步是什么。

我希望有人可以帮助我:) `

4

1 回答 1

0

要从对象空间(“局部坐标系”)获取,您必须考虑模型(对象到世界)和视图(世界到眼睛)转换。通常,这些是一些矩阵描述的仿射变换。模型和视图变换可以组合成一个模型视图矩阵,因为世界空间不是明确需要的。这就是旧 GL 固定功能管道的工作方式。

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

投影之后,你得到clip space并且需要进行同质除法w_clip- 这意味着仅计算z是不够的。您w还需要通过应用投影矩阵定义的坐标。在典型情况下,w_clip=-z_eye。但在一般情况下,您可能会得到其他东西。这意味着您可能需要x_eyey_eye而且w_eye,由于模型和视图变换可能不是仿射的(非常不可能),因此可以使用w(一种粗略的缩放方式)或投影方向与z轴不同(仍然不太可能,但理论上完全有可能)。

之后z_ndc=z_clip/w_clip,您需要视口变换。默认情况下, OpenGL 会将范围转换[-1,1][0,1]此处,并且您的问题假设相同。最后,将值转换为最终格式。由于默认情况下使用整数深度缓冲区,因此范围[0,1]只是线性映射到[0,max],而小数部分被忽略。您的 queuestion 似乎建议使用 24 位深度缓冲区,因此max=2^24-1.

于 2014-11-23T14:31:35.597 回答