Direct3D 12 でのパイプラインとシェーダー

Direct3D 12 のプログラミング可能なパイプラインによって、前世代のグラフィックス プログラミング インターフェイスと比較して、レンダリングのパフォーマンスが大幅に向上します。

Direct3D 12 のグラフィックス パイプライン

次の図は、Direct3D 12 のグラフィックス パイプラインと状態を表しています。

Direct3D 12 のパイプラインと状態を表す図

グラフィックス パイプラインとは、GPU がフレームをレンダリングするときのデータ入力とデータ出力の順次的な流れです。 GPU は、パイプラインの状態と入力が渡されると、一連の操作を実行して、結果のイメージを作成します。 グラフィックス パイプラインには、プログラミング可能なレンダリング効果と計算を実行するシェーダーと、固定の機能操作が含まれます。

パイプラインの状態図を参照する場合、次の点に注意してください。

  • 記述子テーブルとヒープは任意に配置できます。SRV、CBV、UAV は任意の順序で参照および割り当てることができます。
  • パイプラインの一部の操作は構成可能です。 たとえば、出力マージャーは、通常、レンダー ターゲット ビューおよび深度ステンシル ビューで、Read-Modify-Write をベースとして動作します。 ただし、これらのビューのいずれかを読み取り専用または書き込み専用にするように、パイプラインを構成できます。
  • 静的サンプラーは、静的であるため、ルート引数には属しません。

パイプライン状態オブジェクト

Direct3D 12 では、パイプライン状態オブジェクト (PSO) が導入されました。 多数の高レベル オブジェクト間でパイプライン状態を保存し、表すということは行われず、入力アセンブラー、ラスタライザー、ピクセル シェーダー、出力マージャーなどのパイプライン コンポーネントの状態は PSO に保存されます。 PSO は、作成後に固定になる統合パイプライン状態オブジェクトです。 現在選択されている PSO は迅速かつ動的に変更できます。ハードウェアおよびドライバーは PSO をハードウェアのネイティブ命令および状態に直接変換して、グラフィックス処理のために GPU を準備できます。 ハードウェアは、PSO を適用するために、最小限の事前計算済みの状態をハードウェア レジスタに直接コピーします。 これにより、現在適用されているすべてのレンダリング設定およびパイプライン設定に基づいて、グラフィックス ドライバーがハードウェアの状態を継続的に再計算することで発生するオーバーヘッドがなくなります。 この結果、描画呼び出しのオーバーヘッドが大幅に削減され、パフォーマンスが向上し、フレームあたりの描画呼び出し数が増えます。

現在適用されている PSO によって、レンダリング パイプラインで使用されるすべてのシェーダーが定義され、接続されます。 Microsoft 上位レベル シェーダー言語 (HLSL) は、シェーダー オブジェクトに事前コンパイルされており、パイプライン状態オブジェクトの入力として実行時に使用されます。 グラフィックス パイプライン内で PSO がどのように機能するかについて詳しくは、「Direct3D 12 でグラフィックス パイプラインの状態を管理する」を参照してください。

Direct3D 12 の計算パイプライン

次の図は、Direct3D 12 の計算パイプラインと状態を表しています。

Direct3D 12コンピューティング パイプラインを示す図。

このパイプラインには固定的な機能単位はありませんが、記述子ヒープ、サンプラー ヒープ、および静的サンプラーは引き続き計算で使用できます。

Direct3D 12 での作業の送信