DirectX Graphicsの初期化

DirectX Graphicsの初期化処理を解説します。

以下のサンプルはウィンドウの作成、DirectX Graphicsの初期化、画面を青でクリアするというものです。
この節ではサンプルソースのDirectX Graphicsの初期化部分について解説を行います。

サンプルソース

初期化の手順

DirectX Graphicsの初期化は処理は以下のように手順で行います。

  1. IDirect3D9 インターフェイスの取得
  2. プレゼンテーションパラメータの設定
  3. IDirect3DDevice9 インターフェイスの取得

IDirect3D9 インターフェイスの取得

IDirect3D9 インターフェイスはデバイスの機能を調べたり、他のインタフェースを作成するなどのメソッドを持っています。
IDirect3D9 インターフェイスの取得するには、Direct3DCreate9関数を使います。

サンプルではInitD3D関数の一番初めにDirect3DCreate9関数を使用してIDirect3D9 インターフェイスを取得しています。

if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) {
    return E_FAIL;
}

Direct3DCreate9関数の引数は必ずD3D_SDK_VERSIONになります。

プレゼンテーションパラメータの設定

次にプレゼンテーションパラメータの設定を行います。
プレゼンテーションパラメータとはディスプレイへの出力方法を決める情報のことです。
具体的に言えばスクリーンモード、画面の解像度、色数、フリッピングの方法、Zバッファの種類などがパラメータになります。

プレゼンテーションパラメータを表すのがD3DPRESENT_PARAMETERS構造体です。

D3DPRESENT_PARAMETERS d3dpp; 
ZeroMemory( &d3dpp, sizeof(d3dpp) ); // 全てのメンバを0クリア
d3dpp.Windowed = TRUE; // スクリーンモード (TRUE=ウインドウモード FALSE=フルスクリーンモード)
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // フリッピングの方法
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // バック バッファの色数

上記のコードではまず、ZeroMemory関数で全てのメンバを0で初期化しています。
D3DPRESENT_PARAMETERS構造体のほとんどのメンバが0がデフォルトになるためこのように行っています。

今回のサンプルはウィンドウモードのためWindowedにTRUEを指定しています。フルスクリーンモードの場合はFALSEを指定します。
SawpEffectはフリッピングの方法の指定でD3DSWAPEFFECT_DISCARDと指定すると最適な方法を自動で設定してくれます。
バック バッファの色数設定であるBackBufferFormatにはD3DFMT_UNKNOWNを指定することで現在のディスプレイモード フォーマットを自動で設定してくれます。

IDirect3DDevice9 インターフェイスの取得

IDirect3DDevice9 インターフェイスは描画処理を行うメソッドを持っています。
IDirect3DDevice9 インターフェイスを取得するにはIDirect3D9 インターフェイスのCreateDeviceメソッドを使います。

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, // 使用するビデオカード
	D3DDEVTYPE_HAL, // デバイスの種類
	hWnd, // ウィンドウハンドル
	D3DCREATE_HARDWARE_VERTEXPROCESSING, // デバイスの動作モード
	&d3dpp, // D3DPRESENT_PARAMETERS構造体のポインタ
	&g_pd3dDevice ) ) ) // IDirect3DDevice9 インターフェイスの格納先
{
	return E_FAIL;
}

CreateDeviceで重要な引数はデバイスの種類とデバイスの動作モードです。
デバイスの種類は通常の描画をハードウェアで行うか、ソフトウェアで行うかの指定になります。
D3DDEVTYPE_HALを指定することでハードウェアでの描画処理を行います。

デバイスの動作モードは頂点処理をハードウェアで行うか、ソフトウェアで行うかの指定になります。
D3DCREATE_HARDWARE_VERTEXPROCESSINGはハードウェアで、D3DCREATE_SOFTWARE_VERTEXPROCESSINGと指定すると
ソフトウェアでの頂点処理を行います。ハードウェアで処理を行った方が処理スピードが早くなります。

今回のサンプルでは最初にD3DCREATE_HARDWARE_VERTEXPROCESSINGを指定してIDirect3DDevice9 インターフェイスの作成を 試みて、失敗したらD3DCREATE_SOFTWARE_VERTEXPROCESSINGを指定しています。
これは、ビデオカードが頂点処理機能をサポートしていない場合、このメソッドが失敗してしまうためです。

初期化処理自体はこれらで完了になります。 作成したIDirect3DDevice9 インターフェイスを使うことによって画面への描画処理を行うことが出来ます。

まとめ

ソースコードを追っていけば分かりますが、IDirect3D9 インターフェイスのメソッドである、CreateDeviceを使って IDirect3DDevice9 インターフェイスを取得しています。そして、その引数にプレゼンテーションパラメータである D3DPRESENT_PARAMETERS構造体を指定しています。
つまり、IDirect3D9 インターフェイスの取得とプレゼンテーションパラメータの設定は IDirect3DDevice9 インターフェイスを取得するために必要なのです。

初期化処理とは、つまるところ、描画に必要なIDirect3DDevice9 インターフェイスの取得と言っても良いでしょう。


inserted by FC2 system