如何计算 CPU 上的矢量变换?

How to compute vector transformations on the CPU?

[在此处输入图片描述][1]

我一直在尝试在主图形管道之外转换我的顶点。 CPU 我需要它们。但是,尽管一开始看起来很简单,但我花了很长时间尝试实现它,但最终失败了。我一直在尝试用我的方法找出错误,但它对我来说似乎很完美。

我的世界、相机和投影矩阵(我在主图形管道中使用它们来渲染对象)正在运行。我使用相同的矩阵通过函数 XMVector4Transform() 转换向量。我已将向量的 w 分量设置为 1,然后当我变换顶点时,我没有得到标准化(-1 到 1 之间)输出(而 3d 模型在屏幕内 space),我得到屏幕外的值,而在着色器中使用相同的矩阵变换,它正在屏幕内渲染 space。

现在经过一番挖掘,我发现我需要使用函数 XMVector4Normalize() 来规范化坐标。虽然在使用它之后结果被归一化了,但 CPU 计算的顶点和我在着色器中计算的顶点之间仍然存在主要偏移。当我将对象移动到边缘时,偏移边距会增加。

https://i.stack.imgur.com/bhnpB.png 在上面的屏幕截图中,线框是使用 CPU 计算的顶点渲染的,并且在主管道中渲染了纯色阴影版本。我提到的偏移量可以在屏幕截图中清楚地观察到。

PS :我正在渲染 CPU 计算的顶点只是为了测试...


    DirectX::XMVECTOR v1;
    v1.m128_f32[0] = pMesh[i].GetVertices()[j].x;
    v1.m128_f32[1] = pMesh[i].GetVertices()[j].y;
    v1.m128_f32[2] = pMesh[i].GetVertices()[j].z;
    v1.m128_f32[3] = 1.f;


    projectedVectors[i].verts.emplace_back(XMVECTOR());
    v1 = XMVector4Transform(XMVector4Transform(v1, *mView), *mProj);;

    v1 = XMVector4Normalize(v1);




您从此转换中获得的结果在 so-called 剪辑 space 中。这是一个人工 4D-space,其中 w-分量表示所有其他分量的公分母。因此,您想要除以 w(so-called 透视除法)而不是归一化。

顺便说一句,您也可以使用 XMLoadFloat4(),而不是自己将向量的分量分配给寄存器。考虑到可用的内容,这将处理所有事情。