运动矢量 - 如何正确计算?

Motion Vector - how to calculate it properly?

我正在努力全神贯注于计算运动矢量(也称为速度缓冲区)。我找到了 this 教程,但我对如何计算运动矢量的解释不满意。这是代码:

vec2 a = (vPosition.xy / vPosition.w) * 0.5 + 0.5;
vec2 b = (vPrevPosition.xy / vPrevPosition.w) * 0.5 + 0.5;
oVelocity = a - b;

为什么我们要将位置向量乘以 0.5,然后再加 0.5?我猜我们正在尝试从剪辑 space 转到 NDC,但为什么呢?我完全不明白。

这是从 [-1, 1] 剪辑 space 到 [0, 1] 纹理 space 的映射。由于模糊着色器中的查找必须从速度矢量偏移位置处的纹理读取,因此有必要执行此转换。

请注意,+ 0.5 部分实际上是不必要的,因为它无论如何都会在 a-b 中抵消。因此,使用

之类的东西可以达到相同的结果
vec2 a = (vPosition.xy / vPosition.w);
vec2 b = (vPrevPosition.xy / vPrevPosition.w);
oVelocity = (a - b) * 0.5;

我不知道是否有任何理由更喜欢第一个而不是第二个,但我的猜测是这段代码是以这种方式编写的,因为它建立在之前计算的教程的基础上一样。