Platform SDK: DirectX

DirectDraw オブジェクトと Direct3D

Direct3D は、COM オブジェクトとインターフェイスによって実装される。C++ で記述されたアプリケーションからはこれらのインターフェイスとオブジェクトに直接アクセスできるが、Visual Basic アプリケーションの場合は、Visual Basic アプリケーションから DirectX ランタイムにデータを配置する、DirectX for Visual Basic クラスとして現れるコード レイヤとの相互処理を行う。ここでは、C++ に固有の情報として、DirectDraw と Direct3D 間の重要な関係について説明する。さらに、その後で、DirectX for Visual Basic で公開されるクラス間の同様の関係について詳しく説明する。

[C++]

Direct3D インターフェイスは、実際には DirectDraw オブジェクトへのインターフェイスである。DirectDraw では、DirectDraw と Direct3D の両方のステートをカプセル化する単一の統一オブジェクトを使用できる。DirectDraw オブジェクトは、アプリケーションで最初に作成され、最後に解放されるオブジェクトである。DirectDraw オブジェクトはディスプレイ デバイスを表し、ディスプレイ デバイスは Direct3D の最も重要な機能の多くを実装していることから、Direct3D の機能は DirectDraw に組み込まれている。

 :  DirectX 7.0 では、Direct3D にアクセスする DirectDraw オブジェクトを 2 つの方法で作成できる。1 つは新しい DirectDrawCreateEx 関数を使用する方法で、もう 1 つは旧リリースの DirectX の DirectDrawCreate 関数を使用する方法である。DirectDrawCreateEx 関数は、DirectX 7.0 の Direct3D インターフェイスの最新セットを公開できる DirectDraw オブジェクトを作成する。一方、DirectDrawCreate 関数も DirectDraw オブジェクトを作成するが、このオブジェクトは DirectX 7.0 の機能をサポートする Direct3D インターフェイスを生成することはできない。このドキュメントでは、すべてのアプリケーションで DirectDrawCreateEx 関数を使用して DirectDraw オブジェクトが作成されることを前提とする。詳細については、「Direct3D インターフェイス」および「デバイス インターフェイス」を参照すること。

つまり、Direct3D ドライバのステートの寿命は DirectDraw オブジェクトの寿命と同じである。Direct3D インターフェイスを解放しても、Direct3D ドライバのステートは破壊されない。このステートが破壊されるのは、DirectDraw 参照の場合でも Direct3D 参照の場合でも、DirectDraw オブジェクトへの参照がすべて解放されるときである。したがって、DirectDraw ドライバ インターフェイスへの参照を保持している間に Direct3D インターフェイスをいったん解放しても、その後で再び Direct3D インターフェイスを問い合わせると、Direct3D のステートが保持されている。

DirectDrawCreateEx 関数で作成した DirectDraw オブジェクトには、単一の Direct3D インターフェイス IDirect3D7 が含まれる (従来の DirectDrawCreate 関数で作成した DirectDraw オブジェクトの場合は、従来のインターフェイス IDirect3DIDirect3D2、および IDirect3D3 がサポートされる。これらのインターフェイスは現在は使用されていないが、後方互換性のために提供される)。新しいアプリケーションでは、IDirect3D7 インターフェイスを使用してほかの Direct3D オブジェクトを作成する必要がある。詳細については、「Direct3D インターフェイス」を参照すること。

[Visual Basic]

DirectDraw と Direct3D は、実際のところ、基本的には同じルート オブジェクトであり、同じコードを多数共有するにもかかわらず、DirectX for Visual Basic ではこれらのオブジェクトの使用方法に応じて、機能的に異なるクラスとして公開される。DirectX for Visual Basic では、アプリケーションでオブジェクトを作成するときの基になる DirectDraw7 および Direct3D7 クラスを使用する。(このトピックの C++ の部分で説明したように) DirectDraw と Direct3D の基本となる関係は、Visual Basic の内部からでも明らかである。グローバル DirectX7 クラスには、DirectDraw7 オブジェクトを作成するメソッドが含まれているが、Direct3D 用の同様のメソッドは含まれていない。その代わり、DirectDraw7 クラスは Direct3D7 クラスを取得するメソッドを定義し、このメソッドは DirectDraw7.GetDirect3D と呼ばれる。これら 2 つのクラスは、実際には DirectX 内の同じオブジェクトを参照するためである。

GetDirect3D メソッドは新しいオブジェクトを作成しない。その代わり、Direct3D 関連機能を公開する新しいクラスを作成する。このとき公開されるのは、このクラスを作成した DirectDraw オブジェクトによって提供される Direct3D 関連機能である。

DirectDraw7 クラスにはディスプレイ デバイス用の 2D 機能があり、Direct3D7 クラスにはデバイス用の 3D 機能がある。DirectDraw7 クラスを使用して、Direct3D クラスでレンダリング ターゲット、深度バッファ、およびテクスチャに使用するサーフェスを作成する。その後、Direct3D クラスを使用して、頂点バッファ、列挙クラスなど Direct3D オブジェクトで必要となる従属オブジェクトを作成する。