Direct3D
Direct3Dは、3Dグラフィックスを描画するためのAPIである。マイクロソフトのDirectXの一部であり、様々なWindows(主にWindows 95以上)で動作し、さらに、家庭用ゲーム機であるXbox及びXbox 360のグラフィックAPIのベースでもある。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]。
- インプット・アセンブラ: パイプラインにデータを提供する。
- バーテックスシェーダー: 行列演算、スキニング、頂点ライティングといった単一の頂点処理を実行する。頂点シェーダーとも呼ばれる。
- ジオメトリシェーダー: 頂点シェーダーの出力である、プリミティブ全体(三角形、直線または頂点)を処理する。それらのエッジ調整プリミティブを処理することもある。プリミティブが与えられ、このステージでこれを取り除いたり新しいプリミティブを生成したりする。
- ストリーム・アウトプット: 前のステージの結果をメモリに保存する。データをリサイクルしてパイプラインに戻すことは有用である。
- ラスタライザー: プリミティブをピクセルにラスタライズし、見えないところはクリッピングする。
- ピクセルシェーダー: ラスタライザーの出力、すなわち各ピクセルの色などを制御・決定する。ライティングをこのピクセルシェーダーで行なうこともある(en:Per-pixel lighting、ピクセル単位ライティング)。
- アウトプット・マージャー: 最終結果を生成するために様々な形式の出力データ(ピクセルシェーダーやデプス、ステンシル等)を合成する。
全てのパイプラインステージは自由に組み合わせることができる。
[編集] 例
- Direct3D 7(固定機能)で三角形を描画する例。
// 3頂点のポリゴンを表す頂点配列を定義。 D3DLVERTEX v[3]; // 頂点定義 v[0]=D3DLVERTEX(D3DVECTOR(0.0f, 5.0f, 10.0f), 0x00FF0000, 0, 0, 0); // 頂点定義 v[1]=D3DLVERTEX(D3DVECTOR(0.0f, 5.0f, 10.0f), 0x0000FF00, 0, 0, 0); // 頂点定義 v[2]=D3DLVERTEX(D3DVECTOR(0.0f, 5.0f, 10.0f), 0x000000FF, 0, 0, 0); // 三角形を描画するメソッドの呼び出し。 // pDevice は IDirect3DDevice7 インターフェイスへのポインタ。 pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, v, 3, 0);
- Direct3D 9(固定機能)で三角形を描画する例。
// ひとつのカスタム頂点情報を表す構造体。 struct MyLVertex { D3DXVECTOR3 Position; // float x3 D3DCOLOR Color; // unsigned long x1 }; // 3頂点のポリゴンを表す頂点配列を定義。 const MyLVertex pVertexArray[] = { D3DXVECTOR3(0.0f, +1.0f, 0.5f), D3DCOLOR_ARGB(255, 255, 0, 0), D3DXVECTOR3(+1.0f, 0.0f, 0.5f), D3DCOLOR_ARGB(255, 0, 255, 0), D3DXVECTOR3(-1.0f, 0.0f, 0.5f), D3DCOLOR_ARGB(255, 0, 0, 255), }; // 三角形を描画するメソッドの呼び出し。 // pD3DDevice は IDirect3DDevice9 インターフェイスへのポインタ。 pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE); // FVF = Flexible Vertex Format の設定。 pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, pVertexArray, sizeof(MyLVertex));
- プログラマブルシェーダーに関して
Direct3D 9のプログラマブルシェーダーを利用する場合は、上記の固定機能シェーダーを利用した方法は使用できず、シェーダープログラムを別途作成する必要がある。ただし、Direct3D 9の場合は、プログラマブル頂点シェーダーと固定機能ピクセルシェーダーを組み合わせることも可能である。 また、Direct3D 10およびDirect3D 11においてはFVFおよび固定機能シェーダーが存在しないので、必ず頂点レイアウトおよびシェーダープログラムを作成する必要がある(描画するためには少なくとも頂点シェーダーとピクセルシェーダーの2つを作成する必要がある)。
[編集] ディスプレイモード
Direct3Dは2つの異なるディスプレイモードがある。
- エクスクルーシブモード(排他モード)
- Direct3Dとディスプレイドライバを直接接続するため、Direct3Dデバイスは全画面表示が可能である。アプリケーションがエクスクルーシブモードである間はディスプレイデバイスの使用要求は失敗する。
- ウィンドウモード
- ウィンドウ内の領域に結果が表示される。Direct3Dは画面を完成させるためにGDIと通信する必要がある。
ウィンドウモードはエクスクルーシブモードよりも遅いが、画面を占有しないためデバッグに役立つ。
[編集] 変遷
- Direct3D (DirectX3~DirectX5)
- レンダリングパイプラインアーキテクチャを採用し、ハードウエア抽象化レイヤー(HAL)とハードウェアエミュレーションレイヤー(HEL)の二種類のレイヤーを持ち、ハードウエア支援が得られない場合もソフトウエアのエミュレーションによって機能するよう設計された。この当時のハードウエアはレンダリングパイプラインのうち、ラスタライズのみがハードウエア化されていた。
- Direct3D 6.0
- ドリームキャストにも採用されたバージョンで、環境バンプマップやトライリニアフィルタリング、ミップマップ、テクスチャ圧縮などをサポートしていた。
- Direct3D 7.0
- ハードウエアによる座標変換とライティングを行うハードウェアT&L、一枚のポリゴンに複数のテクスチャを同時に貼るマルチテクスチャやキューブマップをサポートした。
- Direct3D 8.0
- Xboxなどに採用されたバージョンで、原始的なプログラマブルシェーダーを初めてサポートした。その他にも、ボリュームテクスチャ、マルチサンプルレンダリングをサポート。リファレンスラスタライザ以外のソフトウェアレンダラを廃止。
- Direct3D 8.1
- Windows XPに標準搭載されている。プログラマブルシェーダー1.1、1.2、1.3、および1.4をサポートする。
- Direct3D 9.0
- 浮動小数点実数テクスチャ、およびプログラマブルシェーダー2.0をサポートした。また、プログラマブルシェーダーを記述するための高級言語「HLSL」に対応した。
- Direct3D 9.0c
- プログラマブルシェーダー3.0をサポートした。プログラマブルシェーダー3.0は、頂点シェーダーからテクスチャマップにアクセス(VTF)することができるため、ディスプレースメントマッピングなどが実現できる。Xbox 360 GPUの機能はほぼこのバージョンに準ずる。
- Direct3D 9.0Ex
- Windows Vista以降に搭載された、Windows Display Driver Model (WDDM) に対応するように変更が施されたバージョン。Vistaのデスクトップ描画(Windows Aero)にはこのD3D 9Exが使用されている。
- Direct3D 10.0
- 共通層であるDirectX グラフィックス インフラストラクチャー(DXGI)を導入したバージョン。Windows Vista以降で動作する。ジオメトリシェーダーなどプログラマブルシェーダー4.0をサポートする一方、固定機能シェーダーおよびCaps(Capabilities)ビットなどを廃止し、またDirect3D 10非対応のハードウェア上では動作しない。
- Direct3D 10.1
- Direct3D 10.0のマイナーチェンジ。Windows Vista SP1以降で動作する。CapsビットがFeature Levelの形で限定的に復活し、ハードウェアの対応度に応じたFeature Levelで動作させることができる。プログラマブルシェーダー4.1をサポートする。DXGI 1.1に対応したWindows 7のデスクトップ描画にはこのD3D 10.1が使用されている[1]。
- Direct3D 11.0
- Windows Vista SP2およびWindows 7上で動作する。プログラマブルシェーダー5.0をサポートし、頂点シェーダーとジオメトリシェーダーの間に、ハードウェアテッセレーション(サブディビジョンサーフェイス)を実現するステージとして、新たにハルシェーダー・テッセレータ・ドメインシェーダーが追加されている。
- Direct3D 11.1
- Direct3D 11.0のマイナーチェンジ。Windows 8に標準搭載されることが予定されている。DXGIのバージョンは1.2となる。
[編集] 参考文献
- ^ Microsoft DirectX SDK Readme (October 2006)
- ^ “Software Rasterizer for DirectX 9.0 SDK”. 2008年5月4日閲覧。
- ^ “Direct3D Resources - Memory pool”. 2008年5月4日閲覧。
- ^ “Direct3D 9.0 パイプラインの図”. 2008年5月4日閲覧。
- ^ “Direct3D 10 パイプラインのステージ”. 2008年5月4日閲覧。
[編集] 関連項目
- High Level Shader Language - HLSL
- Microsoft DirectX - Direct3Dが実装されているAPIの集合
- OpenGL - Direct3Dの最大のライバル
- DirectDraw
- Direct2D
- DirectWrite
- WPF
- 3次元コンピュータグラフィックス
[編集] 外部リンク
- DirectX website
- DirectX 10: The Future of PC Gaming DirectX 10の新機能について議論している技術文章でありゲーム業界に影響がある。