2013-02-09 54 views
1

這讓我瘋狂!任何幫助,將不勝感激。DirectX:對象空間到屏幕空間

我有一個畫在屏幕上的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劃分pos.X和pos.Y .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; 

預先感謝您的幫助! :)

回答

0

你必須通過w成分來劃分,z

float3 clipPosition = affineClipPosition.xyz/affineClipPosition.w; 

如果你變換矩陣是有效的,並以正確的順序應用,你xy組件應該在範圍-11z組件在01之間。


+0

啊哈。是的,我曾想過,但我的w分量幾乎爲零:除以w使我的x和y座標達到一百萬! 我解決了這個問題。在計算CPU上的屏幕座標之前,我忘記重新轉換矩陣(因爲HLSL需要矩陣轉置)。 感謝您的幫助! :) – 2013-02-10 03:32:20

0

萬一別人碰到這個問題,我忘了,我已經調換它們傳遞到HLSL前的矩陣,所以我需要retranspose他們回來再次使用前他們在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的pos.X/pos.Y/pos.Z座標,盧修斯上面所建議的。

希望這可以幫助別人!