Platform SDK: DirectX

ステップ 2.3 : Direct3D を初期化する

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「Direct3D 直接モード Visual Basic チュートリアル」を参照すること。

[C++]

アプリケーションでシーンをレンダリングおよび表示するために必要なサーフェスを作成した後、DirectDraw オブジェクトの IDirect3D7 インターフェイスへのポインタを取得して、Direct3D オブジェクトを初期化することができる。このインターフェイスは、シーンのレンダリングに必要なすべてのオブジェクトを作成するのに使用する。このインターフェイスは、DirectDraw オブジェクトによって開示され、別のオブジェクトではなく、別の機能のセットを表すことに注意する。IDirect3D7 インターフェイスは、DirectDraw オブジェクトの IUnknown::QueryInterface メソッドを呼び出して取得する。Triangle の次のコードが、このタスクを実行する。

    // Direct3D にアクセスするため、DirectDraw に問い合わせる。
    g_pDD->QueryInterface( IID_IDirect3D7, (VOID**)&g_pD3D );
    if( FAILED( hr) )
        return hr;

IDirect3D7 インターフェイスへのポインタを取得すると、IDirect3D7::CreateDevice メソッドを呼び出してレンダリング デバイスを作成することができる。CreateDevice メソッドは、目的のデバイスのグローバル ユニーク識別子 (GUID)、デバイスがレンダリングするサーフェスの IDirectDrawSurface7 インターフェイスのアドレス、およびデバイス オブジェクトの作成が成功した場合にメソッドが IDirect3DDevice7 インターフェイス ポインタに設定する変数のアドレスを受け取る。チュートリアルでは、GUID をコード中に書き込んで使用しているが、実際のアプリケーションでは、デバイスを列挙して GUID を取得する必要がある。デバイスの列挙については、「Direct3D デバイスの列挙」を参照すること。

(サンプル Triangle では、デバイスの作成前にディスプレイ モードをチェックしている。ディスプレイにパレット モードが設定されている場合、コードは終了する。関連するパレットを持たないパレット サーフェスにデバイスを作成しようとすると、CreateDevice メソッドの失敗を引き起こす。これは、コードを簡単にするために行ったものである。実際のアプリケーションでは、レンダリング ターゲット サーフェスを作成し、パレットをアタッチするか、ディスプレイ モードを 16 ビット カラー以上に設定するよう、ユーザーに要求するかのどちらかを行う)。

Triangle から抜粋した次のコードが、ディスプレイ モードのチェックを行い、レンダリング デバイスを作成する。

    // ディスプレイ モードをチェックする。
    ddsd.dwSize = sizeof(DDSURFACEDESC2);
    g_pDD->GetDisplayMode( &ddsd );
    if( ddsd.ddpfPixelFormat.dwRGBBitCount <= 8 )
        return DDERR_INVALIDMODE;
 
    // ここでの GUID はコード中に書き込まれている。実際のアプリケーションでは
    // GUID をデバイスの列挙によって取得する必要がある。
    hr = g_pD3D->CreateDevice( IID_IDirect3DHALDevice, g_pddsBackBuffer,
                               &g_pd3dDevice );
    if( FAILED( hr ) )
    {
        // ハードウェア GUID が機能しない場合には、ソフトウェア デバイスを試してみる。
        hr = g_pD3D->CreateDevice( IID_IDirect3DRGBDevice, g_pddsBackBuffer,
                                   &g_pd3dDevice );
        if( FAILED( hr ) )
            return hr;
    }

CreateDevice メソッドは多くの理由から失敗することがある。最も起こりやすい原因は、プライマリ ディスプレイ デバイスが 3D 機能をサポートしない場合である。ほかの可能性として、表示ハードウェアが、現在のディスプレイ モードではレンダリングができないという場合がある。これらの可能性をデバイス列挙の際にチェックしておく必要がある。コードを簡単にするため、Triangle では、ハードウェア デバイスが作成できない場合、ソフトウェア レンダリング デバイスの作成を試みることにしている。

 :  CreateDevice メソッドは DirectDrawSurface オブジェクトへのポインタを受け取るが、レンダリング デバイスはサーフェスではない。レンダリング デバイスは、レンダリングされるシーンのグラフィックスを含むサーフェスを使用する、離散型 COM オブジェクトである。

デバイスが作成されたら、次はビューポートを作成してデバイスに割り当てる。これについては、「ステップ 2.4 : ビューポートを準備する」で説明する。