0.Direct3D初期化


0.DirectXとは

DirectXとはMicrosoftが作成しているWindows上でゲームなどを製作する為の様々な拡張機能を提供するプログラミングAPIです。
Direct3Dはその中で描画周りを扱う為のAPIでウィンドウズプログラミングで描画を行う場合に比べ速度や機能面で、
有利な面が多い為、ウィンドウズ上でゲームを作る場合にはこれを使用するというのが定番になっています。
今回は今私の環境で使えるDirectX9を主に扱っていきます。

1.とりあえず初期化

Direct3Dの初期化はDirect3D オブジェクトを生成する所から始まります。
それにはDirect3DCreate9()を使用します。
この関数の引数に使用するSDKのバージョンを渡すことで、そのバージョンのDirect3Dを使用することが出来ます。
生成に成功すると0以外のLPDIRECT3D9型の値が返ってくるので受け取っておきます。
LPDIRECT3D9というのはヘルプ等を見ると分かりますがIDirect3D9のポインタ型でDirectXで良く使われているインターフェースへのポインタというものです。
生成されたDirect3D オブジェクトは次に作るデバイスオブジェクトの生成やハードウェアの機能を調べたりすることに使えます。
Direct3DCreate9()の呼び出し
LPDIRECT3D9 g_pD3D_ = Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D_ == NULL) return false;
次にIDirect3D9のCreateDevice()を使ってIDirect3DDevice9を生成します。
ここではウィンドウクラスの登録で行ったような感じで構造体にデータを格納して引数に渡します。
ということでパラメータの設定部分のソースです。
デバイスの初期化用パラメータの設定
D3DPRESENT_PARAMETERS pp;
ZeroMemory(&pp, sizeof(pp));
pp.Windowed = TRUE;
pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
pp.BackBufferFormat = D3DFMT_UNKNOWN;
pp.BackBufferWidth = SCREEN_WIDTH;
pp.BackBufferHeight = SCREEN_HEIGHT;
とりあえず今回使ったメンバのみ紹介しておきます。
Windowedはウィンドウモードで初期化するか、フルスクリーンモードにするかのフラグです。
SwapEffectはバックバッファとフロントバッファのスワップの動作に関する設定値です。
SwapEffectはバックバッファとフロントバッファのスワップの動作に関する設定値です。
ほかにも幾つか種類はありますが、負荷が高くなったりマルチサンプルなどで制約が出る為通常はこの設定でいいようです。
BackBufferFormatはバックバッファのフォーマット値です。
D3DFMT_UNKNOWNに設定しておくとウィンドウモードではシステム側で勝手に現在のディスプレイの設定などを調べて適切な値を設定してくれます。
BackBufferWidth,BackBufferHeightはそれぞれバックバッファの横幅、縦幅です。
で上で設定した構造体を使ってデバイスの生成を行います。
デバイスの生成関数の呼び出し
LPDIRECT3DDEVICE9 g_pDevice_ = 0;

if(FAILED(CreateDevice
(
    Adapter,
    DeviceType,
    hFocusWindow,
    BehaviorFlags,
    pPresentationParameters,
    &g_pDevice_
)))  return false;
と上で設定した構造体以外にもいっぱい引数があるので紹介します。
(FAILEDというのはDirectXの関数で戻値になっているHRESULT型の値から関数が失敗したかどうかを判定する関数マクロです)
Adapterは使用するディスプレイ アダプタを示す値です。
IDirect3D9の関数などで列挙したものを使うようですが、とりあえずD3DADAPTER_DEFAULTを設定しておけばいいでしょう。
DeviceTypeは作成するデバイスの種類値です。
D3DDEVTYPE_HALを設定するとハードウェアを使って描画出来るため、
D3DDEVTYPE_REFを設定してソフトウェアで描画するよりも高速になりますが、
ハードウェアが対応していない場合はデバイスの生成に失敗しますので注意が必要です。
hFocusWindowはフォーカス設定するウィンドウのハンドルです。
BehaviorFlagsはデバイスに関するオプション設定用フラグです。
pPresentationParametersは先ほど設定した構造体です。
g_pDevice_は生成されたデバイスを受け取る為にポインタのポインタを渡します。
でFAILEDがfalseであれば生成は成功です。
もし失敗している場合はデバイスの種類をD3DDEVTYPE_REFにしてみると成功するかもしれません。
とここまででDirect3Dの初期化が終わりました。
続きまして基本の描画ルーチンを見ていきます。

1.基本の描画処理

描画の流れ
//バックバッファをクリア
g_pDevice_->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(64, 64, 64), 1.0f, 0);

//描画開始の宣言
if(SUCCEEDED(g_pDevice_->BeginScene()))
{
    //ここで今後もろもろ描画
}
//描画終了の宣言
g_pDevice_->EndScene();

//バックバッファをフロントバッファに出力
g_pDevice_->Present(NULL, NULL, NULL, NULL);
基本の流れは上のような流れになります。
Clear()でRGB(64, 64, 64)の色で描画先のクリアを行い、BeginScene()EndScene()の中でもろもろの描画を行っていき、
最終的な描画結果をPresent()によって出力するというような流れになっています。
で生成したものは解放しなければならないので次の解放処理へ進みます。

2.解放処理

解放の流れ
if(g_pDevice_ != 0){ g_pDevice_->Release(); g_pDevice_ = 0; }
if(g_pD3D_ != 0){ g_pD3D_->Release(); g_pD3D_ = 0; }

return true;
と解放自体はそれぞれのオブジェクトのRelase()を呼んでポインタを0でリセットしておくだけでいいので簡単です。
ということでこれでDirect3Dを使ったシンプルなアプリケーションが作れたので次回は文字列の描画を行いそうです。
今回のソース。
戻る。