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

时间:2019-07-12 15:04:58

标签: c++ directx

[在此处输入图片描述] [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);




1 个答案:

答案 0 :(得分:0)

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

顺便说一句,您也可以使用XMLoadFloat4()来代替自己将向量的分量分配给寄存器。这将考虑到所有可用的内容。