Direct3D
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Direct3DはマイクロソフトのDirectX APIの一部である。Direct3Dはマイクロソフトの様々なWindows OS(Windows 95以上)でのみ利用可能であり、家庭用ゲーム機であるXbox及びXbox 360のグラフィックAPIのベースである。Direct3Dはゲームのようなパフォーマンスが重要なアプリケーションで3Dグラフィックスをレンダリングするために利用される。Direct3Dはまたウィンドウ内で実行できるように作られたプログラムをフルスクリーンで表示するようにできる。グラフィックボードのハードウェアアクセラレーションを利用できる場合、Direct3Dはこれを利用する。3Dのレンダリングパイプラインの全体または一部がハードウェアによって高速化される。Direct3DはZバッファ、アンチエイリアス、アルファチャンネル、ミップマップ、atmospheric effects、パースペクティブコレクトテクスチャマッピングといった3Dグラフィックハードウェアの先進的なグラフィック能力を表現する。他のDirectXのテクノロジとの統合により、インタラクティブなメディアタイトルで2Dと3Dを用いて、ビデオマッピング、2Dのオーバーレイプレーンへのハードウェア3Dレンダリング、スプライトといったような機能をDirect3Dは実行できる。
Direct3Dは3D APIである。これはつまり3Dレンダリングのための様々なコマンドが含まれるということであるが、Direct3Dのバージョン8より、古いDirectDrawのフレームワークと置き換えられ、また2Dグラフィックスの責任も引き継いだ[1]。マイクロソフトは3Dグラフィックカードで利用できる最新のテクノロジをサポートすべくDirect3Dを継続して更新し続けている。Direct3Dは完全な頂点処理のソフトウェアエミュレーションを提供するが、ハードウェアがサポートしていないピクセル処理のソフトウェアエミュレーションはない。例えば、もしDirect3Dを使ってプログラムされたソフトウェアがピクセルシェーダを必要として、そしてユーザーのコンピュータのビデオカードがその機能をサポートしないなら、Direct3Dはそれをエミュレートしない。APIは一般的なグラフィックカードをエミュレートするリファレンスラスタライザ(またはREFデバイス)を定義する。ピクセルシェーダをエミュレーションするのはどんなアプリケーションでも使用に耐えないくらい遅く、普通は無視される。
Direct3Dの主な競合相手はOpenGLである。2つのAPIには考え方の合わない数多くの機能と問題がある。en:comparison of Direct3D and OpenGLを参照のこと。WineではUnix系OSでDirect3DをOpenGLを用いて実装している。
目次 |
[編集] アーキテクチャ
Direct3DはMicrosoftのDirectX APIのサブシステムコンポーネントである。グラフィックスアプリケーションとグラフィックハードウェアデバイスの間の通信を抽象化することがDirect3Dの目的である。これはGDIと比較して薄い抽象化レイヤとなっている(図参照)。COMベースのアーキテクチャによりDirect3Dはディスプレイドライバと直接接続しており、GDIと比べてレンダリングのパフォーマンスで優れた結果を得られるところがGDIとDirect3Dの最も大きな違いである。
Direct3Dはイミディエイトモード(IM)のグラフィックAPIである。これは各ビデオカードの3D機能(平行移動、クリッピング、光源、マテリアル、テクスチャ、深度バッファなど)に低レベルなインターフェイスを提供する。また現在では廃止されているリテインドモード(RM)という高レベルのコンポーネントもあった。
Direct3Dのイミディエイトモードは「デバイス」、「リソース」、「スワップチェイン」の3つの主要な抽象化を提供する(図参照)。「デバイス」は3Dシーンのレンダリングを担当する。様々なレンダリングのインターフェイスを選べる。例えばモノクロデバイスは白黒で、RGBデバイスは色を使ってレンダリングする。3種類のデバイスがある。
- HAL (hardware abstract layer)デバイス: ハードウェアアクセラレーションをサポートする場合、Direct3Dのコードはハードウェアの速度で動作可能。
- リファレンスデバイス: グラフィックハードウェアによってまだサポートされていない新機能をシミュレートする。このデバイスタイプを利用するためにはDirect3DのSDKを事前にインストールする必要がある。
- ヌルリファレンスデバイス: これは何もせず真っ暗な画面を表示する。このデバイスはSDKがインストールされていないのにリファレンスデバイスが要求された場合に使用される。
- プラグ可能ソフトウェアデバイス: ソフトウェアラスタライゼーションを実行するために利用される。以前はRegisterSoftwareDeviceメソッドでこのデバイスを提供する必要があった。このデバイスタイプはDirectX 9.0まで未使用であった。[2]
各デバイスは最低1つのスワップチェインを含む。スワップチェインは1つ以上のバックバッファサーフェス(ピクセルデータの長方形の集合と、そのピクセルの色、深さ、ステンシル、アルファ、テクスチャなどの属性)で構成される。バックバッファのどこかにレンダリングされる。
さらにデバイスもまたリソースのコレクションを含む。リソースはレンダリング中に使用される特定のデータである。各リソースは4つの属性を持つ。
- Type: サーフェス、ボリューム、テクスチャ、キューブテクスチャ、ボリュームテクスチャ、サーフェステクスチャ、インデックスバッファ、バーテックスバッファなど、リソースの種類を定義する。
- Pool:[3] 実行時にリソースがどのように管理され、どこに保存されるのかを定義する。Defaultプールはリソースがデバイスメモリ内にのみ存在することを意味している。managedプールはリソースがシステムメモリに確保され必要時にデバイスへ送られることを意味している。system memoryプールはリソースがシステムメモリ内にのみ存在することを意味している。scratchプールはシステムメモリプールと同一であるが、この場合はリソースがハードウェアの制約に縛られない。
- Format: リソースのメモリ内でのレイアウト、主にピクセルデータのレイアウトを定義する。例えばD3DFMT_R8G8B8フォーマットは24ビットのビット深度を意味する(赤8bit、緑8bit、青8bit)。
- Usage: フラグビットの集合によりアプリケーションがリソースをどのように使うのかを定義する。これらのフラグはリソースを動的にアクセスするのか静的にアクセスするのかを知るために利用される。静的リソースの値はロード後に変更できないのに対し、動的リソースの値は繰り返し変更される。
[編集] パイプライン
Direct3D 10のパイプライン[4]は下記のステージで構成される [5]。
- インプット・アセンブラ: パイプラインにデータを提供する。
- バーテックスシェーダ: 行列演算、スキニング、ライトニングといった単一の頂点処理を実行する。
- ジオメトリシェーダ: プリミティブ全体(三角形、直線または頂点)を処理しする。それらのエッジ調整プリミティブを処理することもある。プリミティブが与えられ、このステージでこれを取り除いたり新しいプリミティブを生成したりする。
- ストリーム・アウトプット: 前のステージの結果をメモリに保存する。データをリサイクルしてパイプラインに戻すことは有用である。
- ラスタライザ: プリミティブをピクセルにラスタライズし、見えないところはクリッピングする。
- ピクセルシェーダ: 色のようなピクセルの制御。
- アウトプット・マージャー: 最終結果を生成するために様々な形式の出力データ(ピクセルシェーダやデプス、ステンシル等)を合成する。
全てのパイプラインステージは自由に組み合わせることができる。
[編集] 例
Direct3Dで三角形を描画する例。
// 3頂点のポリゴンを定義 D3DLVERTEX v[3]; // 頂点定義 v[0]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x00FF0000, 0, 0, 0 ); // 頂点定義 v[1]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x0000FF00, 0, 0, 0 ); // 頂点定義 v[2]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x000000FF, 0, 0, 0 ); // 三角形を描画する関数の呼び出し pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, v, 3, 0 );
[編集] ディスプレイモード
Direct3Dは2つの異なるディスプレイモードがある。
- エクスクルーシブモード(排他モード): Direct3Dとディスプレイドライバを直接接続するため、Direct3Dデバイスは全画面表示が可能である。アプリケーションがエクスクルーシブモードである間はディスプレイデバイスの使用要求は失敗する。
- ウィンドウモード: ウィンドウ内の領域に結果が表示される。Direct3Dは画面を完成させるためにGDIと通信する必要がある。
ウィンドウモードはエクスクルーシブモードよりも遅いが、画面を占有しないためデバッグに役立つ。
[編集] 変遷
- Direct3D (DirectX3~DirectX5)
- レンダリングパイプラインアーキテクチャを採用し、ハードウエア抽象化レイヤー(HAL)とハードウェアエミュレーションレイヤー(HEL)の二種類のレイヤーを持ち、ハードウエア支援が得られない場合もソフトウエアのエミュレーションによって機能するよう設計された。この当時のハードウエアはレンダリングパイプラインのうち、ラスタライズのみがハードウエア化されていた。
- Direct3D 6.0
- ドリームキャストにも採用されたバージョンで、環境バンプマップやトライリニアフィルタリング、ミップマップ、テクスチャ圧縮などをサポートしていた。
- Direct3D 7.0
- ハードウエアによる座標変換とライティングを行うハードウェアT&L、一枚のポリゴンに複数のテクスチャを同時に貼るマルチテクスチャやキューブマップをサポートした。
- Direct3D 8.0
- Xboxなどに採用されたバージョンで、原始的なプログラマブルシェーダーを初めてサポートした。その他にも、ボリュームテクスチャ、マルチサンプルレンダリングをサポート。
- Direct3D 9.0
- 浮動小数点実数テクスチャ、およびプログラマブルシェーダー2.0をサポートした。また、プログラマブルシェーダーを書くための高級言語「HLSL」に対応した。
- Direct3D 9.0c
- プログラマブルシェーダー3.0をサポートした。プログラマブルシェーダー3.0は、頂点シェーダーからテクスチャマップにアクセスすることができるため、ディスプレースメントマッピングなどが実現できる。
[編集] 関連項目
- HLSL - High Level Shader Language
- DirectX - Direct3Dが実装されているAPIの集合
- OpenGL - Direct3Dの最大のライバル
- DirectDraw
- 3次元コンピュータグラフィックス
- Shader
[編集] 参考文献
- ^ Microsoft DirectX SDK Readme (October 2006)
- ^ "Software Rasterizer for DirectX 9.0 SDK" 2008-05-04閲覧.
- ^ "Direct3D Resources - Memory pool" 2008-05-04閲覧.
- ^ "Direct3D 9.0 パイプラインの図" 2008-05-04閲覧.
- ^ "Direct3D 10 パイプラインのステージ" 2008-05-04閲覧.
[編集] 外部リンク
- DirectX website
- DirectX 10 Wiki - DirectX 10のチュートリアル、サンプル、演出、ニュースなどを扱っているWiki。
- DirectX 10: The Future of PC Gaming DirectX 10の新機能について議論している技術文章でありゲーム業界に影響がある。