【Direct3D の初期化について】

ここでは、"d3dmain.cpp "内のInitD3D 関数について、解説を行う事にする。
void    InitD3D(HWND hWnd)
{
    g_lpD3D = Direct3DCreate8(D3D_SDK_VERSION);
    if (!g_lpD3D){
        InitFail(hWnd,"Failed to create Direct3D");
        return;
    }
    g_hWnd = hWnd;
    g_dwWindowStyle = GetWindowLong( hWnd, GWL_STYLE );
    GetWindowRect( hWnd, &g_rcWindowBounds );
    GetClientRect( hWnd, &g_rcWindowClient );

    g_lpDevices = new CDeviceInformation(g_lpD3D, g_bUseDepthBuffer,
        g_dwMinDepthBits, g_dwMinStencilBits,NULL);
    if ((NULL == g_lpDevices)||( NULL == (g_Adapters = g_lpDevices->getAdapters())))
    {
        InitFail(hWnd, "BuildDeviceList Failed.");
        return;
    }
    g_dwNumAdapters = g_lpDevices->getNumAdapters();
    g_dwAdapter = g_lpDevices->getCurrentAdapter();

    //    Create device with hardware geometry engine.
    if (FAILED(::Initialize3DEnvironment(hWnd))){
        InitFail(hWnd, "CreateDevice Failed.");
        return;
    }
    if (FAILED(g_lpD3DDEV->GetDeviceCaps(&g_CurrentDeviceCaps))){
        InitFail(hWnd, "GetDeviceCaps Failed.");
        return;
    }
    g_bCanGreaterEqual = false;
    if (g_CurrentDeviceCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL)
        g_bCanGreaterEqual = true;

    g_pHighResTimer = new CHighResTimer();
}

冒頭部分つまり、下のリストの部分は、まずは、LPDIRECT3D8 型のインターフェイスを取得している。

    g_lpD3D = Direct3DCreate8(D3D_SDK_VERSION);
    if (!g_lpD3D){
        InitFail(hWnd,"Failed to create Direct3D");
        return;
    }


続いて次の部分を見てみよう。

    g_hWnd = hWnd;
    g_dwWindowStyle = GetWindowLong( hWnd, GWL_STYLE );
    GetWindowRect( hWnd, &g_rcWindowBounds );
    GetClientRect( hWnd, &g_rcWindowClient );

アプリケーションのウインドウへのハンドラを、g_hWndというグローバル変数へ保存。
同じウインドウのスタイル属性を、グローバル変数 g_dwWindowStyle に保存。
ウインドウの外枠サイズを、g_rcWindowBounds へ保存。
ウインドウの内枠サイズを、g_rcWindowClient へ保存。

これと言って難しい事ではあるまい。


続いて次の部分。

    g_lpDevices = new CDeviceInformation(g_lpD3D, g_bUseDepthBuffer,
        g_dwMinDepthBits, g_dwMinStencilBits,NULL);

ここで、使用可能なデバイスについての情報を取得するためのクラス CDeviceInformation を生成している。
このクラスは、

CDeviceInformation.cpp
CDeviceInformation.h

にて宣言されている。これについての解説はこちらをクリック。

なお、ここでのサンプルでは g_dwMinDepthBits:16 g_dwMinStencilBits: 0 と設定している。


次の部分。

    if ((NULL == g_lpDevices)||( NULL == (g_Adapters = g_lpDevices->getAdapters())))
    {
        InitFail(hWnd, "BuildDeviceList Failed.");
        return;
    }
    g_dwNumAdapters = g_lpDevices->getNumAdapters();
    g_dwAdapter = g_lpDevices->getCurrentAdapter();

ここでは先ほどのCDeviceInformation クラスより、使用すべきグラフィックカードについての情報を取得している。


次の部分。

    //    Create device with hardware geometry engine.
    if (FAILED(::Initialize3DEnvironment(hWnd))){
        InitFail(hWnd, "CreateDevice Failed.");
        return;
    }

ここでは、Direct3D デバイスの初期化を行うルーチン Initialize3DEnvironment() を呼び出している。



    if (FAILED(g_lpD3DDEV->GetDeviceCaps(&g_CurrentDeviceCaps))){
        InitFail(hWnd, "GetDeviceCaps Failed.");
        return;
    }

デバイスについての情報をグローバル変数 g_CurrentDeviceCaps へ保存。



    g_bCanGreaterEqual = false;
    if (g_CurrentDeviceCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL)
        g_bCanGreaterEqual = true;


アルファ比較関数のD3DCMP_GREATEREQUAL が使えるかどうかを g_bCanGreaterEqual へ保存。



    g_pHighResTimer = new CHighResTimer();

ここではクラス CHighResTimer のインスタンスを生成している。
このクラスは、
にて宣言されている。

クラス CHighResTimer ついては、ここをクリック