Platform SDK: DirectX |
パフォーマンスに関する重要事項 指定の Direct3D オブジェクトによって作成されたレンダリング デバイスは、すべて同じ物理リソースを共有する。単一の Direct3D オブジェクトから複数のレンダリング デバイスを作成することは可能であるが、これらはすべて同じハードウェアを共有するため、パフォーマンスが大きく低下する。
C++ アプリケーションで Direct3D デバイスを作成するには、まず DirectDrawCreateEx 関数を呼び出して DirectDraw オブジェクトを作成し、IDirect3D7 インターフェイスを取得しなければならない。詳細については、「Direct3D へのアクセス」を参照すること。次に、IDirect3D7::CreateDevice メソッドを呼び出して Direct3D デバイスを作成する。このメソッドは、IDirect3DDevice7 インターフェイスへのポインタをアプリケーションに渡す。
次の図は、C++ で Direct3D デバイスを作成する処理を示す。
注 : 「Direct3D へのアクセス」で説明するように、DirectDraw コンポーネントは 2 つの COM オブジェクトから構成される。最新のオブジェクトは DirectDraw7 と呼ばれ、DirectDrawCreateEx 関数を呼び出すことで作成される。このオブジェクトは、IDirect3D7 インターフェイスを公開する唯一のオブジェクトである。IDirect3DDevice7 インターフェイスを公開する Direct3D デバイスを生成できるのは、このオブジェクトのみである。このようにして作成された Direct3DDevice オブジェクトは、従来の Direct3D インターフェイスを公開しない。以前の Direct3D デバイス インターフェイスを必要とするアプリケーションでは、DirectDrawCreate メソッドを使用して DirectDraw オブジェクトを作成し、次に目的のオブジェクトを作成する必要がある。
次のコードは、IDirect3Device7 インターフェイスをサポートする Direct3D レンダリング デバイスを作成する処理を示す。
LPDIRECTDRAW7 lpDD; // IDirectDraw7 インターフェイス LPDIRECT3D7 lpD3D; // IDirect3D7 インターフェイス LPDIRECTDRAWSURFACE7 lpddsRender; // レンダリング サーフェス LPDIRECT3DDEVICE7 lpd3dDevice; // D3D デバイス HRESULT hr; // DirectDraw インターフェイスを作成する。 // 現在のディスプレイ ドライバを使用する。 hr = DirectDrawCreateEx (NULL, (void **)&lpDD, IID_IDirectDraw7, NULL); if (FAILED (hr)) { // エラー処理コード } // IDirect3D7 インターフェイスを取得する。 hr = lpDD->QueryInterface (IID_IDirect3D7, (void **)&lpD3D); if (FAILED (hr)) { // エラー処理コード } // // 簡単にするために、以下のタスクのコードは省略する。 // // この時点で、アプリケーションの協調レベルを設定する必要がある。 // フルスクリーンで使用する場合は、 // ディスプレイ モードを設定する必要がある。 // ここで、プライマリ サーフェスを作成する。 // この時点で、レンダリング サーフェスを作成する。このコードでは、 // 作成されたレンダリング サーフェスは、 // 変数 lpddsRender によってポイントされているとする。 // Z バッファを使用する場合は、ここで作成する。 // この時点で、Direct3D デバイスの列挙を実行できる。 hr = lpD3D->CreateDevice (IID_IDirect3DHALDevice, lpddsRender, &lpd3dDevice, NULL);
この例では、IDirect3D7::CreateDevice メソッドを呼び出して Direct3D デバイスを作成している。ここでは、呼び出しが成功すると Direct3D HAL デバイスが作成される。
アプリケーションで作成するターゲット DirectDraw レンダリング サーフェスは、Direct3D レンダリング ターゲットとして使用できるように作成する必要がある。そのためには、DDSURFACEDESC2 構造体を IDirectDraw7::CreateSurface メソッドに渡す必要がある。DDSURFACEDESC2 構造体には ddsCaps というメンバがあり、これは DDSCAPS2 型の構造体である。DDSCAPS2 構造体には dwCaps というメンバがあり、これは、IDirectDraw7::CreateSurface を呼び出すときに DDSCAPS_3DDEVICE に設定しなければならない。
レンダリング ターゲット サーフェスをハードウェア アクセラレーション レンダリング デバイスで使用するときは、そのレンダリング ターゲット サーフェスをディスプレイ メモリで作成する必要がある (DDSCAPS_VIDEOMEMORY フラグを使用)。そうでない場合は、システム メモリでレンダリング ターゲット サーフェスを作成する (DDSCAPS_SYSTEMMEMORY フラグを使用)。
注 : 広く使用されている一部のハードウェア デバイスでは、レンダリング ターゲットおよび深度バッファ サーフェスで同じビット深度を使用する必要がある。そのようなハードウェアでは、アプリケーションで 16 ビットのレンダリング ターゲット サーフェスを使用する場合は、アタッチする深度バッファも 16 ビットでなければならない。32 ビットのレンダリング ターゲット サーフェスであれば、32 ビットの深度バッファでなければならない。8 ビットの深度バッファは、必要に応じてステンシル バッファリングに使用できる。
アプリケーションが動作するハードウェアにこのような要件があり、アプリケーションがこれを満たしていない場合、非対応サーフェスを使用するレンダリング デバイスを作成しようとすると失敗する。IDirectDraw7::GetDeviceIdentifier を使用して、この制限があるハードウェアを特定できる。
Direct3D デバイスを作成するには、まず通常の方法で DirectDraw オブジェクトを初期化して、Direct3D7 クラスへの参照を取得する必要がある。詳細については、「Direct3D へのアクセス」を参照すること。次に、Direct3D7::CreateDevice メソッドを呼び出して Direct3D デバイスを作成しなければならない。このメソッドは、Direct3DDevice7 クラス オブジェクトへの参照を返す。
次の図は、Visual Basic で Direct3D デバイスを作成する処理を示す。
次のコードは、Visual Basic で Direct3D デバイスを作成する処理を示す。
' この例では、g_dx 変数に DirectX7 オブジェクトへの ' 有効な参照が格納されている。 Private Sub Test() On Local Error Resume Next Dim ddraw As DirectDraw7 ' DirectDraw7 クラス Dim d3d As Direct3D7 ' Direct3D3 クラス Dim ddsRender As DirectDrawSurface7 ' レンダリング サーフェス Dim d3dDev As Direct3DDevice7 ' Direct3D デバイス ' DirectDraw7 オブジェクトを作成する。 ' 現在のディスプレイ ドライバを使用する。 Set ddraw = g_dx.DirectDrawCreate("") If Err.Number <> DD_OK Then ' エラー処理コード End If ' Direct3D7 オブジェクトを取得する。 Set d3d = ddraw.GetDirect3D If Err.Number <> DD_OK Then ' エラー処理コード End If ' ' 簡単にするために、以下のタスクのコードは省略してある。 ' ' ここで、アプリケーションの協調レベルを設定する必要がある。 ' フルスクリーンで使用する場合は、 ' ディスプレイ モードを設定する必要がある。 ' ここで、プライマリ サーフェスを作成する。 ' ここで、レンダリング サーフェスを作成する。このコードでは、 ' 作成されたレンダリング サーフェスは、 ' 変数 ddsRender によってポイントされているとする。 ' Z バッファを使用する場合は、ここで作成する。 ' この時点で、Direct3D デバイスの列挙を実行できる。 Set d3dDev = d3d.CreateDevice("IID_IDirect3DHALDevice", ddsRender) End Sub
このコードでは、Direct3D7.CreateDevice メソッドを呼び出して Direct3D デバイスを作成している。この例では、呼び出しが成功すると Direct3D HAL デバイスが作成される。
アプリケーションで作成するターゲット DirectDraw レンダリング サーフェスは、Direct3D レンダリング ターゲットとして使用できるように作成する必要がある。そのためには、DDSURFACEDESC2 変数を DirectDraw7::CreateSurface メソッドに渡す必要がある。DDSURFACEDESC2 型には、DDSCAPS2 型の ddsCaps というメンバがある。DDSCAPS2 型には lCaps というメンバがあり、これは、DirectDraw7::CreateSurface を呼び出すときに DDSCAPS_3DDEVICE に設定しなければならない。
レンダリング ターゲット サーフェスをハードウェア アクセラレーション レンダリング デバイスで使用するには、そのレンダリング ターゲット サーフェスをディスプレイ メモリで作成する必要がある (DDSCAPS_VIDEOMEMORY フラグを使用)。そうでない場合は、システム メモリでレンダリング ターゲット サーフェスを作成する (DDSCAPS_SYSTEMMEMORY フラグを使用)。
注 : 広く使用されている一部のハードウェアでは、レンダリング ターゲットおよび深度バッファ サーフェスで同じビット深度を使用する必要がある。そのようなハードウェアでは、アプリケーションで 16 ビットのレンダリング ターゲット サーフェスを使用する場合は、アタッチする深度バッファも 16 ビットでなければならない。32 ビットのレンダリング ターゲット サーフェスであれば、32 ビットの深度バッファでなければならない。8 ビットの深度バッファは、必要に応じてステンシル バッファリングに使用できる。
アプリケーションが動作するハードウェアにこのような要件があり、アプリケーションでこれお満たしていない場合、非対応サーフェスを使用するレンダリング デバイスを作成しようとすると失敗する。