这让我抓狂!任何帮助将不胜感激。
我有一个绘制到屏幕的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;
提前感谢您的帮助! :)
答案 0 :(得分:0)
您必须除以w
组件,不 z
:
float3 clipPosition = affineClipPosition.xyz / affineClipPosition.w;
如果转换矩阵有效且按正确顺序应用,则xy
组件应位于-1
到1
范围内,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在上面所建议的那样。
希望这有助于某人!