Direct3Dは、 Microsoft Windows用のグラフィックスアプリケーション プログラミング インターフェイス(API)です。DirectX の一部であるDirect3Dは、ゲームなどパフォーマンスが重要なアプリケーションで3 次元グラフィックスをレンダリングするために使用されます。Direct3D は、グラフィックス カードでハードウェア アクセラレーションが利用可能な場合はそれを使用し、3Dレンダリング パイプライン全体のハードウェア アクセラレーション、または部分的なアクセラレーションのみを可能にします。Direct3D は、Z バッファリング[ 1 ]、W バッファリング[ 2 ] 、ステンシル バッファリング、空間アンチエイリアシング、アルファ ブレンディング、カラー ブレンディング、ミップ マッピング、テクスチャ ブレンディング[ 3 ] [ 4 ] 、クリッピング、カリング、大気効果、透視補正テクスチャ マッピング、プログラマブルHLSLシェーダー[ 5 ] 、およびエフェクトなど、3D グラフィックス ハードウェアの高度なグラフィックス機能を公開します。[ 6 ]他の DirectX テクノロジーとの統合により、Direct3D はビデオ マッピング、2Dオーバーレイプレーンでのハードウェア 3D レンダリング、さらにはスプライトなどの機能を提供し、インタラクティブ メディア タイで 2D および 3D グラフィックスの使用を可能にします。
Direct3D には3D コンピュータグラフィックスのレンダリング用のコマンドが多数含まれていますが、バージョン 8 以降、Direct3D はDirectDrawフレームワークに取って代わり、 2D グラフィックスのレンダリングも担当するようになりました。[ 7 ] Microsoft は、3D グラフィックス カードで利用可能な最新技術をサポートするために、Direct3D を継続的に更新するよう努めています。Direct3D は、ハードウェアで利用できない機能については、完全な頂点ソフトウェアエミュレーションを提供しますが、ピクセル ソフトウェア エミュレーションは提供しません。たとえば、Direct3D を使用してプログラムされたソフトウェアがピクセル シェーダーを必要とし、ユーザーのコンピュータのビデオ カードがその機能をサポートしていない場合、Direct3D はそれをエミュレートしませんが、3D モデルのポリゴンとテクスチャを計算してレンダリングします。ただし、通常はハードウェアの同等のものと比較して品質とパフォーマンスが低下します。API には、ソフトウェアで汎用グラフィックス カードをエミュレートするReference Rasterizer (または REF デバイス) が含まれていますが、ほとんどのリアルタイム 3D アプリケーションには遅すぎるため、通常はデバッグにのみ使用されます。Direct3D 10.1 の全機能をエミュレートするように設計された新しいリアルタイムソフトウェアラスタライザーWARP が、プラットフォームアップデートによりWindows 7およびWindows Vista Service Pack 2に同梱されています。そのパフォーマンスは、マルチコア CPU 上のローエンド 3D カードと同等と言われています。[ 8 ]
DirectXの一部であるDirect3Dは、 Windows 95以降で利用可能であり、 Xboxコンソールシステムの様々なバージョンにおけるベクターグラフィックスAPIの基盤となっています。複数のWindows APIをフリーソフトウェアで再実装したWine互換レイヤーには、Direct3Dの実装が含まれています。
Direct3Dの主な競合相手は、Khronos社のOpenGLとその後継規格であるVulkanです。Fahrenheitは、1990年代にMicrosoftとSGIがOpenGLとDirect3Dを統合しようと試みたものでしたが、最終的に開発中止となりました。
1992年、Servan Keondjian、Doug Rabson、Kate SeekingsはRenderMorphicsという会社を設立し、医療画像処理やCADソフトウェアで使用されるReality Labという3DグラフィックスAPIを開発しました。 [ 15 ] このAPIは2つのバージョンがリリースされました。[ 16 ] Microsoftは1995年2月にRenderMorphicsを買収し、そのスタッフをWindows 95用の3Dグラフィックスエンジンの実装に迎え入れました。[ 17 ] Direct3Dの最初のバージョンはDirectX 2.0(1996年6月2日)とDirectX 3.0(1996年9月26日)に搭載されて出荷されました。
Direct3D は当初、「即時モード」3D API を実装し、その上に「保持モード」3D API を重ねました。[ 18 ]両方のタイプの API は、Direct3D がリリースされる前の Reality Lab の第 2 リリースですでに提供されていました。[ 16 ] DirectDrawなどの他の DirectX API と同様に、両方ともCOMをベースとしていました。保持モード API はシーン グラフAPI でしたが、ほとんど採用されませんでした。ゲーム開発者は、Direct3D の保持モードでは提供できないハードウェアの動作のより直接的な制御を強く求めていました。かなりの販売量を記録したゲームは、Lego IslandとLego Rock Raiders の2 つだけで、これらは Direct3D の保持モードをベースとしていたため、Microsoft は DirectX 3.0 以降、保持モード API を更新しませんでした。
DirectX 2.0 および 3.0 では、Direct3D の即時モードは、Microsoft がハードウェアベンダーが直接サポートすることを期待していた「実行バッファ」プログラミングモデルを使用していました。実行バッファはハードウェアメモリに割り当てられ、ハードウェアによって解析されて 3D レンダリングを実行することを意図していました。しかし、当時はプログラミングが非常に面倒だと考えられていたため、新しい API の採用が妨げられ、Microsoft が OpenGL をゲームやワークステーションアプリケーション向けの公式 3D レンダリング API として採用するよう求める声が上がりました。[ 19 ]
マイクロソフトは、ゲームAPIとしてOpenGLを採用するのではなく、Direct3Dの改良を続けることを選択した。これは、OpenGLに対抗するためだけでなく、3dfxのGlideなどの他の独自APIとより効果的に競争するためでもあった。
当初から、即時モードはIDirect3DDeviceインターフェースのBeginScene/EndSceneメソッドを使用して、Talismanのタイルレンダリングもサポートしていました。
DirectX 4.0用の Direct3D には実質的な変更は計画されておらず、1996 年後半に出荷予定だったが、その後キャンセルされた。[ 20 ]
1996 年 12 月、レドモンドのチームが Direct3D Immediate Mode の開発を引き継ぎ、ロンドンを拠点とする RenderMorphics チームは Retained Mode の開発を続けました。レドモンドのチームは、アプリケーションが実行バッファを構築する必要性をなくす DrawPrimitive API を追加し、Direct3D をGlideやOpenGLなどの他の即時モードレンダリング API により近いものにしました。DrawPrimitive の最初のベータ版は 1997 年 2 月に出荷され[ 21 ]、最終バージョンは1997 年 8 月にDirectX 5.0とともに出荷されました[ 22 ]。
DirectX 5.0では、より使いやすい即時モードAPIが導入されただけでなく、Direct3Dデバイスがグラフィック出力をさまざまなDirectDrawサーフェスに書き込むことができるSetRenderTargetメソッドも追加されました。[ 23 ]
DirectX 6.0 (1998 年 8 月にリリース) では、マルチテクスチャ[ 24 ]やステンシル バッファなど、当時のハードウェアに対応する多数の機能が導入されたほか、 x87、SSE、3DNow!用に最適化されたジオメトリ パイプラインや、プログラミングを簡素化するためのオプションのテクスチャ管理も導入されました。[ 25 ] Direct3D 6.0 には、ライセンス ベンダーに市場投入までの時間的優位性を与える代わりに、Microsoft が特定のハードウェア ベンダーからライセンスを受けて API に組み込んだ機能のサポートも含まれていました。S3テクスチャ圧縮サポートはそのような機能の 1 つで、API に組み込む目的で DXTC と改名されました。もう 1 つは TriTech 独自のバンプ マッピング技術でした。Microsoft はこれらの機能を DirectX に組み込み、その後、他のベンダーのハードウェアでこれらの機能が広く採用されるように、ドライバがWindows ロゴを取得するために必要な要件に追加しました。
DirectX 6.0のマイナーアップデートは、1999 年 2 月に DirectX 6.1 アップデートで行われました。このリリースでは、初めてDirectMusic のサポートが追加されたほか、 Intel Pentium III 3D 拡張機能のサポートが改善されました。[ 26 ]
1997年に送られた機密メモ[ 27 ]によると、マイクロソフトはDirectX 6.0でTalismanの完全なサポートを発表する予定だったが、APIは最終的にキャンセルされた(詳細はMicrosoft Talismanのページを参照)。
DirectX 7.0 (1999 年 9 月にリリース) では、.ddsテクスチャ フォーマット[ 28 ]と変換およびライティングのハードウェア アクセラレーションのサポート[ 29 ] (Nvidia のGeForce 256で PC ハードウェアで初めて利用可能) が導入され、さらにハードウェア メモリに頂点バッファを割り当てる機能も導入されました。ハードウェア頂点バッファは、DirectX の歴史上、OpenGL に対する最初の実質的な改善です。Direct3D 7.0 では、マルチテクスチャ ハードウェアに対する DirectX のサポートも強化され、固定機能のマルチテクスチャ パイプライン機能の頂点となりました。強力ではありましたが、プログラミングが非常に複雑だったため、グラフィックス ハードウェアのシェーディング機能を公開するための新しいプログラミング モデルが必要でした。Direct3D 7.0 では、DXVA機能も導入されました。
DirectX 8.0 (2000 年 11 月にリリース) は、頂点シェーダーとピクセルシェーダーの形でプログラマビリティを導入し、開発者が余分なハードウェア状態を気にせずにコードを書けるようにしました。[ 30 ]シェーダー プログラムの複雑さはタスクの複雑さに依存し、ディスプレイ ドライバーは それらのシェーダーをハードウェアが理解できる命令にコンパイルしました。Direct3D 8.0 とそのプログラマブル シェーディング機能は、描画が複雑なステート マシンによって制御される OpenGL スタイルの固定機能アーキテクチャからの最初の大きな転換でした。Direct3D 8.0 はまた、 DirectDraw を別の API として廃止しました。[ 31 ] [ 32 ] Direct3D は、レンダリング結果を表示するために使用される関数 Present() など、アプリケーション開発にまだ必要だった残りのすべての DirectDraw API 呼び出しを統合しました。
Direct3Dは当初、ユーザーフレンドリーとは言えませんでしたが、DirectXバージョン8.1以降、多くの使い勝手の問題が解決されました。Direct3D 8には、頂点シェーダー、ピクセルシェーダー、フォグ、バンプマッピング、テクスチャマッピングなど、多くの強力な3Dグラフィックス機能が搭載されています。
Direct3D 9.0 [ 33 ] (2002 年 12 月にリリース) では、新しいバージョンのHigh Level Shader Language [ 34 ] [ 35 ]、浮動小数点テクスチャ フォーマットのサポート、Multiple Render Targets (MRT) [ 36 ] 、Multiple-Element Textures [ 37 ]、頂点シェーダーでのテクスチャ ルックアップ、ステンシル バッファ技術[ 38 ]が追加されました。
Direct3D 9Ex [ 39 ] (以前はバージョン 9.0L と呼ばれ、「L」は Windows Vista のコードネームである Longhorn の略) は、Windows Vista 以降でのみ利用可能な拡張機能で、Windows Vista のWindows Display Driver Model (WDDM) が提供する利点を利用でき、 Windows Aeroに使用されます。[ 40 ] Direct3D 9Ex は、DirectX 9 クラスの WDDM ドライバーと連携して、グラフィックス メモリを仮想化してシステム メモリにページ アウトしたり、グラフィックス操作を中断およびスケジュールしたり、DirectX サーフェスをプロセス間で共有したりすることを可能にします。[ 41 ] Direct3D 9Ex は、以前は Windows Graphics Foundation (WGF) のバージョン 1.0 として知られていました。
Direct3D 9Exの改善点 - Win32アプリ
Windows Vistaには、Direct3D API の大幅なアップデートが含まれています。当初は WGF 2.0 (Windows Graphics Foundation 2.0) と呼ばれ、その後 DirectX 10 および DirectX Next となったDirect3D 10 [ 42 ]では、更新されたシェーダー モデル4.0 と、シェーダー プログラムのオプションの割り込み機能が特徴となっています。[ 41 ]このモデルでは、シェーダーは以前のバージョンと同様に固定ステージで構成されていますが、すべてのステージがほぼ統一されたインターフェイスをサポートし、テクスチャやシェーダー定数などのリソースへのアクセス パラダイムも統一されています。言語自体も拡張され、整数演算、命令数の大幅な増加、C 言語に似た構造など、より表現力豊かになっています。以前から利用可能だった頂点シェーダー ステージとピクセル シェーダーステージに加えて、この API にはジオメトリ シェーダーステージが含まれており、1 つの頂点を入力 / 1 つの頂点を出力という古いモデルを打破し、シェーダー内からジオメトリを生成できるようにすることで、複雑なジオメトリをグラフィックス ハードウェアによって完全に生成できるようになりました。
DirectX 10.0以降ではWindows XP以前のバージョンはサポートされていません 。さらに、Direct3D 10ではDirect3Dの初期から存在していた保持モードAPIのサポートが廃止されたため、保持モードAPIをレンダリングエンジン として使用していた3DゲームはWindows Vistaと互換性がなくなりました。[ 43 ]
以前のバージョンのAPIとは異なり、Direct3D 10では、特定のグラフィックスデバイスでサポートされている機能を示すために「機能ビット」(または「キャップ」)を使用しなくなりました。代わりに、ディスプレイシステムが「Direct3D 10互換」となるためにサポートされなければならないハードウェア機能の最小基準を定義しています。これは大きな変更点であり、特定の機能の有無に基づく機能チェックコードや特殊なケースを排除することで、アプリケーションコードの簡素化を目指しています。
Windows Vista の初期リリース後、 Direct3D 10 ハードウェアは比較的まれであり、Direct3D 10 と互換性のないグラフィック カードのインストールベースが膨大であったため、最初の Direct3D 10 互換ゲームは依然として Direct3D 9 レンダリング パスを提供しています。そのようなタイトルの例としては、Company of Heroesのように、元々 Direct3D 9 用に作成され、リリース後にDirect3D 10 に移植されたゲームや、 Hellgate: LondonやCrysisのように、元々 Direct3D 9用に開発され、開発中に Direct3D 10 パスが後付けされたゲームなどがあります。DirectX 10 SDK は 2007 年 2 月に利用可能になりました。[ 44 ]
Direct3D 10.0レベルのハードウェアは、次の機能をサポートする必要があります。新しいジオメトリ シェーダー ステージでプリミティブ全体を処理する機能、ストリーム出力ステージを使用してパイプラインで生成された頂点データをメモリに出力する機能、マルチサンプル アルファ ツー カバレッジのサポート、デプス/ステンシル サーフェスまたはマルチサンプル リソースがレンダリング ターゲットとしてバインドされなくなった後の読み出し、完全な HLSL 統合 - すべての Direct3D 10 シェーダーは HLSL で記述され、共通シェーダー コアで実装されています、整数およびビット単位のシェーダー操作、パイプライン ステートを 5 つの不変ステート オブジェクトに編成、シェーダー定数を定数バッファに編成、レンダリング ターゲット、テクスチャ、サンプラーの数の増加、シェーダーの長さの制限なし、新しいリソース タイプとリソース フォーマット、[ 45 ]階層化されたランタイム/API レイヤー、[ 46 ]ジオメトリ シェーダーを使用してプリミティブごとのマテリアルのスワッピングとセットアップを実行するオプション、ビューを使用したリソース アクセスの一般化の増加、レガシー ハードウェア機能ビット (caps) の削除。
Direct3D 10.1 [ 52 ]は、Direct3D 10 のリリース直後に、マイナーアップデートとして Microsoft によって発表されました。仕様は 2007 年 11 月に DirectX SDK がリリースされたことで確定し、ランタイムは2008 年 3 月中旬から入手可能なWindows Vista SP1に同梱されました。
Direct3D 10.1 では、グラフィックス ベンダー向けにいくつかの画像品質基準が設定され、開発者が画像品質をより細かく制御できるようになります。[ 53 ] [ 54 ]機能には、アンチエイリアシングのより細かい制御 (マルチサンプリングとスーパーサンプリングの両方、サンプルごとのシェーディング、サンプル位置のアプリケーション制御)、および既存の機能の一部に対する柔軟性の向上 (キューブマップ アレイと独立したブレンド モード) が含まれます。Direct3D 10.1 レベルのハードウェアは、次の機能をサポートする必要があります。マルチサンプリングが強化され、カバレッジベースの透明度を一般化し、マルチパス レンダリングでマルチサンプリングがより効果的に機能するようになり、カリング動作が改善されました。ゼロ エリアの面は自動的にカリングされます。これはワイヤーフレーム レンダリングのみに影響し、レンダー ターゲットごとに独立したブレンド モード、プリミティブ ラスタライズを使用した新しいサンプル周波数ピクセル シェーダーの実行、パイプライン ステージ帯域幅の増加、カラーおよび深度/ステンシル MSAA サーフェスの両方を、ソースまたは宛先として CopyResource で使用できるようになりました。MultisampleEnable はライン ラスタライズのみに影響し (ポイントと三角形は影響を受けません)、ライン描画アルゴリズムを選択するために使用されます。これは、Direct3D 10 の一部のマルチサンプル ラスタライズがサポートされなくなったことを意味します。テクスチャ サンプリング – sample_c および sample_c_lz 命令は、Texture2DArrays と TextureCubeArrays の両方で動作するように定義されています。配列インデックスを指定するには、Location メンバー (アルファ コンポーネント) を使用します。TextureCubeArrays がサポートされます。
Direct3D 10 は Direct3D 10 クラスのハードウェアとドライバ インターフェイスを厳密に要求していましたが、Direct3D 10.1 ランタイムは「機能レベル」の概念を使用して Direct3D 10.0 ハードウェア上で実行できます[ 56 ] [ 57 ] [ 58 ]。ただし、新機能は機能レベル 10_1 を公開する新しいハードウェアによってのみサポートされます。
2008年6月時点で入手可能なDirect3D 10.1対応ハードウェアは、ATIのRadeon HD 3000シリーズとRadeon HD 4000シリーズのみでした。2009年には、 S3 GraphicsのChrome 430/440GT GPUと、 NvidiaのGeForce 200シリーズの一部のローエンドモデルが加わりました。2011年には、Intel HD Graphics 2000(GMA HD)の登場により、IntelチップセットがDirect3D 10.1をサポートするようになりました。
Direct3D 11 [ 59 ]は Windows 7 の一部としてリリースされました。2008 年 7 月 22 日に Gamefest 2008 で発表され、2008 年 8月 26 日にNvision 08 技術会議でデモが行われました。 [ 60 ] [ 61 ] Direct3D 11 テクニカル プレビューは、2008 年 11 月にリリースされた DirectX SDK に含まれています。[ 62 ] AMD は、2009 年 6 月 3 日に Computex で、DirectX 11 SDK のサンプルを実行する動作する DirectX11 ハードウェアをプレビューしました。[ 63 ]
Direct3D 11 ランタイムは、 「機能レベル」の概念を使用してDirect3D 9 および 10.x クラスのハードウェアとドライバで実行でき、Direct3D 10.1 ランタイムで最初に導入された機能を拡張しています。[ 56 ] [ 64 ] [ 65 ]機能レベルにより、開発者はレンダリング パイプラインを Direct3D 11 API の下に統一し、エントリー レベルのカードでも、より優れたリソース管理やマルチスレッドなどの API の改善を利用できますが、新しいシェーダー モデルやレンダリング ステージなどの高度な機能は上位レベルのハードウェアでのみ公開されます。[ 64 ] [ 66 ]一般的な DirectX 9.0a カードのさまざまな機能をカプセル化した 3 つの「10 レベル 9」プロファイルがあり、Direct3D 10、10.1、および 11 にはそれぞれ別の機能レベルがあります。各上位レベルは下位レベルの厳密なスーパーセットです。[ 67 ]
テッセレーションは当初 Direct3D 10 で検討されましたが、後に放棄されました。Radeon R600などの GPU には、Direct3D 9/10/10.1 [ 68 ] [ 69 ] [ 70 ]および OpenGL [ 71 ]で使用できるテッセレーション エンジンが搭載されていますが、Direct3D 11 とは互換性がありません (Microsoft によると)。Radeon 8xxx、GeForce 3/4 などの古いグラフィックス ハードウェアには、別の形式のテッセレーション (RT パッチ、N パッチ) のサポートがありましたが、これらのテクノロジーは実際に使用されることはありませんでした。そのため、新しいハードウェアではサポートが削除されました。
マイクロソフトは、Direct3D APIでは公開されていなかったものの、VideologicのPowerVRチップシリーズなどの初期のDirect3Dハードウェアではほぼ透過的にサポートされていた、順序に依存しない透過性といった他の機能についても示唆している。
Direct3D 11.0 の機能には、シェーダー モデル 5.0 のサポート、動的シェーダー リンク、アドレス指定可能なリソース、追加のリソース タイプ、[ 72 ]サブルーチン、ジオメトリ インスタンシング、ピクセル シェーダー入力としてのカバレッジ、入力のプログラム可能な補間、新しいテクスチャ圧縮フォーマット (1 つの新しい LDR フォーマットと 1 つの新しい HDR フォーマット)、WDDM プリロードを制限するためのテクスチャ クランプ、テクスチャ フィルタリングで 8 ビットのサブテクセルおよびサブミップ精度が必要、16K テクスチャ制限、Gather4 (マルチ コンポーネント テクスチャのサポート、プログラム可能なオフセットのサポート)、DrawIndirect、保守的な oDepth、Depth Bias、[ 73 ] [ 74 ]アドレス指定可能なストリーム出力、リソースごとのミップマップ クランプ、浮動小数点ビューポート、シェーダー変換命令、マルチスレッドの改善が含まれます。
その他の注目すべき機能としては、高品質およびHDR/アルファテクスチャをより効率的にパッキングするための2つの新しいテクスチャ圧縮アルゴリズムの追加と、テクスチャキャッシュの増加が挙げられます。
Windows 7 はリリース候補版で初めて登場し、最初のリリース版 Direct3D 11 サポートを統合しました。Windows Vistaのプラットフォーム アップデートには、フル機能の Direct3D 11 ランタイムと DXGI 1.1 アップデート、およびWARP、Direct2D、DirectWrite、WICなどの Windows 7 の関連コンポーネントが含まれています。[ 78 ] [ 79 ]
Direct3D 11.1 [ 80 ] [ 81 ]は、 Windows 8に付属する API のアップデートです。[ 82 ] [ 83 ] Windows 8 の Direct3D ランタイムはDXGI 1.2 [ 84 ]を特徴としており、新しいWDDM 1.2 [ 85 ]デバイス ドライバが必要です。[ 86 ] Windows 8 開発者プレビュー用の Windows SDK のプレリミナリー バージョンは、2011 年 9 月 13 日にリリースされました。
新しい API には、シェーダートレースと HLSL コンパイラの強化、最小精度 HLSL スカラー データ型のサポート、[ 87 ]パイプラインの各ステージでの UAV (Unordered Access Views)、ターゲット非依存ラスタライズ (TIR)、動的バッファの SRV を NO_OVERWRITE でマッピングするオプション、ビデオ リソースのシェーダー処理、レンダー ターゲットで論理演算を使用するオプション、定数バッファのサブ範囲をシェーダーにバインドして取得するオプション、シェーダーがアクセスできるよりも大きな定数バッファを作成するオプション、リソースとリソース ビューを破棄するオプション、新しいコピー オプションでサブ リソースを変更するオプション、サンプル カウントを強制してラスタライザー状態を作成するオプション、リソース ビューのすべてまたは一部をクリアするオプション、セッション 0 プロセスで Direct3D を使用するオプション、機能レベル 9 以降で HLSL でユーザー クリップ プレーンを指定するオプション、機能レベル 9 でのシャドウ バッファのサポート、ビデオ再生のサポート、共有 Texture2D リソースの拡張サポート、Direct3D 10 と HLSL 間のオンザフライ スワップなどの機能があります。 11 のコンテキストと機能レベル。Direct3D 11.1 には、新しい機能レベル 11_1 が含まれており、シェーダー言語に、より大きな定数バッファやオプションの倍精度命令などのマイナーアップデート、ブレンドモードの改善、およびIntel HD Graphicsなどのエントリーレベルの GPU のパフォーマンスを向上させるための 16 ビットカラーフォーマットの必須サポートがもたらされます。[ 86 ] [ 88 ] WARP は、機能レベル 11_1 をサポートするように更新されました。
Windows 7のプラットフォームアップデートにはDirect3D 11.1 の機能が限定的に含まれていますが、機能レベル11_1 や関連する API、立体視レンダリング用のクワッド バッファリングなど、WDDM 1.2 に依存するコンポーネントは含まれていません。[ 89 ] [ 90 ]
Direct3D 11.2 [ 91 ] [ 92 ] [ 93 ]はWindows 8.1に同梱されていました。[ 94 ] [ 95 ]新しいハードウェア機能にはWDDM 1.3 [ 97 ]ドライバを備えた DXGI 1.3 [ 96 ]が必要で、ランタイム シェーダーの変更とリンク、関数リンク グラフ (FLG)、インボックスHLSLコンパイラ、グラフィックス コマンドに注釈を付けるオプションが含まれます。[ 98 ]機能レベル 11_0 と 11_1 では、シェーダー レベル オブ 詳細クランプ (Tier2) を使用したタイル リソースのオプション サポートが導入されています。[ 99 ]後者の機能は、現在の多くの GPU に存在するハードウェアページ テーブルを効果的に制御します。 [ 100 ] WARP は、新機能を完全にサポートするように更新されました。[ 94 ] [ 101 ]ただし、機能レベル 11_2 はありません。新機能は既存の機能レベルに分散されています。ハードウェアに依存する機能は、個別に確認できますCheckFeatureSupport。[ 95 ] [ 102 ] Direct3D 11.2 の「新しい」機能の中には、実際には古いハードウェア機能をより細かく公開しているものがあります。たとえば、D3D11_FEATURE_D3D9_SIMPLE_INSTANCING_SUPPORTフィーチャー レベル 9_1 および 9_2 のハードウェアではインスタンス化が部分的にサポートされていますが、フィーチャー レベル 9_3 以降では完全にサポートされています。[ 103 ]
Direct3D 11.X
Direct3D 11.Xは、 Xbox Oneで動作する DirectX 11.2 の上位互換です。[ 104 ] [ 105 ]描画バンドルなど、後に DirectX 12 の一部として発表された機能が含まれています。[ 106 ]
Direct3D 11.3 [ 107 ]は、2015 年 7 月に Windows 10 とともに出荷されました。Direct3D 12 のマイナーなレンダリング機能が含まれていますが、Direct3D 11.x API の全体的な構造は維持されています。[ 108 ] [ 109 ] [ 110 ] Direct3D 11.3 では、オプションのシェーダー指定ステンシル参照値、型付き順不同アクセス ビュー ロード、ラスタライザー順序付きビュー (ROV)、オプションの標準スウィズル、オプションのデフォルト テクスチャ マッピング、保守的なラスタライズ (3 つの階層のうち)、[ 111 ]オプションの統合メモリ アクセス (UMA)サポート、および追加のタイル リソース (階層 2) (ボリューム タイル リソース) が導入されています。[ 112 ]
Direct3D 12 [ 114 ]は、以前のバージョンよりも低いレベルのハードウェア抽象化を可能にし、将来のアプリケーションがマルチスレッドスケーリングを大幅に改善し、CPU 使用率を低下させることを可能にします。これは、間接描画、記述子テーブル、簡潔なパイプライン状態オブジェクト、描画呼び出しバンドルなどの新機能を通じて、Direct3D 抽象化レイヤーを基盤となるハードウェアにより良く適合させることで実現されます。ドライバのオーバーヘッドを削減することは、AMD のMantleと同様に、Direct3D 12 の主な魅力です。[ 114 ]リード開発者 Max McMullen の言葉を借りれば、Direct3D 12 の主な目標は、「コンソールレベルの効率」と CPU 並列性の向上を実現することです。[ 115 ] [ 116 ] [ 117 ]
NvidiaはDirect3D 12の幅広いサポートを発表したが、新しいAPIの普遍的な魅力についてはやや慎重な姿勢を示し、ゲームエンジン開発者はアプリケーションコードからGPUリソースを直接管理することに熱心かもしれないが、「他の多くの人々は」そうしなければならないことを喜ばないだろうと指摘した。[ 118 ]
Direct3D 12 には、新しいハードウェア機能もいくつか含まれています。[ 110 ] [ 108 ] [ 119 ]シェーダー モデル 5.1、[ 120 ]ボリューム タイル リソース (Tier 2)、[ 120 ]シェーダー指定ステンシル参照値、型付き UAV ロード、保守的ラスタライズ (Tier 1)、保守的ラスタライズによる衝突とカリングの改善、ラスタライザー順序付きビュー (ROV)、標準スウィズル、デフォルト テクスチャ マッピング、スワップ チェーン、スウィズル リソースと圧縮リソース、[ 121 ]追加のブレンド モード、[ 122 ]プログラマブル ブレンドとピクセル順序付き UAV による効率的な順序非依存透明度(OIT) [ 123 ]などです。
パイプライン状態オブジェクト (PSO) [ 124 ]は Direct3D 11 から進化しており、新しい簡潔なパイプライン状態によりプロセスが簡素化されています。DirectX 11 では、パフォーマンスを損なう形で状態を変更できる柔軟性がありました。プロセスを簡素化し、パイプライン (ピクセルシェーダー状態など) を統合することで、より効率的なプロセスが実現し、オーバーヘッドが大幅に削減され、グラフィックス カードが各フレームでより多くの呼び出しを描画できるようになります。一度作成された PSO は変更できません。[ 125 ]
ルートシグネチャは、コマンドリストをシェーダーに必要なリソースにリンクするための構成を導入します。ルートシグネチャは、シェーダーが使用するリソースのレイアウトを定義し、パイプラインにバインドされるリソースを指定します。グラフィックスコマンドリストにはグラフィックスルートシグネチャとコンピュートルートシグネチャの両方がありますが、コンピュートコマンドリストにはコンピュートルートシグネチャのみがあります。これらのルートシグネチャは互いに完全に独立しています。ルートシグネチャはシェーダーが使用するデータの型をレイアウトしますが、実際のメモリやデータを定義またはマッピングするものではありません。[ 126 ]
ルートパラメータは、ルートシグネチャのエントリの一種です。実行時に変更されるルートパラメータの実際の値は、ルート引数と呼ばれます。これはシェーダーが読み取るデータです。[ 126 ]
Direct3D 11では、コマンドはCPUからGPUへ1つずつ送信され、GPUはこれらのコマンドを順次処理します。つまり、コマンドの処理速度はCPUがコマンドを線形的に送信できる速度によって制限されます。DirectX 12では、これらのコマンドはコマンドリストとして送信され、必要なすべての情報が1つのパッケージにまとめられます。これにより、GPUはCPUからの追加情報を待つことなく、このコマンドを1つのプロセスで計算および実行できるようになります。
これらのコマンドリストの中にはバンドルが含まれています。従来、GPUはコマンドを取得、使用、そして破棄していましたが、バンドルは再利用可能です。これによりGPUの負荷が軽減され、繰り返し使用されるアセットをより高速に処理できるようになります。
現時点では、Direct3D 11 のリソースバインディングは開発者にとってかなり便利ですが、その非効率性により、最新のハードウェア機能の多くが大幅に活用されていないという問題があります。DX11 では、ゲームエンジンがリソースを必要とするたびにデータを最初から描画する必要があり、繰り返し処理や不要なリソースの使用が発生していました。Direct3D 12 では、ディスクリプタヒープとテーブルにより、開発者は最も頻繁に使用されるリソースをテーブルに割り当てることができ、GPU はそれらに迅速かつ容易にアクセスできます。これにより、同等のハードウェア上で Direct3D 11 よりも優れたパフォーマンスを実現できますが、開発者にとっては作業量が増えることになります。
動的ヒープもDirect3D 12の機能です。[ 127 ]
Direct3D 12 は明示的なマルチアダプタサポートを備えており、複数の GPU (mGPU) 構成システムを明示的に制御できます。このような構成は、同じハードウェアベンダーのグラフィックスアダプタだけでなく、異なるハードウェアベンダーのグラフィックスアダプタを組み合わせて構築できます。[ 128 ]
Windows 7 SP1 用の D3D 12 の実験的サポートが、専用の NuGet パッケージを介して Microsoft によって 2019 年にリリースされました。[ 129 ] [ 130 ] [ 131 ]

Direct3Dは、Microsoft DirectX APIサブシステムコンポーネントです。Direct3Dの目的は、グラフィックスアプリケーションとグラフィックスハードウェアドライバ間の通信を抽象化することです。GDIと同等のレベルの薄い抽象化レイヤーとして提供されます(添付の図を参照)。Direct3Dには、GDIにはない多くの機能が含まれています。
Direct3Dは、イミディエイトモードのグラフィックスAPIです。ビデオカードのあらゆる3D機能(変換、クリッピング、ライティング、マテリアル、テクスチャ、深度バッファリングなど)への低レベルインターフェースを提供します。かつてはより高レベルのリテインドモードコンポーネントがありましたが、現在は公式に廃止されています。
Direct3Dの即時モードでは、デバイス、リソース、スワップチェーンという3つの主要な抽象化が提供されます(添付の図を参照)。デバイスは3Dシーンのレンダリングを担当します。デバイスは、さまざまなレンダリング機能を備えたインターフェースを提供します。たとえば、モノクロデバイスは白黒のレンダリングを提供し、RGBデバイスはカラーでレンダリングします。デバイスには4つの種類があります。

すべてのデバイスには少なくとも1つのスワップチェーンが含まれています。スワップチェーンは1つ以上のバックバッファサーフェスで構成されます。レンダリングはバックバッファで行われます。
さらに、デバイスにはレンダリング中に使用される特定のデータであるリソースの集合が含まれています。各リソースには4つの属性があります。
Direct3Dは2つの表示モードを実装しています。

Microsoft Direct3D 11 API は、頂点、テクスチャ、バッファ、状態のグループを画面上の画像に変換するプロセスを定義しています。このプロセスは、いくつかの異なるステージを持つレンダリング パイプラインとして説明されます。Direct3D 11 パイプラインのさまざまなステージは次のとおりです。[ 142 ]
丸枠で囲まれたパイプラインの各ステージは、完全にプログラム可能です。アプリケーションには、各ステージで実行される具体的な操作を記述したシェーダープログラムが用意されています。多くのステージはオプションであり、完全に無効にすることもできます。
Direct3D 5から9にかけて、APIの新バージョンで新しいハードウェア機能のサポートが導入された際、それらのほとんどはオプションでした。各グラフィックスベンダーは、基本的な必須機能に加えて、独自のサポート機能セットを維持していました。個々の機能のサポートは「機能ビット」または「キャップ」を使用して決定する必要があり、ベンダーを跨いだグラフィックスプログラミングは複雑な作業となっていました。
Direct3D 10では、Direct3D 9で最も普及していた機能を基にした、大幅に簡素化された必須ハードウェア要件が導入され、対応するすべてのグラフィックカードはこれに準拠する必要がありました。サポートされるテクスチャフォーマットと操作に関するオプション機能はごくわずかでした。
Direct3D 10.1 ではいくつかの新しい必須ハードウェア要件が追加され、10.0 のハードウェアおよびドライバとの互換性を維持するために、これらの機能は「機能レベル」と呼ばれる 2 つのセットにカプセル化され、10.1 レベルは 10.0 レベルのスーパーセットを形成しました。Direct3D 11.0、11.1、および 12 で新しいハードウェアのサポートが追加されると、新しい必須機能がさらに上位の機能レベルにグループ化されました。[ 56 ]
Direct3D 11では、Direct3D 10 APIのサブセットである「10level9」も導入されました。これは、 WDDMドライバを備えたさまざまなDirect3D 9カードをカプセル化する3つの機能レベルを持つDirect3D 10 APIのサブセットであり、Direct3D 11.1では、すべてのレベルでいくつかのオプション機能が再導入されました[ 154 ]。これらの機能は、Direct3D 11.2以降のバージョンで拡張されました。
このアプローチにより、開発者はレンダリングパイプラインを統一し、新しいハードウェアと古いハードウェアの両方で単一のバージョンのAPIを使用することで、新しいランタイムのパフォーマンスとユーザビリティの向上を活用できます。[ 60 ]
API の更新バージョンでは新しい機能レベルが導入され、通常は以下の内容を包含します。
各上位レベルは下位レベルの厳密なスーパーセットであり、上位レベルでは、新規または以前はオプションだった機能がコア機能に移行します。[ 67 ] Direct3D API のメジャー改訂における新しいシェーダー モデルやレンダリング ステージなどのより高度な機能は、上位レベルのハードウェアでのみ公開されます。[ 65 ] [ 66 ]
特定のテクスチャ操作とリソース形式をサポートすることを示す個別の機能が存在し、これらは機能フラグの組み合わせを使用して各テクスチャ形式ごとに指定されます。[ 155 ] [ 156 ]
機能レベルはアンダースコアを区切り文字として使用し(例:「12_1」)、API/ランタイムバージョンはドットを使用します(例:「Direct3D 11.4」)。
Windows 10 用 Direct3D 11.4 では、D3D_FEATURE_LEVEL構造によって 9 つの機能レベルが提供されています。レベル 9_1、9_2、9_3 (まとめてDirect3D 10 レベル 9と呼ばれます) は、一般的な Direct3D 9 カードのさまざまな機能を再カプセル化します。レベル 10_0、10_1 は、Direct3D 10 のそれぞれのレガシー バージョンを参照します。[ 65 ] 11_0 と 11_1 は、Direct3D 11 と Direct3D 11.1 API およびランタイムで導入された機能を反映し、レベル 12_0 と 12_1 は、Direct3D 12 API で導入された新しい機能レベルに対応します。
Windows 10 用の Direct3D 12 では、仮想メモリ アドレス変換をサポートする機能レベル 11_0 および 11_1 に準拠したグラフィックス ハードウェアと WDDM 2.0 ドライバーが必要です。新しい機能レベル 12_0 と 12_1 があり、これには Direct3D 12 で公開されている新機能の一部が含まれていますが、これらはレベル 11_0 および 11_1 ではオプションです。[ 157 ]以前はオプションだった機能の一部が、レベル 11_0 および 11_1 でベースラインとして再配置されています。シェーダー モデル 6.0 は Windows 10 Creators Update でリリースされており、Windows 10 Anniversary Update と WDDM 2.1 ドライバーが必要です。
Direct3D 12 では、メモリを明示的に制御できる改良されたリソース バインディング モデルが導入されています。抽象的な「リソース ビュー」オブジェクト[ 159 ]は、メモリ ヒープとテーブルを使用して割り当てられるリソース ディスクリプタで表現されるようになりました。[ 160 ]リソース バインディング ティアは、CBV (定数バッファ ビュー)、SRV (シェーダー リソース ビュー)、UAV (順不同アクセス ビュー)、およびテクスチャ サンプラー ユニットを使用してアドレス指定できるリソースの最大数を定義します。ティア 3 ハードウェアでは、ディスクリプタ ヒープのサイズによってのみ制限される完全にバインドされないリソースが使用できますが、ティア 1 およびティア 2 ハードウェアでは、同時に使用できるディスクリプタ (「ビュー」) の数に制限があります。[ 161 ] [ 162 ]
Windows Vista以降のWDDMドライバモデルは、ハードウェアまたはソフトウェアにおいて、任意の数の実行コンテキスト(またはスレッド)をサポートします。Windows XPではDirect3Dへのマルチタスクアクセスのみがサポートされており、別々のアプリケーションを異なるウィンドウで実行してハードウェアアクセラレーションを利用できましたが、OSはGPUの動作を限定的に制御するにとどまり、ドライバは実行スレッドを任意に切り替えることができました。
Direct3D 11ランタイムでは、ランタイムをマルチスレッドモードで実行する機能が導入されました。各実行コンテキストには、GPUのリソースビューが表示されます。実行コンテキストは互いに保護されていますが、不正なアプリケーションや不適切に記述されたアプリケーションは、ユーザーモードドライバの実行を制御し、変更されたコマンドを送信することで、GPUメモリ内の別のプロセスからデータにアクセスできる可能性があります。適切に記述されたアプリケーションは、他のアプリケーションによって引き起こされる障害やデバイスの損失から自身を保護する必要があります。
OSはスレッドをすべて独自に管理し、必要に応じてハードウェアがスレッドを切り替えることを可能にする。また、統合されたOSカーネルのメモリ管理を介して、メモリ管理とページング(システムメモリとディスクへのページング)も処理する。
よりきめ細かいコンテキスト切り替え、つまり単一コマンドレベルやコマンドのバッチレベルではなく、シェーダー命令レベルで 2 つの実行スレッドを切り替えることができる機能は、Windows 8 に同梱された WDDM/DXGI 1.2 で導入されました。[ 86 ]これにより、アプリケーションが単一コマンドまたはコマンドのバッチの実行に非常に長い時間を要し、OS ウォッチドッグ タイマーによって終了させられる可能性があるスケジューリングの問題が解消されます。[ 163 ]
WDDM 2.0とDirectX 12は、完全なマルチスレッド描画呼び出しを可能にするために再設計されました。これは、すべてのリソースを不変(読み取り専用)にし、レンダリング状態をシリアル化し、描画呼び出しバンドルを使用することで実現されました。これにより、カーネルモードドライバにおける複雑なリソース管理が回避され、同一アプリケーション内の別々のレンダリングスレッドによって提供される同時実行コンテキストを介して、ユーザーモードドライバへの複数の再入呼び出しが可能になります。
Direct3D MobileはDirect3Dから派生したものですが、メモリ使用量が少なくなっています。Windows CEはDirect3D Mobileをサポートしています。[ 164 ]
Direct3D APIには、以下のような代替実装が存在します。これらは、Windows以外のプラットフォームや、一部のバージョンのDirect3Dをサポートしていないハードウェアで役立ちます。
Direct3D には、ベクトル、行列、色に対する一般的な数学的計算、ルックアット行列と投影行列の計算、スプライン補間、および 3D グラフィック プログラミングに使用されるシェーダーのコンパイルやアセンブル、圧縮されたスケルタル アニメーションストレージ、行列スタックなどのより複雑なタスクを実行するように設計されたツール ライブラリである D3DX が付属しています。接空間計算、メッシュの単純化、事前計算された放射輝度転送、頂点キャッシュの互換性の最適化とストライプ化、3D テキスト メッシュのジェネレータなど、3Dメッシュに対する複雑な操作を提供する関数がいくつかあります。2D 機能には、スクリーン空間の線、テキスト、およびスプライトベースのパーティクル システムを描画するためのクラスが含まれます。空間関数には、さまざまな交差ルーチン、重心座標との変換、および境界ボックス/球体ジェネレータが含まれます。D3DX は、ダイナミック リンク ライブラリ(DLL)として提供されます。D3DX は Windows 8 以降では非推奨となり、Windows ストア アプリでは使用できません。[ 183 ]
Direct3D 11 では、以前のバージョンの D3DX に存在していたいくつかの機能が削除され、現在は別のソースとして提供されています。[ 184 ]
DXUT(サンプルフレームワークとも呼ばれる)は、Direct3D APIの上に構築されたレイヤーです。このフレームワークは、ウィンドウの作成、デバイスの作成、Windowsメッセージの処理、デバイスイベントの処理など、プログラマーが日常的なタスクに費やす時間を減らすように設計されています。DXUTはWindows SDK 8.0で削除され、現在はCodePlex経由でソースとして配布されています。[ 192 ]
2 の新機能の中で最も重要なものは、Direct3D 11.2/11.3 との完全な互換性が含まれていることです。