この節では、Microsoft® Direct3D® 保持モードオブジェクトおよびCOMアーキテクチャについて解説する。次の項目について説明する。
- 「Direct3D保持モードオブジェクト」では、Direct3D保持モードオブジェクトについて簡単に説明する。
- 「オブジェクトとインターフェイス」では、各オブジェクトがサポートするインターフェイス、および、単一オブジェクトと配列オブジェクトの両方に、インターフェイスを作成するための情報を列挙している。
- 「オブジェクトと参照カウント」では、Direct3D保持モードの参照カウントに関するヒントを与える。
Direct3D保持モードへのアクセスは、わずかな数のオブジェクトを通して行われる。以下の表にこれらのオブジェクトをリストアップし、それぞれについて簡単に説明する。
オブジェクト | 説明 |
---|---|
Direct3DRMAnimation2 | 多くの場合、Direct3DRMFrame3オブジェクトに関連して、変換をいかに変更するかを定義する。 したがって、このオブジェクトを使用してDirect3DRMVisual、Direct3DRMLightおよびDirect3DRMViewport2オブジェクトの位置、方向およびスケールのアニメーションを行うことができる。Direct3DRMAnimationオブジェクトと同じだが、アニメーションのキーとフレームにアクセスできる。 |
Direct3DRMAnimationArray | 配列のアニメーション数、および要求したアニメーションへのインターフェイスを取得する。 |
Direct3DRMAnimationSet2 | Direct3DRMAnimation2オブジェクトをグループ化する。Direct3DRMAnimationSetオブジェクトと同じだが、構成要素アニメーションにアクセスできる。 |
Direct3DRMClippedVisual | レンダリング前に、ビジュアルを任意のプレーンにクリッピングできる。 |
Direct3DRMDevice3 | レンダラのビジュアル表示先を表す。Direct3DRMDevice2オブジェクトを拡張して、ユーザによるマテリアルの設定と取得を可能にした。Direct3DRMDevice2はDirect3DRMDeviceオブジェクトと同じ機能を持つが、透明度の制御が拡張されている。 |
Direct3DRMFace2 | メッシュ上の1つのポリゴンを表す。 |
Direct3DRMFrame3 | シーンにオブジェクトを配置し、ビジュアルオブジェクトの位置や向きを定義する。フレーム軸、境界ボックス、およびマテリアルに対するアクセスを有効にすることによって、Direct3DRMFrameオブジェクトを拡張する。光線ピックもサポートする。Direct3DRMFrame2オブジェクトを拡張して、変換、トラバーサル、フォグ処理の機能を追加した。 |
Direct3DRMInterpolator | アクションを格納し、中間値を自動計算してオブジェクトにそのアクションを適用する。 |
Direct3DRMLight | 5種類の照明の1つを定義し、シーンのビジュアルオブジェクトを彩色するために用いられる。 |
Direct3DRMMaterial2 | サーフェスの反射特性を定義する。Direct3DRMMaterialオブジェクトと同じだが、マテリアルのプロパティを、より細かく調整できる。 |
Direct3DRMMesh | ポリゴンの面のセットを含む。面や頂点のグループを操作するために使うことができる。 |
Direct3DRMMeshBuilder3 | メッシュにある個々の頂点や面を操作することができる。Direct3DRMMeshBuilderオブジェクトを拡張して、法線に対する制御を強化し、メッシュの面を取得可能にした。Direct3DRMMeshBuilder2オブジェクトを拡張して、IDirect3DRM3インターフェイスによる作成時に、直接モードのDrawPrimitiveインターフェイスを使用するようにした。 |
Direct3DRMObject | Direct3Dの他のすべての保持モードオブジェクトによって基本クラスとして用いられる。すべてのオブジェクトに共通な特徴を保持している。 |
Direct3DRMObject2 | Direct3Dの他のすべての保持モードオブジェクトによって基本クラスとして用いられる。すべてのオブジェクトに共通な特徴を保持している。Direct3DRMObjectを拡張して、オブジェクトにデータを、より柔軟に関連付けられるようにした。 |
Direct3DRMPickedArray | 与えられた2Dの点に対応するビジュアルオブジェクトを識別する。 |
Direct3DRMPicked2Array | 与えられた光線の交線に対応するビジュアルオブジェクトを識別する。 |
Direct3DRMProgressiveMesh | “メッシュを段階的に詳細なものにする方法を記述するレコード”と“粗いベースメッシュ”で構成される。これは、一般的なレベルの詳細項目をメッシュ上でセットするとともに、リモートソースからのメッシュを段階的にダウンロードすることも可能にする。 |
Direct3DRMShadow2 | 影を定義する。Direct3DRMShadowオブジェクトと同じだが、影のプロパティを設定したり、作成後に取得することができる。 |
Direct3DRMTexture3 | 色の付いたピクセルが矩形に並んで構成される。Direct3DRMTextureオブジェクトと同じであるが、現在実行しているファイル以外のファイルからリソースをロードでき、テクスチャはメモリのイメージから作成でき、またミップマップを生成できる点が異なる。Direct3DRMTexture2オブジェクトを拡張して、テクスチャ管理を詳細に行えるようにした。 |
Direct3DRMUserVisual | システムが提供しない機能を実現する。アプリケーションによって定義される。 |
Direct3DRMViewport2 | 3Dシーンがどのように2Dウィンドウにレンダリングされるかを定義する。Direct3DRMViewportオブジェクトと同じだが、クリアする対象を指定できる。 |
Direct3DRMVisual | シーンにレンダリングすることができる。ビジュアルオブジェクトは可視状態でなくてもよい。たとえば、フレームをビジュアルオブジェクトとして追加することもできる。 |
Direct3DRMWrap | 面やメッシュのテクスチャ座標を計算する。 |
多くのオブジェクトは、配列オブジェクトと呼ばれる配列にグループ化することができる。配列オブジェクトによって、グループ全体に操作を適用することが容易になる。配列オブジェクトを使うことができるCOM(Component Object Model)インターフェイスには、GetElementとGetSizeメソッドが含まれている。これらのメソッドは、配列要素へのポインタと配列のサイズを受け取る。配列インターフェイスの詳細については、「インターフェイスリファレンス」を参照すること。
IObjectName::QueryInterfaceは、オブジェクトがそのインターフェイスをサポートしている場合のみ、有効なインターフェイスへのポインタを取得する。したがって、IDirect3DRMDevice3::QueryInterfaceを使ってIDirect3DRMWinDeviceインターフェイスを受け取ることはできるが、IDirect3DRMVisualインターフェイスを受け取ることはできない。
オブジェクト名 | サポートされるインターフェイス |
Direct3DRMAnimation2 | IDirect3DRMAnimation2 |
Direct3DRMAnimationSet2 | IDirect3DRMAnimationSet2 |
Direct3DRMClippedVisual | IDirect3DRMClippedVisual, IDirect3DRMVisual |
Direct3DRMDevice3 | IDirect3DRMDevice3, IDirect3DRMWinDevice |
Direct3DRMFace2 | IDirect3DRMFace2 |
Direct3DRMFrame3 | IDirect3DRMFrame3, IDirect3DRMVisual |
Direct3DRMInterpolator | IDirect3DRInterpolator |
Direct3DRMLight | IDirect3DRMLight |
Direct3DRMMaterial2 | IDirect3DRMMaterial2 |
Direct3DRMMesh | IDirect3DRMMesh, IDirect3DRMVisual |
Direct3DRMMeshBuilder3 | IDirect3DRMMeshBuilder3, IDirect3DRMVisual |
Direct3DRMProgressiveMesh | IDirect3DRMProgressiveMesh, IDirect3DRMVisual |
Direct3DRMShadow2 | IDirect3DRMShadow2, IDirect3DRMVisual |
Direct3DRMTexture3 | IDirect3DRMTexture3, IDirect3DRMVisual |
Direct3DRMUserVisual | IDirect3DRMUserVisual, IDirect3DRMVisual |
Direct3DRMViewport2 | IDirect3DRMViewport2 |
Direct3DRMWrap | IDirect3DRMWrap |
次のサンプルでは、1つのDirect3DRMDevice3オブジェクトに2つのインターフェイスを生成する方法を説明している。IDirect3DRM3::CreateObjectメソッドは、初期化されていないDirect3DRMDevice3オブジェクトを生成する。オブジェクトの初期化は、IDirect3DRMDevice3::InitFromClipperメソッドによって行われる。IDirect3DRMDevice3::QueryInterfaceメソッドの呼び出しは、Direct3DRMDevice3オブジェクトへの2つめのインターフェイス(WM_PAINTおよびWM_ACTIVATEメッセージへの応答時に用いられるIDirect3DRMWinDeviceインターフェイス)を生成する。
d3drmapi->CreateObject(CLSID_CDirect3DRMDevice, NULL, IID_IDirect3DRMDevice3,(LPVOID FAR*)&dev1); dev1->InitFromClipper(lpDDClipper, IID_IDirect3DRMDevice3, r.right, r.bottom); dev1->QueryInterface(IID_IDirect3DRMWinDevice, (LPVOID*) &dev2);
2つのインターフェイスが同一のオブジェクトを参照しているかどうかを判定するには、それぞれのインターフェイスについてQueryInterfaceメソッドを使って、返されるポインタの値を比較する。ポインタの値が等しい場合、インターフェイスは同じオブジェクトを参照している。
すべてのDirect3D保持モードオブジェクトは、前述したリスト中のインターフェイスに加え、IDirect3DRMObjectインターフェイスとIDirect3DRMObject2インターフェイス、IUnknownインターフェイスをサポートしている。IDirect3DRMObjectは配列オブジェクトを提供しない。配列オブジェクトは、必要がないため、クラス識別子(CLSID)を持っていない。IDirect3DRM3::CreateObjectメソッドの呼び出しでは、配列オブジェクトを作成することはできない。その代わり、各インターフェイスについて以下の生成メソッドを使用する。
オブジェクトが生成されると、その参照カウントがインクリメントされる。アプリケーションがオブジェクトの子を作成したり、メソッドがオブジェクトへのポインタを返したりするたびに、システムはそのオブジェクトの参照カウントを増加させる。オブジェクトは、参照カウントが0になるまで削除されることはない。オブジェクトに対する操作が完了したら、Releaseメソッドを呼び出して、参照カウントを必ずデクリメントする。たとえば、IDirect3DRM3::CreateMeshBuilderを呼び出してIDirect3DRMMeshBuilder3オブジェクトを作成し、IDirect3DRMMeshBuilder3::GetFacesを呼び出してIDirect3DRMFaceArrayオブジェクトを取得したとする。この場合、アプリケーションを終了する前に、IDirect3DRMMeshBuilder3オブジェクトのReleaseメソッドを呼び出し、IDirect3DRMFaceArrayオブジェクトのReleaseメソッドも呼び出す。Releaseメソッドを呼び出さないと、オブジェクトは適切に解放されず、リソースが浪費される。オブジェクトを解放するサンプルについては、Direct3D保持モードのサンプルコードを参照すること。
Direct3D保持モードには、内部参照カウントと外部参照カウントがある。テクスチャなどのオブジェクトを作成またはインポートし、フレームやメッシュなどのシーンにオブジェクトを適用すると、作成またはインポートしたオブジェクトのインターフェイスのコピーは解放できる。オブジェクトを使用するシーンが完了すると、そのオブジェクトはD3DRMによって自動的に解放される。たとえば、メッシュビルダオブジェクトを作成すると、参照カウントは1にセットされる。次に、オブジェクトをフレームに追加すると、参照カウントは2にセットされる。その後、メッシュビルダオブジェクトへのポインタのコピーを解放すると、メッシュビルダオブジェクトの参照カウントは1に戻される。さらに、そのフレームを含むシーンを解放すると、メッシュビルダオブジェクトの参照カウントはデクリメントされて0になり、オブジェクトが解放される。もう1つ例を示す。テクスチャをインポートすると、テクスチャオブジェクトの参照カウントは1にセットされる。テクスチャをメッシュに適用すると、参照カウントは2になる。テクスチャオブジェクトへのポインタのコピーを解放すると、参照カウントは1に戻る。メッシュを解放すると、テクスチャオブジェクトの参照カウントはデクリメントされて解放される。
シーンに適用した後でオブジェクトを解放したら、アプリケーションは参照カウントを追跡する必要はなく、シーンのルートだけ追跡すればよい。保持モードは他の参照カウントを自動的に追跡する。この場合、クリーンアップが完了してアプリケーションを終了する前に、アプリケーションは、シーン、ビューポート、デバイスを解放するだけでよい。アプリケーションがビューポートを解放すると、システムはカメラの参照カウントを自動的に調整する。
子オブジェクトやビジュアルオブジェクトの参照カウントは、フレームに追加されるときに増やされる。IDirect3DRMFrame3::AddChildメソッドを使用して、ある親オブジェクトから別の親に子オブジェクトを移動すると、システムは自動的に参照カウントを操作する。
アプリケーションがビジュアルオブジェクトをシーンにロードした後は、シーンがオブジェクトの参照カウントを管理する。アプリケーションにとっては、ビジュアルオブジェクトはもう不要となり、解放することができる。
ラップの作成と適用は、どのオブジェクトの参照カウントも増加させない。ラッピングは、単にテクスチャの座標を計算するだけの便利なメソッドにすぎないためである。
トップに戻る
© 1999 Microsoft and/or its suppliers. All rights reserved. Terms of Use.