在 3D 渲染(或几何图形)中,在光栅化算法中,当您将三角形的顶点投影到屏幕上,然后查找像素是否与 2D 三角形重叠时,您通常需要查找深度或像素重叠的三角形的 z 坐标。一般来说,该方法包括计算三角形的二维“投影”图像中像素的重心坐标,然后使用这些坐标来插值三角形原始顶点的 z 坐标(在顶点投影之前)。
现在所有教科书中都写到,你不能直接对顶点的顶点坐标进行插值,而是需要这样做:
(抱歉无法让 Latex 工作?)
1/z = w0 * 1/v0.z + w1 * 1/v1.z + w2 * 1/v2.z
其中 w0、w1 和 w2 是三角形上“像素”的重心坐标。
现在,我关心的是两件事:
- 证明插值 z 不起作用的正式证据是什么?
- 证明 1/z 正确的正式证据是什么?
为了表明这不是家庭作业;-)并且我自己做了一些工作,我找到了问题 2 的以下解释。
基本上,三角形可以通过平面方程来定义。因此你可以写:
Ax + By + Cz = D。
然后分离 z 得到 z = (D - Ax - By)/C
然后你将此公式除以 z,就像使用透视除法一样,如果你展开、重新组合等,你会得到:
1/z = C/D + A/Dx/z + B/Dy/z。
然后我们将 C'=C/D B'=B/D 和 A'=A/D 命名为:
1/z = A'x/z + B'y/z + C'
它说 x/z 和 y/z 只是投影到屏幕上的三角形上的点的坐标,而右侧的方程是“仿射”函数,因此 1/z 是线性函数? ??
这对我来说不像是一个演示?或者也许这是正确的想法,但不能真正说明如何通过仅查看方程来判断这是一个仿射函数。如果将所有项相乘,则得到:
A'x + B'y + C'z = 1。
这基本上就是我们原来的方程(只需用适当的项替换 A' B' 和 C')。
最佳答案
不确定您想在这里问什么,但如果您查看:
1/z = A'x/z + B'y/z + C'
并将其重写为:
1/z = A'u + B'v + C'
其中(u,v)
是透视投影后三角形的屏幕坐标,可以看到三角形上一点的深度(z
)不是与 (u,v)
线性相关,但 1/深度
是线性相关的,这就是教科书试图教给您的内容。
关于geometry - 透视投影: Proving that 1/z is Linear?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28707584/