Direct3D




Direct3Dは、3Dグラフィックスを描画するためのAPIである。マイクロソフトのDirectXの一部であり、様々なWindows(主にWindows 95以上)で動作し、さらに、家庭用ゲーム機であるXbox、Xbox 360およびXbox OneのグラフィックスAPIのベースでもある。




目次






  • 1 概要


  • 2 アーキテクチャ


  • 3 パイプライン


  • 4 コード記述例


    • 4.1 プログラマブルシェーダー




  • 5 ディスプレイモード


  • 6 変遷


  • 7 参考文献


  • 8 関連項目


  • 9 外部リンク





概要


Direct3Dはゲームのようなパフォーマンスが重要なアプリケーションで利用される。そのためもあり、ウィンドウ表示だけでなく全画面表示での実行も可能となっている。可能であればグラフィックスボードのハードウェアアクセラレーションを利用し、3Dのレンダリングパイプラインの全体または一部がハードウェアによって高速化される。Direct3DはZバッファ、アンチエイリアス、アルファチャンネル、ミップマップ、atmospheric effects、パースペクティブコレクトテクスチャマッピングといった3Dグラフィックスハードウェアの先進的なグラフィックス機能を利用できる。他のDirectXのテクノロジとの統合により、インタラクティブなメディアタイトルで2Dと3Dを用いて、ビデオマッピング、2Dのオーバーレイプレーンへのハードウェア3Dレンダリング、スプライトといったような機能をDirect3Dは実行できる。


Direct3Dは3D APIである。つまり、3Dレンダリングのための様々なコマンドが含まれるということであるが、Direct3Dのバージョン8より、古いDirectDrawのフレームワークと置き換えられ、また2Dグラフィックスの機能も引き継いでいる[1][2]。マイクロソフトは3Dグラフィックスカードで利用できる最新のテクノロジをサポートすべくDirect3Dを継続して更新し続けている。Direct3Dは完全な頂点処理のソフトウェアエミュレーションを提供するが、ハードウェアがサポートしていないピクセル処理のソフトウェアエミュレーションはない。例えば、もしDirect3Dを使ってプログラムされたソフトウェアがピクセルシェーダーを必要として、そしてユーザーのコンピュータのビデオカードがその機能をサポートしないなら、Direct3Dはそれをエミュレートしない。代わりに、APIは一般的なグラフィックスカードをCPUで完全エミュレートするリファレンスラスタライザ(またはREFデバイス)を定義する。ただし、ピクセルシェーダーをCPUでエミュレーションするのはどんなアプリケーションでも使用に耐えないくらい遅く、製品版アプリケーションでの使用は想定されていない[3]。一方、Direct3D 10.1 API以降は比較的高速なソフトウェアデバイスとしてWARP(英語版)が実装されており、グラフィックスハードウェアがDirect3Dの機能レベルを十分にサポートしない場合でもカジュアルな用途であれば実用に耐えうるDirect3Dアプリケーションを作成・実行できる[4]


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の最も大きな違いである。なお、図はWindows XP/Direct3D 9までの古いモデル (XPDM) であり、Windows Vista/Direct3D 9Ex以降ではさらにDirectX/Direct3DがOSのグラフィックス根幹機能へと昇格され、GDIはすでにDirectX/Direct3Dと並列ではなくなり、DirectXランタイム(DXGIと呼ばれるDirect3Dベースのグラフィックス基盤)上にて動作することになる (WDDM)[5]


Direct3Dは"イミディエイトモード"(IM: 直接モード)のグラフィックスAPIである。これは各ビデオカードの3D機能(平行移動、クリッピング、光源、マテリアル、テクスチャ、深度バッファなど)に低レベルなインターフェイスを提供する。またDirect3D 7までは"リテインドモード"(RM: 保持モード)という高レベルのコンポーネントもあった[6]が、Direct3D 8以降では廃止されている。


Direct3Dのイミディエイトモードは「デバイス」、「リソース」、「スワップチェーン」の3つの主要な抽象化を提供する(図参照)。「デバイス」は描画に必要な処理を行うソフトウェア・ハードウェアを指す概念であり、アプリケーションは「デバイスタイプ」[7]を指定することにより、デバイスにアクセスすることができる。




HAL (hardware abstraction layer) デバイス[8]

ユーザーのコンピュータに搭載されたハードウェアアクセラレータを使用して処理を行う。ハードウェアアクセラレーションをサポートする場合、Direct3Dのコードはハードウェアの速度で動作可能。




デバイス



リファレンスデバイス

Direct3Dのほとんどの機能を忠実に実装しているが、パフォーマンスが非常に低いソフトウェアレンダラーを選択する。このデバイスタイプを利用するためにはDirect3DのSDKを事前にインストールする必要がある。

ヌルリファレンスデバイス

これは何もせず真っ暗な画面を表示する。このデバイスはSDKがインストールされていないのにリファレンスデバイスが要求された場合に使用される。

プラグ可能ソフトウェアデバイス

ソフトウェアラスタライゼーションを実行するために利用される。ソフトウェアレンダラーはDirect3Dには内蔵されていないため、アプリケーションはこれを選択するには独自のソフトウェアレンダラーをDirect3Dに登録する必要がある[9]。マイクロソフトが公式にソフトウェアレンダラーを配布している[10]


各デバイスは最低1つの「スワップチェーン」を含む。スワップチェーンは1つ以上のバックバッファサーフェス(ピクセルデータの長方形の集合と、そのピクセルの色、深さ、ステンシル、アルファ、テクスチャなどの属性)で構成される。Direct3D描画コマンドによってレンダリングはバックバッファのどこかに行なわれ、最後にPresent処理によってバックバッファからフロントバッファにピクセルデータが転送されることで画面表示が完了する。


さらにデバイスもまた「リソース」のコレクションを含む。リソースはレンダリング中に使用される特定のデータである。各リソースは4つの属性を持つ。



Type

サーフェス、ボリューム、テクスチャ、キューブテクスチャ、ボリュームテクスチャ、サーフェステクスチャ、インデックスバッファ、頂点バッファなど、リソースの種類を定義する。

Pool[11][12]

実行時にリソースがどのように管理され、どこに保存されるのかを定義する。Defaultプールはリソースがデバイスメモリ内にのみ存在することを意味している。Managedプールはリソースがシステムメモリに確保され必要時にデバイスへ送られることを意味している。System Memoryプールはリソースがシステムメモリ内にのみ存在することを意味している。Scratchプールはシステムメモリプールと同一であるが、この場合はリソースがハードウェアの制約に縛られない。

Format

リソースのメモリ内でのレイアウト、主にピクセルデータのレイアウトを定義する。例えばD3DFMT_R8G8B8フォーマットは24ビットの色深度を意味する(赤8bit、緑8bit、青8bit)。

Usage


フラグビットの集合によりアプリケーションがリソースをどのように使うのかを定義する。これらのフラグはリソースを動的にアクセスするのか静的にアクセスするのかを知るために利用される。静的リソースの値はロード後に変更できないのに対し、動的リソースの値は繰り返し変更することができる。



パイプライン




グラフィック・パイプライン・プロセス


Direct3D 10のパイプライン[13]は下記のステージで構成される[14][15]




  1. インプット アセンブラー: パイプラインにデータを提供する。


  2. バーテックスシェーダー: 行列演算、スキニング、頂点ライティングといった単一の頂点処理を実行する。頂点シェーダーとも呼ばれる。


  3. ジオメトリシェーダー: 頂点シェーダーの出力である、プリミティブ全体(三角形、直線または頂点)を処理する。それらのエッジ調整プリミティブを処理することもある。プリミティブが与えられ、このステージでこれを取り除いたり新しいプリミティブを生成したりする。


  4. ストリーム アウトプット: 前のステージの結果をメモリに保存する。データをリサイクルしてパイプラインに戻すことは有用である。


  5. ラスタライザー: プリミティブをピクセルにラスタライズし、見えないところはクリッピングする。


  6. ピクセルシェーダー: ラスタライザーの出力、すなわち各ピクセルの色などを制御・決定する。ライティングをこのピクセルシェーダーで行なうこともある(en:Per-pixel lighting、ピクセル単位ライティング)。


  7. アウトプット マージャー: 最終結果を生成するために様々な形式の出力データ(ピクセルシェーダーやデプス、ステンシル等)を合成する。


全てのパイプラインステージは自由に組み合わせることができる。




コード記述例


Direct3DはCOMで実装されており、オブジェクト指向インターフェイスを利用してアプリケーションコードを書くことになる。


  • Direct3D 7(固定機能)で三角形を描画する例。

// 3頂点のポリゴンを表す頂点配列を定義。
// X, Y, Z, Color, Specular, Tu, Tv の順。
// https://msdn.microsoft.com/en-us/library/ms896912.aspx
D3DLVERTEX v[3];
v[0] = D3DLVERTEX(D3DVECTOR(0.0f, +1.0f, 0.5f), 0x00FF0000, 0, 0, 0);
v[1] = D3DLVERTEX(D3DVECTOR(+1.0f, 0.0f, 0.5f), 0x0000FF00, 0, 0, 0);
v[2] = D3DLVERTEX(D3DVECTOR(-1.0f, 0.0f, 0.5f), 0x000000FF, 0, 0, 0);
// 三角形を描画するメソッドの呼び出し。
// pD3DDevice は IDirect3DDevice7 インターフェイスへのポインタ。
pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, v, 3, 0);

  • Direct3D 9(固定機能)で三角形を描画する例。

// ひとつのカスタム頂点情報を表す構造体。
struct MyLVertex {
D3DXVECTOR3 Position; // float x3
D3DCOLOR Color; // unsigned long x1, B8G8R8A8
};

// 3頂点のポリゴンを表す頂点配列を定義。
const MyLVertex vertexArray = {
{ 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, vertexArray, sizeof(MyLVertex));

Direct3D 7では定義済み頂点フォーマットとしていくつかの組み込みの構造体型が準備されていたが、Direct3D 9ではユーザープログラマーによる定義が必須となる。



プログラマブルシェーダー


Direct3D 9のプログラマブルシェーダーを利用する場合は、HLSL言語等を使いシェーダープログラムを別途作成して、あらかじめデバイスにセットしてから描画メソッドを呼び出す必要がある。ただし、Direct3D 9の場合は、プログラマブル頂点シェーダーと固定機能ピクセルシェーダーを組み合わせることも可能である。


また、Direct3D 10およびDirect3D 11においてはFVF、ユーザーポインタ頂点配列 (UP) および固定機能シェーダーが存在しないので、必ず頂点レイアウト、頂点バッファおよびシェーダープログラムを作成する必要がある(シーンを描画するためには少なくとも頂点シェーダーとピクセルシェーダーの2つを作成する必要があるが、深度ステンシルのみのレンダリングであればラスタライザーを無効にして頂点シェーダーだけでレンダリングすることもできる[16])。テッセレーションシェーダー(ハルシェーダー、ドメインシェーダー)およびジオメトリシェーダーに関しては必須ではなくオプションであり、またコンピュートシェーダーに関しては描画パイプラインと独立している。


Direct3D 12ではオーバーヘッド低減のため、シェーダープログラムオブジェクトの個別設定は廃止され、パイプラインステートオブジェクト (PSO) としてグラフィックスパイプラインあるいはコンピュートパイプラインごとにすべてのシェーダーステージを各種ステートとともにまとめて事前作成してから設定する方式に変更された[17][18]。もちろん固定機能シェーダーは存在しない。



ディスプレイモード


Direct3Dは2つの異なるディスプレイモードがある。



エクスクルーシブモード(排他モード)

Direct3Dとディスプレイドライバを直接接続するため、Direct3Dデバイスは全画面表示が可能である。アプリケーションがエクスクルーシブモードである間はディスプレイデバイスの使用要求は失敗する。

ウィンドウモード

ウィンドウ内の領域に結果が表示される。Direct3Dは画面を完成させるためにGDIと通信する必要がある。


ウィンドウモードはエクスクルーシブモードよりも若干遅いが、画面を占有しないためその他のGUIと共存させることが可能なほか、外部GUIを必要としない場合においてもデバッグに役立つ。



変遷



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]。なお、Windows 7に標準搭載されている高速2D描画APIであるDirect2Dは、このD3D 10.1上に構築された高レベルラッパーライブラリである。

Direct3D 11.0

Windows Vista SP2 Platform UpdateおよびWindows 7以降で動作する。DXGIのバージョンは1.1となる[2]。プログラマブルシェーダー5.0をサポートし、頂点シェーダーとジオメトリシェーダーの間に、ハードウェアテッセレーション(サブディビジョンサーフェイス)を実現するステージとして、新たにハルシェーダー・テッセレータ・ドメインシェーダーが追加されている。また、GPGPU用途のシェーダーステージとして、コンピュートシェーダー (DirectCompute) が追加されている。ハルシェーダーおよびドメインシェーダーはDirect3D 11対応のGPUでなければ使用できないが、コンピュートシェーダーは制限付きでDirect3D 10.x世代のGPUでも実行可能である[3]。

Direct3D 11.1

Direct3D 11.0のマイナーチェンジ。Windows 8に標準搭載されている。DXGIのバージョンは1.2となる[4]。なお、Windows 8に標準搭載される、新しいバージョンのDirect2D (D2D 1.1) は、このD3D 11.1上に構築された高レベルラッパーライブラリである[5]。シェーダーモデルのバージョンは11.0と同じく5.0となる[6]。Direct3D 11.1は機能追加よりも性能強化に重点が置かれたマイナーバージョンアップとなっている。また、Direct3D 11はWindows 7リリース後にWindows Vistaに対して完全な形でバックポートされたが、Direct3D 11.1のWindows 7へのバックポートは完全ではなく、限定的な形にとどまっている[7]。

Direct3D 11.2

Direct3D 11.1のマイナーチェンジ。Windows 8.1およびXbox Oneに標準搭載される[8]。DXGIのバージョンは1.3となる[9]。Windows 8.1に標準搭載される、新しいバージョンのDirect2D (D2D 1.2) は、このD3D 11.2上に構築された高レベルラッパーライブラリである[10]。Direct3D 11.2はタイルリソース(いわゆるメガテクスチャ)などをサポートする[11]。なお、Direct3D 11.2はWindows 8およびそれ以前のOSにはバックポートされていない。

Direct3D 11.3

Direct3D 12に搭載される新機能は、同時期に提供される従来からの高レベルAPIのマイナーチェンジとなるDirect3D 11.3にも搭載される[19][20][21]。DXGIのバージョンは1.4となる[22]

Direct3D 11.4

Windows 10 November 2015 Update (version 1511, build 10586) にてDXGI 1.5とともに導入された[23]

Direct3D 12

高レベルだがオーバーヘッドの大きかったDirect3D 11までと比べて、Direct3D 12はよりハードウェアに近いローレベルな制御を可能とするAPIとなった[24]。Windows 10のほか、Xbox OneおよびWindows Phoneにも対応予定[25]

Windows 10 Anniversary Update (version 1607, build 14393) にてWDDM 2.1が導入され、Direct3D 12も更新された[26]。UWPアプリケーションにおける可変リフレッシュレートのサポートも追加されている[27]



参考文献




  1. ^ Microsoft DirectX SDK Readme (October 2006) [リンク切れ]


  2. ^ DirectX 8.0 の紹介


  3. ^ D3D_DRIVER_TYPE


  4. ^ Windows Advanced Rasterization Platform (WARP) Guide (Windows)


  5. ^ Windows Vista のグラフィック API


  6. ^ Direct3D Retained Mode for Visual Basic


  7. ^ D3DDEVTYPE


  8. ^ DirectX 用語集


  9. ^ IDirect3D9::RegisterSoftwareDevice


  10. ^ “Software Rasterizer for DirectX 9.0 SDK”. 2008年5月4日閲覧。 [リンク切れ]


  11. ^ D3DPOOL


  12. ^ “Direct3D Resources - Memory pool”. 2008年5月4日閲覧。


  13. ^ “Direct3D 9.0 パイプラインの図”. 2008年5月4日閲覧。


  14. ^ “Pipeline Stages (Direct3D 10)”. 2008年5月4日閲覧。


  15. ^ パイプライン ステージ (Direct3D 10)


  16. ^ ラスタライザー ステージ (Direct3D 10)


  17. ^ Direct3D 12 概要 パート 2: パイプライン状態オブジェクト | iSUS


  18. ^ Managing Graphics Pipeline State in Direct3D 12 (Windows)


  19. ^ DirectX 12's new rendering features are coming to DirectX 11.3 too | PC Gamer


  20. ^ DirectX 12 Lights Up NVIDIA’s Maxwell Launch - DirectX Developer Blog - Site Home - MSDN Blogs


  21. ^ 西川善司の3DGE:新しく来るDirectXは「12」だけじゃない。突如浮上した「DirectX 11.3」とは何か? - 4Gamer.net


  22. ^ PC Games for Windows 10


  23. ^ Windows 10 SDK (November 2015) – Games for Windows and the DirectX SDK


  24. ^ Direct3D 12 特集 | iSUS


  25. ^ 【後藤弘茂のWeekly海外ニュース】GPUの進化に対応したMicrosoftの次世代API「DirectX 12」の背景 - PC Watch


  26. ^ New Releases (Windows)


  27. ^ Variable refresh rate displays (Windows)



関連項目




  • High Level Shading Language - HLSL


  • Microsoft DirectX - Direct3Dを含むマルチメディアAPIの集合


  • OpenGL - Direct3Dの競合となるクロスプラットフォームグラフィックスAPI

  • DirectDraw

  • DirectCompute

  • Direct2D

  • DirectWrite

  • WPF

  • Windows Display Driver Model

  • 3次元コンピュータグラフィックス

  • Metal (API)

  • Vulkan (API)

  • en:Direct3D

  • en:Feature levels in Direct3D

  • Mantle (API)



外部リンク




  • MSDN

    • Direct3D 9 Graphics (Windows)

    • Direct3D 10 Graphics (Windows)

    • Direct3D 11 Graphics (Windows)

    • Direct3D 11.1 Features (Windows)

    • Direct3D 11.2 Features (Windows)

    • Direct3D 11.3 Features (Windows)

    • Direct3D 12 Graphics (Windows)

    • MSDN Blogs




  • GitHub

    • Microsoft/DirectX-Graphics-Samples · GitHub

    • Microsoft/DirectXTK · GitHub

    • Microsoft/DirectXTex · GitHub

    • Microsoft/DirectXMesh · GitHub





  • DirectX 10: The Future of PC Gaming DirectX 10の新機能について議論している技術文章でありゲーム業界に影響がある。[要出典]




Popular posts from this blog

android studio warns about leanback feature tag usage required on manifest while using Unity exported app?

SQL update select statement

'app-layout' is not a known element: how to share Component with different Modules