要从对象空间(“局部坐标系”)获取,您必须考虑模型(对象到世界)和视图(世界到眼睛)转换。通常,这些是一些矩阵描述的仿射变换。模型和视图变换可以组合成一个模型视图矩阵,因为世界空间不是明确需要的。这就是旧 GL 固定功能管道的工作方式。
由于尚不清楚到底给出了什么,我只是假设我们知道矩阵,或者您可以根据给出的任何内容来确定/计算它们。由于您只需要z_eye
,因此您可以将这些矩阵的第三行的点积与您的输入向量一起使用p
(就像您在投影的情况下所做的那样)。
投影之后,你得到clip space
并且需要进行同质除法w_clip
- 这意味着仅计算z
是不够的。您w
还需要通过应用投影矩阵定义的坐标。在典型情况下,w_clip=-z_eye
。但在一般情况下,您可能会得到其他东西。这意味着您可能需要x_eye
,y_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
.