Platform SDK: DirectX

Direct3D デバイスの作成

パフォーマンスに関する重要事項  指定の Direct3D オブジェクトによって作成されたレンダリング デバイスは、すべて同じ物理リソースを共有する。単一の Direct3D オブジェクトから複数のレンダリング デバイスを作成することは可能であるが、これらはすべて同じハードウェアを共有するため、パフォーマンスが大きく低下する。

[C++]

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 を使用して、この制限があるハードウェアを特定できる。

[Visual Basic]

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 ビットの深度バッファは、必要に応じてステンシル バッファリングに使用できる。

アプリケーションが動作するハードウェアにこのような要件があり、アプリケーションでこれお満たしていない場合、非対応サーフェスを使用するレンダリング デバイスを作成しようとすると失敗する。