如何在 CPU 上计算向量变换?



[在此输入图像描述][1]

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

我让我的世界、摄像机和投影矩阵(我在主图形管道中用于渲染对象)在工作。我使用相同的矩阵通过函数XMVector4Transform()来变换向量。我将向量的 w 分量设置为 1,然后当我转换顶点时,而不是获得规范化(在 -1 到 1 之间)输出(当 3d 模型在屏幕空间内时),我得到的值在屏幕外,而在着色器中使用相同的矩阵转换,它正在屏幕空间内渲染。

现在经过一些挖掘,我发现我需要使用函数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);


从此转换中获得的结果是在所谓的剪辑空间中。这是一个人工 4D 空间,其中w分量表示所有其他分量的公分母。因此,您希望按w除法(所谓的透视除法),而不是归一化。

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

最新更新