Direct3D 11 の機能
このプログラミング ガイドでは、Direct3D 11 のプログラム可能なパイプラインを使用して、ゲームや科学的アプリケーション、およびデスクトップ アプリケーションで使用されるリアルタイム 3D グラフィックを作成する方法について説明します。
- コンピュート シェーダー
- 動的シェーダー リンク
- マルチスレッド
- テッセレーション
- 機能の詳細リスト
コンピュート シェーダー
コンピュート シェーダーでは、GPU を汎用の並行処理プロセッサとして使用できます。コンピュート シェーダーは、汎用のデータ並行処理用に設計されたプログラム可能なシェーダーです。このシェーダーは、入力と出力のアクセス方法において、他のプログラム可能なパイプライン シェーダー (頂点、ピクセル、ジオメトリ) と似ています。コンピュート シェーダーは Direct3D に統合されており、Direct3D デバイスを通じてアクセス可能です。コンピュート シェーダーは、メモリー リソースを Direct3D デバイスを通じてグラフィック シェーダーと直接共有できますが、他のシェーダー ステージには直接接続されていません。
コンピュート シェーダーは、対話的なレートで計算を実行する量販アプリケーション用に設計されています。対話的なレートでは、API (および関連するソフトウェア スタック) と CPU 間の移行に、過大なオーバーヘッドが発生することがあります。
コンピュート シェーダーは独自のステート セットを備えています。コンピュート シェーダーは、入力記録 (頂点シェーダーなど) や出力記録 (ピクセル シェーダーなど) に対して、強制的に 1-1 マッピングを実現しているとはかぎりません。グラフィック シェーダーの一部の機能はサポートされていますが、その他の機能は、新しい計算固有機能の追加を可能にするために削除されました。
計算固有機能をサポートするために、いくつかの新しいリソース タイプ (読み取り/書き込みバッファー、読み取り/書き込みテクスチャーおよび構造化バッファーなど) を使用できます。
詳細については、「コンピュート シェーダーの概要」を参照してください。
動的シェーダー リンク
レンダリング システムでは、シェーダー管理時に多様な複雑タイプを処理する必要がある一方で、シェーダー コードを最適化する最大の機会を提供します。指定可能な広範なハードウェア構成において、レンダリングされたシーンの各種マテリアルをサポートする必要性を考慮すると、さらに大きな課題が生じます。これらの課題に対処するために、一般にシェーダー開発者は、次の 2 つのアプローチのいずれかを取ってきました。パフォーマンスを犠牲にして柔軟性を得ることができる、すべての機能を備えた「ウーバー シェーダー」を作成する方法、または個別のシェーダーを各ジオメトリ ストリーム、マテリアル タイプまたはライト タイプの必要な組み合わせに応じて作成する方法です。
ウーバー シェーダーは、同じシェーダーを異なるプリプロセッサ定義を使用して再コンパイルして、この組み合わせの問題を処理します。一方、後者の方法では、同じ結果を得るために開発者によるコーディングが必要になります。この膨大な量のシェーダーの並べ換えは、ゲームやアセット パイプライン内で数千の異なるシェーダーの並べ換えを管理する必要がある開発者にとって厄介な問題でした。
Direct3D 11 およびシェーダー モデル 5 では、オブジェクト指向言語の構造体によって、シェーダー リンクのランタイム サポートを提供します。これにより、これらの開発上の問題に対処できます。
詳細については、「動的リンク」を参照してください。
マルチスレッド
多くのグラフィック アプリケーションは、シーン グラフ トラバーサル、オブジェクト ソート、物理的シミュレーションなどの負荷の大きな操作を処理するために、CPU への依存を余儀なくされています。一方、マルチコア システムはますます普及してきています。したがって、Direct3D 11 ではマルチスレッド サポートを向上させることにより、複数の CPU スレッドと D3D11 グラフィック API の間の効率的な対話を可能にしました。
Direct3D 11 は、次の機能を有効にしてマルチスレッドをサポートします。
- 異なるスレッドでの同時オブジェクト作成 — オブジェクト作成エントリ ポイントをフリー スレッド化すると、多くのスレッドがオブジェクト作成を同時に実行できるようになります。たとえば、アプリケーションの 1 つのスレッドでシェーダーのコンパイルまたはテクスチャーの読み込みをしながら、別のスレッドでレンダリングできるようになります。
- 複数のスレッドでのコマンド リストの作成 — コマンド リストは、グラフィック コマンドの記録されたシーケンスです。Direct3D 11 を使用すると、コマンド リストを複数の CPU スレッドで作成できます。シーン データベースの並行トラバーサルや複数のスレッドの物理処理が可能になったことで、メインのレンダリング スレッドがコマンド バッファーをハードウェアに自由にディスパッチできるようになりました。
詳細については、「マルチスレッド」を参照してください。
テッセレーション
テッセレーションは、さまざまなレベルの詳細を持つ単一のモデルのレンダリングに使用可能で、シーンに必要な詳細レベルに基づいて、幾何学的により正確なモデルを生成します。これは、レンダリング中に使用されるメモリー帯域幅の要求が少なくなる、より低いジオメトリ モデルを詳細レベルが許可するシーンにおいて重要になる可能性があります。
Direct3D では、テッセレーションは GPU に実装され、粗い (詳細度が低い) 入力パッチから、よりスムーズな曲面を計算します。各 (クワッドまたはトライアングル) パッチ面は、目的とするサーフェスにより近似した、小さなトライアングル面に分割されます。
グラフィック パイプラインへのテッセレーションの実装については、「テッセレーションの概要」を参照してください。
機能の詳細リスト
Direct3D 11 の機能の詳細リストを次に示します。
Direct3D 11 は、デバイス作成時に機能レベルを指定することで、ダウンレベルのハードウェア上で実行できます。
テッセレーション (「テッセレーションの概要」を参照)
- ハル シェーダー
- ドメイン シェーダー
マルチスレッド (「マルチスレッド」を参照)
- マルチスレッド リソース/シェーダー/オブジェクトの作成
- マルチスレッド表示リストの作成
シェーダー機能 (「シェーダー モデル 5」を参照)
アドレス可能リソース - テクスチャー、定数バッファー、およびサンプラー
読み取り/書き込みバッファーや読み取り/書き込みテクスチャーなどの追加リソース タイプ (「新しいリソースのタイプ」を参照)
サブルーチン
コンピュート シェーダー (「コンピュート シェーダーの概要」を参照) - 計算速度の向上のために設計されたシェーダー。いくつかのソフトウェア スレッドまたはスレッド グループ間で問題の領域を分割してシェーダー レジスタ間でデータを共有することにより、シェーダーへの入力が必要なデータの量を大幅に削減し、計算速度をかなり向上させます。コンピュート シェーダーによって処理速度がかなり上がる可能性のあるアルゴリズムには、後処理、アニメーション、物理計算および人口知能が含まれます。
ジオメトリ シェーダー (「ジオメトリ シェーダー機能」を参照)
- インスタンス化 - ジオメトリ シェーダーが最大 1024 個の頂点、または最大 1024 個のインスタンスと頂点の組み合わせ (最大 32 個のインスタンスにそれぞれ 32 個の頂点) を出力できるようになります。
ピクセル シェーダー
- ピクセル シェーダー入力としての範囲
- プログラム可能な入力補間 - マルチサンプル グリッド上のあらゆる場所でピクセル内の属性を評価する機能
- 重心の定義 -最初のサンプルと中心サンプルの関係を定義した後、最初のサンプルを定義
テクスチャー (「テクスチャーの概要」を参照)
Gather4
- 複数の成分を持つテクスチャーのサポート - 読み込み元のチャンネルの指定
- プログラム可能なオフセットのサポート
ストリーミング
- WDDM プリロードを制限するテクスチャー クランプ
16K テクスチャー制限
テクスチャー フィルタリング上に 8 ビットのサブテクセルおよびサブミップ精度が必要
新しいテクスチャー圧縮フォーマット (新しい LDR フォーマットと HDR フォーマットを 1 つずつ)
標準の oDepth - このアルゴリズムを使用すると、ピクセル シェーダーのピクセルごとの深度値をラスタライザーのピクセルごとの深度値と比較できます。これにより、ピクセル シェーダーから oDepth を出力する機能を維持しながら早期深度カリング処理が可能になります。
大容量メモリーのサポート
- 4GB を超えるリソースの許可
- リソースのインデックスは 32 ビットのままだが、リソースではそれを超えるビット数が使用可能
ストリーム出力の向上
- アドレス可能なストリーム出力
- ストリーム出力カウントを 4 に増加
- すべてのストリーム出力バッファーを複数要素に変更
シェーダー モデル 5 (「シェーダー モデル 5」を参照)
- 非正規化数で 2 倍
- カウント ビット設定命令
- 第 1 ビット設定命令の検出
- キャリー/オーバーフロー処理
- FFT 用ビット反転命令
- 条件付きスワップ組み込み関数
- バッファーのリリース情報
- 低精度の逆数
- シェーダー変換命令 - fp16 から fp32 (およびその逆)
- 構造化バッファー (構造化要素を含む新しいバッファー タイプ)
読み取り専用深度ビューまたはステンシル ビュー
- 読み取り専用の部分への書き込みを無効化し、テクスチャーを入力および深度カリング用に使用することを許可
間接描画 - Direct3D 10 では、GPU によって生成された内容を取り、それを GPU にレンダリングする DrawAuto が実装されます。Direct3D 11 では、DrawAuto が、コンピュート シェーダーの DrawInstanced および DrawIndexedInstanced を使用して呼び出しできるように一般化されます。
その他の機能
- 浮動小数点ビューポート
- リソースごとのミップマップ クランプ
- 深度バイアス - このアルゴリズムは、ラスタライザー ステートを使用して深度バイアスの動作を更新します。これにより、計算されたバイアスが NaN になるシナリオがなくなります。
- リソース制限 - リソース インデックスは依然として <= 32 ビットである必要がありますが、リソースを 4GB より大きくできます。
- ラスタライザー精度
- MSAA 要件
- カウンターの削減
- 1 ビット フォーマットおよびテキスト フィルターの削除