DirectX11のプログラムができるようになったので、次は3Dグラフィックスの表示といきたいところですが、その前に3DCGで必要になるベクトルや行列の計算を行うライブラリを準備します。
DirextX9や10に含まれる計算関数、XNAMath(マイクロソフトが提供するゲーム作成環境XNAの計算ライブラリ)などを使う予定でしたが、DirectXMathという計算ライブラリがあるようなので、これを使うことにしました。
DirectXMath Programming Guide (Windows)を参考に。
DirectXMath (Windows)からだと日本語のページがなくXNAMathのページへ、仕方なく英語で。
DirectXMathの特徴
・DirextX9、10、XNAMathに代わる計算ライブラリ
・インライン定義のみ(ヘッダファイルのみリンクなし)
・SSE/SSE2やARM-NEONなどのCPU命令を使用(ベクトル計算を高速に)
・CPU毎に実行ファイルを用意する必要がある(インライン定義なので)
最後が少し気になるけど、SSE/SSE2対応CPUに限定してプログラミングするので問題なし。
DirectXMath.hは現在インストールしているWindowsSDKに含まれているので、使用するにはDirectXMath.hをincludeするのみ。
検証用ソースコード(CPU判定と意味のない計算をするだけ)
#include
if(DirectX::XMVerifyCPUSupport()){
using DirectX::XMVECTOR;
using DirectX::XMMATRIX;
XMVECTOR v0 = DirectX::XMVectorReplicate(0.0f);//v0=(0,0,0,0)
XMVECTOR v1 = DirectX::XMVectorSet(1.0f,2.0f,3.0f,1.0f);//v1=(1,2,3,1)
XMMATRIX m0 = DirectX::XMMatrixIdentity();
XMMATRIX m1 = DirectX::XMMatrixScaling(1.0f,2.0f,3.0f);
XMMATRIX m = DirectX::XMMatrixMultiply(m0,m1);
XMVECTOR v = DirectX::XMVector4Transform(v1,m);
float vx = DirectX::XMVectorGetX(v);
float vy = DirectX::XMVectorGetY(v);
float vz = DirectX::XMVectorGetZ(v);
MessageBox(NULL, L"DirectXMath対応CPU", L"DirectXMath", MB_OK);
}
まず最初に、DirectX::XMVerifyCPUSupport()でCPUが対応しているか調べ、未対応の場合プログラムを実行できないので、強制終了などのエラー処理が必要なります。XMVerifyCPUSupportを使用するときは、DirectXMath.hのincludeの前にwindows.hをincludeする必要があります。
あとはDirectXMath Programming Guide (Windows)を参考にベクトルや行列の計算を試してみました。デバッガでの確認ですが計算は正しく行われているようです。
これで計算ライブラリの準備完了。
使い方は必要に応じて調べていきます。
DirectXMath (Windows)
DirectXMath Programming Guide (Windows)