共用方式為


DirectXMath () 使用者入門

DirectXMath 程式庫會針對單精確度浮點向量 (2D、3D 和 4D) 或矩陣 (3×3 和 4×4) ,實作算術和線性代數運算的最佳可攜式介面。 程式庫對整數向量運算有一些有限的支援。 這些作業廣泛用於圖形程式的轉譯和動畫。 不支援雙精確度向量 (包括 longs、shorts 或 bytes) ,而且只有有限的整數向量運算。

程式庫可在各種 Windows 平臺上使用。 因為程式庫提供先前無法使用的功能,所以此版本會取代下列程式庫:

  • Xboxmath.h 標頭提供的 Xbox 數學程式庫
  • D3DX 9 DLL 所提供的 D3DX 9 程式庫
  • D3DX 10 數學程式庫透過 D3DX 10 DLL 提供
  • DirectX SDK 和 Xbox 360 XDK 中 xnamath.h 標頭提供的 XNA 數學程式庫

這些章節概述使用者入門的基本概念。

下載

DirectXMath 程式庫包含在 Windows SDK 中。 或者,您可以從 GitHub/Microsoft/DirectXMath下載它。 此網站也包含相關的範例專案。

Run-Time系統需求

DirectXMath 程式庫會在有提供向量作業時使用特製化的處理器指令。 若要避免程式產生「未知的指令例外狀況」錯誤,請在使用 DirectXMath 程式庫之前呼叫 XMVerifyCPUSupport 來檢查處理器支援。

以下是基本的 DirectXMath 程式庫執行時間支援需求:

  • Windows (x86/x64) 平臺上的預設編譯需要 SSE/SSE2 指令支援。
  • Windows RT平臺上的預設相容性需要 ARM-NEON 指令支援。
  • 使用 定義的_XM_NO_INTRINSICS_ 編譯只需要標準浮點運算支援。

注意

當您呼叫 XMVerifyCPUSupport時,請先包含 < windows.h > ,再包含 < DirectXMath.h > 。 這是程式庫中唯一需要 windows.h <> 內容的功能,因此您不需要 < 在每個使用 < DirectXMath.h 的模組中包含 windows.h >> 。

 

設計概觀

DirectXMath 程式庫主要支援 C++ 程式設計語言。 程式庫是使用標頭檔、DirectXMath*.inl、DirectXPackedVector.inl 和 DirectXCollision.inl 中的內嵌常式來實作。 此實作會使用高效能編譯器內建函式。

DirectXMath 程式庫提供:

  • 使用 SSE/SSE2 內建函式的實作。
  • 沒有內建的實作。
  • 使用 ARM-NEON 內建函式的實作。

因為程式庫是使用標頭檔傳遞,所以請使用原始程式碼來自訂和優化您自己的應用程式。

矩陣慣例

DirectXMath 使用資料列主要矩陣、資料列向量和預先乘法。 手動性取決於使用哪個函式版本 (RH 與 LH) ,否則函式適用于左手或右手檢視座標。

為了參考,Direct3D 過去曾使用左手座標系統、資料列主要矩陣、資料列向量,以及預先乘法。 新式 Direct3D 對於左座標與右手座標沒有強大的需求,而且通常 HLSL 著色器預設為取用資料行主要矩陣。 如需詳細資訊 ,請參閱 HLSL 矩陣排序

基本使用方式

若要使用 DirectXMath 程式庫函式,請包含 DirectXMath.h、DirectXPackedVector.h、DirectXColors.h 和/或 DirectXCollision.h 標頭。 標頭位於適用于 Windows 市集應用程式的 Windows 軟體發展工具組中。

類型使用方針

XMVECTORXMMATRIX類型是 DirectXMath 程式庫的工作馬程式。 每個作業都會取用或產生這些類型的資料。 使用它們是使用程式庫的關鍵。 不過,由於 DirectXMath 會使用 SIMD 指令集,因此這些資料類型受限於許多限制。 如果您想要充分利用 DirectXMath 函式,請務必瞭解這些限制。

您應該將 XMVECTOR 視為 SIMD 硬體暫存器的 Proxy,並將 XMMATRIX 視為四個 SIMD 硬體暫存器的邏輯群組 Proxy。 這些類型會加上批註,指出它們需要 16 位元組的對齊才能正常運作。 當編譯器作為區域變數使用時,編譯器會自動將它們正確地放在堆疊上,或在當做全域變數使用時將它們放在資料區段中。 使用適當的慣例,它們也可以安全地當做參數傳遞至函式 (請參閱 呼叫慣例 以取得詳細資料) 。

不過,堆積的配置較為複雜。 因此,每當您使用 XMVECTORXMMATRIX 作為類別或結構的成員時,都必須小心,才能從堆積配置。 在 Windows x64 上,所有堆積配置都對齊 16 位元組,但針對 Windows x86,它們只會對齊 8 位元組。 有選項可從堆積配置具有 16 位元組對齊的結構, (請參閱 適當對齊配置) 。 對於 C++ 程式,您可以使用運算子 new/delete/new[]/delete[] 多載, (全域或類別特定的) ,視需要強制執行最佳對齊方式。

注意

除了透過多載 new/delete 直接強制執行 C++ 類別中的對齊方式,您也可以使用 pImpl 慣用語。 如果您確定 Impl 類別是透過 內部_aligned_malloc 對齊,則可以在內部實作中自由使用對齊的類型。 當 'public' 類別是Windows 執行階段 ref 類別,或用於std::shared_ptr <>時,這是很好的選項,否則可能會中斷謹慎的對齊。

 

不過,通常更容易且更精簡,以避免直接在類別或結構中使用 XMVECTORXMMATRIX 。 請改用XMFLOAT3、XMFLOAT4XMFLOAT4X3、XMFLOAT4X4等等,作為結構的成員。 此外,您可以使用 向量載入向量儲存 函數,有效率地將資料移至 XMVECTORXMMATRIX 區域變數、執行計算,以及儲存結果。 另外還有串流函式 (XMVector3TransformStreamXMVector4TransformStream等) ,可有效率地在這些資料類型的陣列上運作。

建立向量

常數向量

許多作業都需要在向量計算中使用常數,而且有數種方式可以載入具有所需值的 XMVECTOR

  • 如果將純量常數載入 XMVECTOR的所有專案,請使用 XMVectorReplicateXMVectorReplicateInt

    XMVECTOR vFive = XMVectorReplicate( 5.f );
    
  • 如果使用具有不同固定值的向量常數做為 XMVECTOR,請使用 XMVECTORF32XMVECTORU32XMVECTORI32XMVECTORU8 結構。 然後,您可以直接在傳遞 XMVECTOR 值的任何位置參考這些值。

    static const XMVECTORF32 vFactors = { 1.0f, 2.0f, 3.0f, 4.0f };
    

    注意

    請勿直接搭配 XMVECTOR (使用初始化運算式清單,也就是 XMVECTOR v = { 1.0f, 2.0f, 3.0f, 4.0f }) 。 這類程式碼沒有效率,而且無法在 DirectXMath 支援的所有平臺上移植。

     

  • DirectXMath 包含一些預先定義的全域常數,您可以在程式碼 (g_XMOne、g_XMOne3、g_XMTwo、g_XMOneHalf、g_XMHalfPi、g_XMPi等) 中使用。 搜尋 DirectXMath.h 標頭中的 XMGLOBALCONST 值。

  • 常見的 RGB 色彩有一組向量常數, (紅色、綠色、藍色、黃色等) 。 如需這些向量常數的詳細資訊,請參閱 DirectXColors.h 和 DirectX::Colors 命名空間。

變數的向量

向量中的向量

  • 如果從另一個向量建立向量,並將特定元件設定為變數,您可以考慮使用 向量存取子函式

    XMVECTOR v2 = XMVectorSetW( v1, fw );
    
  • 如果使用單一元件複寫從另一個向量建立向量,請使用 XMVectorSplatXXMVectorSplatYXMVectorSplatZXMVectorSplatW

    XMVECTOR vz = XMVectorSplatZ( v );
    
  • 如果從另一個向量或具有重新排序元件的向量配對建立向量,請參閱 XMVectorSwizzleXMVectorPermute

    XMVECTOR v2 = XMVectorSwizzle<XM_SWIZZLE_Z, XM_SWIZZLE_Y, XM_SWIZZLE_W, XM_SWIZZLE_X>( v1 );
    
    XMVECTOR v3 = XMVectorPermute<XM_PERMUTE_0W, XM_PERMUTE_1X, XM_PERMUTE_0X, XM_PERMUTE_1Z>( v1, v2 );
    

記憶體中的向量

從向量擷取元件

當資料載入 SIMD 暫存器並在擷取結果之前完全處理時,SIMD 處理最有效率。 純量和向量表單之間的轉換效率不佳,因此建議您只在需要時才執行。 因此,產生純量值的 DirectXMath 程式庫中的函式會以向量形式傳回,其中純量結果會複寫到產生的向量 (,也就是 XMVector2DotXMVector3Length等等) 。 不過,當您需要純量值時,以下是一些關於如何進行的選項:

  • 如果計算單一純量答案,就適合使用 Vector 存取子函式

    float f = XMVectorGetX( v );
    
  • 如果需要擷取向量的多個元件,請考慮將向量儲存在記憶體結構中,並將它讀回。 例如:

    XMFLOAT4A t;
    XMStoreFloat4A( &t, v );
    // t.x, t.y, t.z, and t.w can be individually accessed now
    
  • 最有效率的向量處理形式是使用記憶體對記憶體串流,其中輸入資料是從記憶體載入 (使用 向量載入函 式) 、以 SIMD 形式完整處理,然後使用 向量存放區函 式) 寫入記憶體 (。

DirectXMath 程式設計手冊