簡體   English   中英

將DirectX SDK代碼轉換為新的Windows 8.1 SDK代碼

[英]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的組件,請使用以下函數。

  • XMVectorGetX
  • XMVectorGetY
  • XMVectorGetZ
  • XMVectorGetW

我應該嗎?

我應該這樣做,和/或這是最好的方法嗎?

一般來說,您使用Windows SDK編寫新代碼,但您不必轉換任何舊代碼(您的代碼,尤其是其他代碼)。 這只是浪費時間。 您可以安裝DirectX SDK以便能夠構建它。

另一方面,這是一個了解DrectX及其基礎設施的更好機會。 例如,從D3DXMath到DirectXMath(以前的XMMath),您將學習基於SSE的數學庫的優缺點,這是開始編寫自己的數學庫的好地方。

2.怎么樣?

如果你真的決定做這項艱苦的工作,那么90%的信息你會在Chuck Walbourn的一篇好文章中找到 - MSFT: 沒有D3DX的生活 另外9.9%你將自己從文檔中找到 ,並且從查看DirectXMath源代碼增加0.1%(它是一個頭庫,所有函數內聯,你可以自由地學習它們)。 你可能也會對MSDN上那個人的另一篇文章感興趣。

3. operator+問題

新數學包含兩種類型: XMFLOATnXMVECTOR ,而不是單個D3DXVECTORn類型(其中n是多個組件)。 對於矩陣也是如此: XMMATRIXXMFLOATaXb (其中ab是矩陣的維度)。

  • XMFLOAT人員將用於存儲值。 它只是一個普通的花車。 除了XMLoad* / XMStore*之外,沒有為它們定義的操作符和任何函數。
  • XMVECTORXMMATRIX是一種工作:它們在所有函數中使用,並且還有重載運算符(不建議使用它們。使用XM*函數代替)。 他們使用超音速SSE內部。 但是......很難用它來存儲價值。 例如,如果您創建XMVECTOR類成員,則會出現對齊問題。
  • 所以,基本上,你在XMFLOAT存儲和移動你的值,但在任何計算之前,你使用XMLoad*函數將它們轉換為XMVECTORXMMATRIX (就像你使用XMVector3TransformCoord() ),並在計算之后,你轉換他們使用XMStore*函數返回XMFLOAT 或者你可以通過正確地對齊你的classstruct來獲得更多的利潤,這樣你就可以直接存儲XMVECTORXMMATRIX (可能你需要對齊的內存分配器)。

好吧,現在你准備好了。 快樂的移植! =)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM