经过 MVP 矩阵计算后,我们可以将顶点从 Model Space 转换到 Clip Space 中。
而在很多的效果实现中,如水体渲染,都用到了 ScreenPos
的 w
分量。ScreenPos
通过 ComputeScreenPos
得出,ComputeScreenPos
的输入参数为 ClipSpace 下的坐标。
通过确认源代码可知道 ScreenPos
的zw
分量 与 输入参数的坐标的zw
分量 一致。
若我们知道了 裁剪空间 中坐标的 w
分量的计算逻辑,那么在学习那些用到了 ScreenPos
的 w
分量的效果时就更加知其所以然。
正文
我们知道:vertex
经过 MVP 矩阵变换后得到 posInClip
。
MVP 由 M2W、W2V、V2P 组合而成,而 V2P 又由 ORTH、P2O 组合而成。
$$ posInClip = ORTH * P2O * W2V * M2W * vertex $$
其中 M2W 和 W2V 和 ORTH 都由简单的 平移、缩放、旋转 组合而成,齐次坐标应用到这些变换后,w分量都不会发生变化。
只有在透视摄像机下的 P2O 会影响到 w
分量 的计算,其值如下,其中 n
为近平面距离,f
为远平面距离。
n, 0, 0, 0,
0, n, 0, 0,
0, 0, n + f, -n * f,
0, 0, 1, 0
如果 X = (x, y, z, w)
,则 Y = P2O * X
,就有
$$ Y = (nx, ny, (n + f)z - n * f, z) $$
而此时的顶点,在应用 P20
的矩阵变换之前,需要经过 W2V * M2W
的变换。
总结
正交摄像机下:w 为 1。
透视摄像机下:
w 为 顶点经过 M2W、W2V 后的 z 的值,即顶点在 Eye Space 下的 z 值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。