2

这真让我抓狂!任何帮助,将不胜感激。

我有一个绘制到屏幕上的 3d 模型。这绝对有效,并且模型位于屏幕范围内。我想计算几个顶点在 CPU 上的屏幕坐标。

为此,我将这些顶点的位置乘以模型/视图/投影矩阵,就像我的顶点着色器一样:

XMVECTOR pos = XMVectorSet(input.x, input.y, input.z, 1);
pos = XMVector3Transform(pos, XMLoadFloat4x4(&m_constantBufferData.model));
pos = XMVector3Transform(pos, XMLoadFloat4x4(&m_constantBufferData.view));
pos = XMVector3Transform(pos, XMLoadFloat4x4(&m_constantBufferData.projection));

然后我将 pos.X 和 pos.Y 除以 pos.Z。

如何解释 pos 的结果?我期待它的 X 和 Y 坐标介于 0 和 1 之间,或者可能是 -1 和 1,但我得到的数字是 -3。我做错了什么吗?

作为记录,这是顶点着色器的一部分:

float4 pos = float4(input.pos, 1.0f);
pos = mul(pos, model);
pos = mul(pos, view);
pos = mul(pos, projection);
output.pos = pos;

预先感谢您的任何帮助!:)

4

2 回答 2

0

您必须除以w组件,而不是z

float3 clipPosition = affineClipPosition.xyz / affineClipPosition.w;

如果您的转换矩阵是有效的并且以正确的顺序应用,那么您的xy组件应该在-1to1z之间的组件范围01


于 2013-02-09T12:55:14.687 回答
0

以防万一其他人遇到这个问题,我忘记了在将它们传递给 HLSL 之前我已经转置了矩阵,所以我需要在 CPU 上使用它们之前再次重新转置它们:

    XMVECTOR pos = XMVectorSet(input.x, input.y, input.z, 1);
    pos = XMVector3Transform(pos, XMMatrixTranspose(XMLoadFloat4x4(&m_constantBufferData.model)));
    pos = XMVector3Transform(pos, XMMatrixTranspose(XMLoadFloat4x4(&m_constantBufferData.view)));
    pos = XMVector3Transform(pos, XMMatrixTranspose(XMLoadFloat4x4(&m_constantBufferData.projection)));

然后我需要将 pos 的 pos.X/pos.Y/pos.Z 坐标除以 pos.W,正如 Lucius 上面建议的那样。

希望这对某人有帮助!

于 2013-02-10T03:34:49.560 回答