イネマルのプログラミング備忘録

趣味プログラマーのメモ

D3DX民がDirectXMathを入門する ~ep.01 使い方を探る~

f:id:inemaru:20160328005638p:plain

まえがき(注意書き)

手探りで調べた内容を覚書程度に書き留めてあるものなので、
過度の信用は身を滅ぼします。

以上を踏まえたうえで閲覧してくださいませ。

DirectXMathを使うための前知識!

”保持と計算で型が違う!”

D3DXで計算していた勢は、3D座標の例で言うならD3DXVECTOR3がすべてでしたが、
DirectXMathでは、同じ例で言うと
値の保持にXMFLOAT3計算にXMVECTORを使います。

SIMDを使った最適化と高速化を考慮するために、こうなったらしい

確認用のプログラム

とりあえず、四則演算する。

※動作確認は、VC2013で行いました

#include	<iostream>
#include	<Windows.h>			// XMVerifyCPUSupport()が正常に動作するために必要
#include	<DirectXMath.h>

int main()
{
	using namespace std;
	using namespace DirectX;

	if (XMVerifyCPUSupport()){
		// 保持用の型
		XMFLOAT3 f3_l = { 0.5f, 1.0f, 1.5f };
		XMFLOAT3 f3_r = { 2.0f, 1.5f, 3.0f };
		XMFLOAT3 f3_ans = { 0, 0, 0 };
		// 計算用の型
		XMVECTOR vec_l;
		XMVECTOR vec_r;
		XMVECTOR vec_ans;

		auto DispPos = [&f3_ans](){
			cout << "x:" << f3_ans.x << endl;
			cout << "y:" << f3_ans.y << endl;
			cout << "z:" << f3_ans.z << endl;
		};

		// 加算
		cout << endl << "【加算】" << endl;
		vec_l = XMLoadFloat3(&f3_l);
		vec_r = XMLoadFloat3(&f3_r);
		vec_ans = XMVectorAdd(vec_l, vec_r);
		XMStoreFloat3(&f3_ans, vec_ans);
		DispPos();

		// 減算
		cout << endl << "【減算】" << endl;
		vec_l = XMLoadFloat3(&f3_l);
		vec_r = XMLoadFloat3(&f3_r);
		vec_ans = XMVectorSubtract(vec_l, vec_r);
		XMStoreFloat3(&f3_ans, vec_ans);
		DispPos();

		// 乗算
		cout << endl << "【乗算】" << endl;
		vec_l = XMLoadFloat3(&f3_l);
		vec_r = XMLoadFloat3(&f3_r);
		vec_ans = XMVectorMultiply(vec_l, vec_r);
		XMStoreFloat3(&f3_ans, vec_ans);
		DispPos();

		// 除算
		cout << endl << "【除算】" << endl;
		vec_l = XMLoadFloat3(&f3_l);
		vec_r = XMLoadFloat3(&f3_r);
		vec_ans = XMVectorDivide(vec_l, vec_r);
		XMStoreFloat3(&f3_ans, vec_ans);
		DispPos();
	}
	else{
		cout << "DirectXMathが使えない環境です。" << endl;
	}

	rewind(stdin), getchar();	// キー入力で終了
	return 0;
}

あとがき

いろいろあってD3DX系の関数が消えて・・・

(割と昔に)ベクトル計算用のDirectXSDKに付属していた
D3DX系の関数などのヘルパー関数がいろいろあって使えなくなりました。

WindowsSDKに統合されたあとは、DirectXMathが推奨されていたが、
大手の参考書ですら、D3DXを復活させる解説ばかりして、
DirectXMathを解説していない。

入門レベルでDirectXMathを解説してくれるサイトはたくさんあったけど
自分がわかるように備忘録。

それにしても、Windows.hがインクルード必須なのにはハマッた・・・