XMVECTORとXMFLOATどっち?問題

XMVECTOR


XMVECTORは、DirectXMathライブラリの中核をなすデータ型です。その特徴は以下の通りです。

XMVECTOR を使うべき場面:

:

C++

#include <DirectXMath.h>

// XMVECTOR同士の加算
XMVECTOR v1 = XMVectorSet(1.0f, 2.0f, 3.0f, 0.0f);
XMVECTOR v2 = XMVectorSet(4.0f, 5.0f, 6.0f, 0.0f);
XMVECTOR vResult = XMVectorAdd(v1, v2);

// 行列とベクトルの乗算
XMMATRIX m = XMMatrixRotationY(XM_PIDIV4);
XMVECTOR transformedVec = XMVector3TransformCoord(v1, m);


XMFLOAT (例: XMFLOAT3, XMFLOAT4)


XMFLOATシリーズのデータ型(XMFLOAT2, XMFLOAT3, XMFLOAT4など)は、C++の通常の構造体として定義されています。

XMFLOAT を使うべき場面:

:

C++

#include <DirectXMath.h>

// 構造体のメンバとして位置を保持
struct GameObject {
    XMFLOAT3 position;
    XMFLOAT4 color;
    // ...
};

GameObject player;
player.position = XMFLOAT3(0.0f, 1.0f, 0.0f);
player.color = XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f);

// XMVECTORの計算結果をXMFLOAT3に格納
XMVECTOR vec = XMVectorSet(10.0f, 20.0f, 30.0f, 0.0f);
XMFLOAT3 resultFloat3;
XMStoreFloat3(&resultFloat3, vec); // ここで変換


変換について


XMVECTORXMFLOATの間は、以下の関数を使って相互に変換できます。


まとめと推奨されるフロー


DirectXプログラミングにおける理想的なデータフローは以下のようになります。

  1. データ格納: オブジェクトの状態(位置、回転、色など)は、クラスや構造体のメンバとして**XMFLOAT**型で保持します。
  2. 計算開始: 計算が必要になったら、**XMLoadFloat関数を使用してXMFLOAT型のデータをXMVECTOR**型にロードします。
  3. 計算実行: **XMVECTOR**型を使って、DirectXMathの関数(XMVectorAdd, XMMatrixMultiplyなど)で高速なSIMD演算を行います。
  4. 計算結果の格納: 計算が終わったら、**XMStoreFloat関数を使用してXMVECTOR型の結果を再びXMFLOAT**型にストアし、永続化します。

Revision #1
Created 1 July 2025 05:19:53 by youe2
Updated 2 June 2026 18:09:58 by youe2