Opengl z战斗的数学观

Opengl z战斗的数学观,opengl,math,zbuffer,Opengl,Math,Zbuffer,为了了解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 但是我不知道在眼睛空间中的转换应该是什么样子,最后一步是什么 我希望有人能帮助我:`

为了了解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

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

我希望有人能帮助我:`

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

因为不清楚到底给出了什么,我就假设我们知道矩阵,或者你可以根据给出的任何东西来确定/计算它们。因为你只需要z_眼,你可以使用这些矩阵的第三行的点积和你的输入向量p,就像你在投影中做的那样

在投影之后,你得到了剪辑空间,需要用w_剪辑进行同质除-这意味着仅仅计算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。

最后一步是同质分割,即v'=v/v.w–但是要理解这一点并不重要。Z格斗是由几乎相同的边界值顶点位置插值中的数值舍入误差引起的,导致某些排序运算符等的变化。