为什么在openGL中深度值必须直接用重心坐标插值?

ccrfmcuu  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(172)

OpenGL规格:

它说:然而,多边形的深度值必须用公式14 - 10插值。
为什么?z坐标的深度值是在相机空间中吗?如果是这样,我们应该正确地使用透视重心坐标来插值它们,是不是?(如方程14.9)

更新日期:

所以z坐标是NDC坐标(已经除以w)。我有一个实现光栅化器的小演示。当我使用NDC z坐标的线性插值时,结果有点不寻常(下图)。当我使用相机z坐标的透视正确插值时,结果是可以的。

这是我使用的透视投影矩阵:

noj0wjuj

noj0wjuj1#

为什么?z坐标是相机空间的深度值吗?如果是这样,我们应该正确地使用透视重心坐标来插值它们,不是吗?
不,它们不是。它们在窗口空间中,这意味着它们已经被w除过了。如果你想对camarea空间z进行插值,你必须应用透视校正,这是正确的。但是对于NDC和窗口空间Z,这将是错误的--毕竟,透视变换(如通过透视投影矩阵和透视划分所实现的)仍然将直线Map到直线,和平面三角形到平面三角形。这就是为什么我们首先使用双曲扭曲的Z值作为深度。这也是一个用于层次深度测试优化的属性。请查看at my answer here以了解更多详细信息,包括一些图表。

相关问题