[英]Converting DirectX SDK code to new Windows 8.1 SDK Code
我正在創建一個視頻游戲+引擎。 我在RasterTek上找到了一些關於DirectX 11編程的非常棒的教程 。 不幸的是,他們使用折舊的DirectX SDK,我使用VS 2013和Windows SDK中包含的新DirectX SDK。
我正在轉換代碼以使用Windows SDK,但我在教程4上遇到了一些問題(是的,我將轉換所有49個教程,並且可能會有更多問題)
從使用D3DXMath ,我被告知D3DXVECTOR3應該轉換為XMFLOAT3。 然后我嘗試在D3DXVec3TransformCoord中使用這些XMFLOAT3,它已被轉換為XMVector3TransformCoord 。
例:
XMFLOAT3 up, position, lookAt;
// Setup the vector that points upwards.
up.x = 0.0f
up.y = 1.0f
up.z = 0.0f
// Setup the position of the camera in the world.
position.x = m_positionX;
position.y = m_positionY;
position.z = m_positionZ;
// Setup where the camera is looking by default.
lookAt.x = 0.0f;
lookAt.y = 0.0f;
lookAt.z = 1.0f;
// Transform the lookAt and up vector by the rotation matrix so the view is correctly rotated at the origin.
XMVector3TransformCoord(lookAt, rotationMatrix);
XMVector3TransformCoord(up, rotationMatrix);
我收到一個錯誤:
IntelliSense:沒有從“DirectX :: XMFLOAT3”到“DirectX :: XMVECTOR”的合適的用戶定義轉換
我發現我可以使用XMLoadFloat3來TypeCast lookAt和up:
XMVector3TransformCoord(XMLoadFloat3(&lookAt), rotationMatrix);
XMVector3TransformCoord(XMLoadFloat3(&up), rotationMatrix);
我應該這樣做,和/或這是最好的方法嗎?
在這之后,我嘗試:
// Translate the rotated camera position to the location of the viewer.
lookAt = position + lookAt;
並得到錯誤:
IntelliSense:沒有運算符“+”匹配這些操作數操作數類型是:DirectX :: XMFLOAT3 + DirectX :: XMFLOAT3
我能夠在D3DXVECTOR3上使用+運算符,但現在不能使用XMFLOAT3? 我如何將它們一起添加?
我應該這樣做,和/或這是最好的方法嗎?
使用XMVECTOR而不是XMFLOAT3,因為DriectXMath中的大多數函數都使用XMVECTOR。 因此,您可以避免無聊的類型轉換並使您的代碼清潔。
我能夠在D3DXVECTOR3上使用+運算符,但現在不能使用XMFLOAT3? 我如何將它們一起添加?
再次,使用XMVECTOR而不是XMFLOAT3
XMVECTOR也有一些缺點(我的意思是代碼看起來有點復雜)。 使用D3DXVECTOR3,您可以簡單地將變量初始化為D3DXVECTOR3 a(x,y,z,w)並將其組件設為ax,ay,...但XMVECTOR使用不同的方式。
要初始化XMVECTOR,請使用XMVectorSet函數。
XMVECTOR lookAt = XMVectorSet(x, y, z, w);
要獲取XMVECTOR的組件,請使用以下函數。
我應該嗎?
我應該這樣做,和/或這是最好的方法嗎?
一般來說,您使用Windows SDK編寫新代碼,但您不必轉換任何舊代碼(您的代碼,尤其是其他代碼)。 這只是浪費時間。 您可以安裝DirectX SDK以便能夠構建它。
另一方面,這是一個了解DrectX及其基礎設施的更好機會。 例如,從D3DXMath到DirectXMath(以前的XMMath),您將學習基於SSE的數學庫的優缺點,這是開始編寫自己的數學庫的好地方。
2.怎么樣?
如果你真的決定做這項艱苦的工作,那么90%的信息你會在Chuck Walbourn的一篇好文章中找到 - MSFT: 沒有D3DX的生活 。 另外9.9%你將自己從文檔中找到 ,並且從查看DirectXMath源代碼增加0.1%(它是一個頭庫,所有函數內聯,你可以自由地學習它們)。 你可能也會對MSDN上那個人的另一篇文章感興趣。
3. operator+
問題
新數學包含兩種類型: XMFLOATn
和XMVECTOR
,而不是單個D3DXVECTORn
類型(其中n
是多個組件)。 對於矩陣也是如此: XMMATRIX
和XMFLOATaXb
(其中a
和b
是矩陣的維度)。
XMFLOAT
人員將用於存儲值。 它只是一個普通的花車。 除了XMLoad*
/ XMStore*
之外,沒有為它們定義的操作符和任何函數。 XMVECTOR
和XMMATRIX
是一種工作:它們在所有函數中使用,並且還有重載運算符(不建議使用它們。使用XM*
函數代替)。 他們使用超音速SSE內部。 但是......很難用它來存儲價值。 例如,如果您創建XMVECTOR
類成員,則會出現對齊問題。 XMFLOAT
存儲和移動你的值,但在任何計算之前,你使用XMLoad*
函數將它們轉換為XMVECTOR
和XMMATRIX
(就像你使用XMVector3TransformCoord()
),並在計算之后,你轉換他們使用XMStore*
函數返回XMFLOAT
。 或者你可以通過正確地對齊你的class
和struct
來獲得更多的利潤,這樣你就可以直接存儲XMVECTOR
和XMMATRIX
(可能你需要對齊的內存分配器)。 好吧,現在你准備好了。 快樂的移植! =)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.