经过 MVP 矩阵计算后,我们可以将顶点从 Model Space 转换到 Clip Space 中。
而在很多的效果实现中,如水体渲染,都用到了 ScreenPosw 分量。
ScreenPos 通过 ComputeScreenPos 得出,ComputeScreenPos 的输入参数为 ClipSpace 下的坐标。
通过确认源代码可知道 ScreenPoszw分量 与 输入参数的坐标的zw分量 一致。

若我们知道了 裁剪空间 中坐标的 w 分量的计算逻辑,那么在学习那些用到了 ScreenPosw 分量的效果时就更加知其所以然。

正文

我们知道:
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 值


RDDcoding
151 声望17 粉丝

一心一行