【C++】DirectXにおける3Dアニメーションプログラミングを分析する~その3

今回はDirectXで3Dアニメーションをするための準備段階である、DirectXデバイスコンテキストの初期化処理の部分に絞ってコード解析をしてみた。

この部分はほぼ決まり文句ということもあって、とりあえず毎行コメントを追記したソースを読みやすく直列化して貼り付けておく。

ちなみに、DirectX関連のコードのみ抽出し、メソッド分けやエラー処理などアプリケーションの制御系のコードは省略しいます。

大まかな処理のブロックは下記のとおり。

①DirextXデバイスコンテキストを取得するための構造体を埋める
②DirextXデバイスコンテキストを取得する
③DirextXデバイスコンテキストの環境設定系
④DirextXデバイスコンテキストのフォグ設定

//DirectXのコンテキストを作成する
direct3d = Direct3DCreate9(D3D_SDK_VERSION);

//========================================
//①プレゼンテーションパラメータ設定
//========================================
//プレゼンテーションパラメータを初期化する
ZeroMemory(&d3dpp, sizeof(d3dpp));

//バックバッファのサイズ指定
d3dpp.BackBufferWidth	= width;
d3dpp.BackBufferHeight	= height;

//デスクトップ設定を使う
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

//バックバッファの数
d3dpp.BackBufferCount	= 1;

//スワップ エフェクトを定義する。
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

//ウィンドウハンドラ
d3dpp.hDeviceWindow = hwnd;

//ウィンドウかフルスクリーン
d3dpp.Windowed = (!fullscreen);

//スワップチェーンのバックバッファをプレゼンテーションできる最大レート。
//ウィンドウスワップチェーンの場合、この値は D3DPRESENT_INTERVAL_DEFAULT (0) でなければならない。
//フルスクリーン スワップチェーンの場合は、D3DPRESENT_INTERVAL_DEFAULT、
//または D3DPRESENT に列挙されるいずれかのフラグに対応する値を設定できる。
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

//ステンシルバッファとは、3次元グラフィックス(3DCG)において、
//物体の重ね合わせなどにより描画しなくても良い領域を効率よく判定するために用意された特殊なバッファ領域。
//デバイスによる深度ステンシルバッファの作成を可能にする値を取得または設定する。
//true の場合は、Direct3D がアプリケーションのために深度バッファを管理する。
d3dpp.EnableAutoDepthStencil = TRUE;

//デバイスが作成する深度ステンシル サーフェイスの DepthFormat を取得または設定します。
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;

//デバイスまたはスワップ チェーンを作成して z バッファの破棄を有効にするときは、このフラグを設定する。
d3dpp.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;

//ハードウェアの能力を表す構造体
D3DCAPS9 caps;

DWORD behavior;

//ハードウェアの能力を表す構造体を読み込む
result = direct3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

//ハードウェアのみの処理
behavior = D3DCREATE_HARDWARE_VERTEXPROCESSING;

//========================================
//②表示デバイスコンテキスト作成
//========================================
//ダイレクト3Dデバイスの作成
result = direct3d->CreateDevice(
	D3DADAPTER_DEFAULT,
	D3DDEVTYPE_HAL,
	hwnd,
	behavior,
	&d3dpp, 
	&device3d);

//========================================
//③レンダリング用の環境設定
//========================================
// Zバッファー処理を有効にする
device3d->SetRenderState(D3DRS_ZENABLE, TRUE);

// カリング設定
//device3d->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
device3d->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

// ライトを有効にする
device3d->SetRenderState(D3DRS_LIGHTING, TRUE);

// アンビエントライト(環境光)を設定する
device3d->SetRenderState(D3DRS_AMBIENT, 0x00000000);

// スペキュラ(鏡面反射)を有効にする
device3d->SetRenderState(D3DRS_SPECULARENABLE, TRUE);

// アルファブレンディング有効
device3d->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
//ブレンディング係数は、(As, As, As, As)。
device3d->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
//ブレンディング係数は、( 1 - As, 1 - As, 1 - As, 1 - As)。
device3d->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

//========================================
//④フォグ設定
//========================================
//フォグパラメータ
const FLOAT fogStart = 300;
const FLOAT fogEnd = 2000;

ZeroMemory(&caps, sizeof(D3DCAPS9));
device3d->GetDeviceCaps(&caps);

//フォグを使用する
device3d->SetRenderState(D3DRS_FOGENABLE, TRUE);
//フォグの色を設定する
device3d->SetRenderState(D3DRS_FOGCOLOR, D3DCOLOR_ARGB(150, 255, 255, 255));
//頂点フォグを使用しない
device3d->SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_NONE);
//フォグの適用方法
device3d->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
//フォグの開始位置
device3d->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&fogStart));
//フォグの終了位置
device3d->SetRenderState(D3DRS_FOGEND, *(DWORD *)(&fogEnd));

【おまけ】
前回記事で紹介した専門学校『HAL』が公開する『ゆうきたん』のMMDデータから、VMD(モーション)のみ差し替えたバージョン

4年前

コメントを残す

メールアドレスが公開されることはありません。