DirectX:屏幕空间的对象空间

时间:2013-02-09 07:35:03

标签: directx hlsl directx-11

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

我有一个绘制到屏幕的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.Z分割pos.X和pos.Y。

我如何解释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;

提前感谢您的帮助! :)

2 个答案:

答案 0 :(得分:0)

您必须除以w组件, z

float3 clipPosition = affineClipPosition.xyz / affineClipPosition.w;

如果转换矩阵有效且按正确顺序应用,则xy组件应位于-11范围内,z组件应位于0之间1}}和1


答案 1 :(得分: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.W的pos.X / pos.Y / pos.Z坐标划分为pos.W,正如Lucius在上面所建议的那样。

希望这有助于某人!