> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# なぜメッシュ シェーダーなのか?

> なぜメッシュ シェーダーなのか?

## レガシー パイプライン

過去 20 年にわたり、グラフィックス パイプラインは進化を重ね、現在おなじみの姿に到達しました。独立系ハードウェア ベンダー (IHV) が、コア数、メモリ容量、帯域幅というますます広がる競争に注力する中で、ジオメトリ処理モデルにおける特定の固定機能によるボトルネックが顕在化してきました。

**図 1. レガシー グラフィックス パイプライン。青色のステージは固定機能です。緑色のステージはプログラマブル シェーダーです。**

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/ms_legacy_pipeline.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=d9cba34b670d44348ca3562eb17e0c44" alt="レガシー グラフィックス パイプライン" width="800" height="52" data-path="images/gdk/features/graphics/ms_legacy_pipeline.png" />

これらのボトルネックの中で最も問題となるものの 1 つが入力アセンブラー (IA) です。IA は、グラフィックス パイプラインの最上位に位置するハードウェア コンポーネントで、インデックスの処理と頂点データのフェッチを担当します。IA ユニットの数は、他の GPU リソースと同じペースでスケールしていません。IA ユニットの数が少なく固定的であることにより、起動レートが制約され、GPU コアを作業で飽和させることに失敗することが多くあります。

ジオメトリ パイプラインの末尾には、プリミティブ アセンブラー (PA) があります。このハードウェア コンポーネントは、変換された頂点をプリミティブに構成し、カリングおよびクリッピング ルーチンを実行し、生き残ったインスタンスをラスタライズに転送します。エクスポート レートは固定であり、このレートを維持することは困難な場合があります。場合によっては、これは IA が原因となることもあります。シェーダー ウェーブをパイプラインへより速く投入できれば、より多くのプリミティブを並行して投入できるからです。並行してより多くの処理が進行中であれば、PA への負荷をより良く維持できます。

レガシー グラフィックス パイプラインのもう 1 つの制限は、従来のパイプラインではジオメトリ カリングの手段が限られていることです。カリングされるジオメトリは実効スループットを低下させ、日の目を見ない頂点属性の読み込みとシェーディングのためにメモリ帯域幅と ALU を無駄に消費します。理想的には、可能な限り早い段階でジオメトリをカリングするために、さまざまな粒度でカリングできるようにしたいところです。

## メッシュ シェーダー パイプライン

メッシュ シェーダー パイプラインは、これらのレガシー グラフィックス パイプラインの制限を解決することを目的としています。まず、パイプラインから IA とテセレーターが削除されます。これは、シェーダー ウェーブの起動レートを最大化し、IA を GPU に応じてスケール可能なシェーダー コードへ移すことを目的としています。これにより、GPU コアを飽和させ、PA への負荷を維持しやすくなります。

このパイプラインはまた、パイプライン内のさまざまなポイントでワークロードをカリングする機能を提供します。Amplification Shader は、グループ化されたオブジェクト、インスタンス、[メッシュレット](/build/core-features/graphics/newfeatures/ms/ms-meshlet-render) に対するような低粒度のカリングに使用できます。メッシュ シェーダーはプリミティブごとの粒度でカリングを行えます。これにより、簡単にカリング可能なプリミティブを早期かつ頻繁に破棄する経路が提供され、貴重な計算資源、メモリ帯域幅、PA スループットが節約されます。

**図 2. メッシュ シェーダー パイプラインのステージ。緑色のステージはプログラマブルです。青色のステージは固定機能です。**

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/ms_mesh_shader_pipeline.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=1bdf8c428560eef0a048ae32c01c9759" alt="メッシュ シェーダー パイプラインのステージ図" width="800" height="100" data-path="images/gdk/features/graphics/ms_mesh_shader_pipeline.png" />

## メッシュ シェーダー

メッシュ シェーダーは、コンピュート シェーダーにのみ見られるような汎用性のレベルをジオメトリ パイプラインにもたらすように設計されています。これにより、開発者は各スレッドのワークロードを完全に制御できるようになります。インデックスと頂点属性のフェッチをシェーダー コードに移すことで、固定機能ハードウェアへの依存が排除され、ウェーブの起動レートが最大化され、IA が GPU の他の部分と一緒にスケールできるようになります。

頂点数とプリミティブ数のエクスポート カウントを動的に指定する能力により、プリミティブ カリングのためのオンチップでの効率的なサポートへの扉が開かれます。これはメッシュ シェーダー内で、メッシュレット単位あるいはプリミティブ単位で、任意のカリング基準に対して実行できます。これにより、シェーダーは、複数レイヤーのカリングが既に行われた後のパイプライン末尾まで、頂点属性のフェッチとシェーディングを遅延できるようになります。

## Amplification Shader

コンピュート シェーダーはリソースの前処理によく使用され、その結果を消費する ExecuteIndirect を使ったドロー コールが続くというパターンが一般的です。これは、さまざまな種類のビュー単位カリングでよく用いられる手法です。これには、適切なハードウェア サポートによって最適化できる、いくつかの微妙な欠点があります。

まず 1 つに、コンピュート シェーダーのインスタンスは、そのデータをグローバル メモリに書き込む必要があります。これによりフェッチのレイテンシーが発生し、GPU 全体のメモリ帯域幅の競合の対象となります。次に、コンピュート プロデューサーとグラフィックス コンシューマーが連続する操作である場合、GPU はコンシューマーとなるドロー コールを起動する前に、すべてのコンピュート シェーダー インスタンスがリタイアするのを待たなければなりません。これは、あらゆるシェーダーが最終的な UAV を消費する前に、その UAV へのすべてのコンピュート シェーダー書き込みが完了していることを保証しなければならないアンオーダード アクセス ビュー (UAV) リソース バリアが原因です。

**図 3. コンピュート シェーダーに続けて直ちに ExecuteIndirect "DispatchMesh" ドローを行う場合の、簡略化されたウェーブ スケジューリングの可視化。コンピュート シェーダーのウェーブ (黄色) は、UAV バリアによるパイプライン ストールにより、メッシュ シェーダー ウェーブ (緑) の実行から分離されます。番号付きの ID は、呼び出し元のコンピュート シェーダー スレッドグループと、その子となるメッシュ シェーダーのクラスターとの対応を示します。**

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/ms_schedule_cs.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=5ea9ae53609437c8168f1b97ea9e501c" alt="DispatchMesh を使って直後に ExecuteIndirect 呼び出しを行うコンピュート シェーダー ワークロードの、簡略化されたウェーブ スケジューリング可視化の図。黄色で示されたコンピュート シェーダー ウェーブは、緑色で示された対応するメッシュ シェーダー ウェーブの実行から、UAV リソース バリアによるパイプラインのストールで隔てられています。" width="810" height="96" data-path="images/gdk/features/graphics/ms_schedule_cs.png" />

Amplification Shader ステージはこれらの問題に対処することを意図しています。プロデューサーとコンシューマーはパイプライン化されており、オンチップのステージ間メモリを持ち、中間のパイプライン フラッシュはありません。Amplification Shader とメッシュ シェーダーのウェーブのスケジューリングは互いに入り交じっており、GPU を作業でより完全に飽和させることができます。

また、レガシー グラフィックス パイプラインには単に存在しない、一般化されたワークロード削減または増幅機能のレベルを開くことができます。これは、カリング手法、動的なインスタンス レベル オブ ディテール (LOD) 選択、カスタム テセレーション ルーチンなどの機能を実装するために使用できます。

**図 4. Amplification Shader ワークロードのウェーブ スケジューリングの可視化。ストールはパイプラインから排除されます。番号付きの ID は、呼び出し元の Amplification Shader スレッドグループと、その子となるメッシュ シェーダーのクラスターとの対応を示します。**

<img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/ms_schedule_driver.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=762afa8cd6264b490a8c4a450e683243" alt="Amplification Shader ワークロードを示す簡略化されたウェーブ スケジューリング可視化の図。黄色で示された Amplification Shader ウェーブは、緑色で示された対応するメッシュ シェーダー ウェーブと入り交じっており、パイプラインからストールが排除されています。" width="670" height="95" data-path="images/gdk/features/graphics/ms_schedule_driver.png" />

## 関連項目

[メッシュ シェーダー パイプラインの概要](/build/core-features/graphics/newfeatures/ms/ms-overview)

[メッシュ シェーダー API の概要](/build/core-features/graphics/newfeatures/ms/ms-api-design)

[メッシュ シェーダー パイプラインの使用方法](/build/core-features/graphics/newfeatures/ms/ms-usage)


## Related topics

- [メッシュ シェーダー パイプライン API の概要](/ja-jp/build/core-features/graphics/newfeatures/ms/ms-api-design.md)
- [メッシュレット カリングの例](/ja-jp/build/core-features/graphics/newfeatures/ms/ms-meshlet-culling.md)
- [XBOX Series X|S のメッシュ シェーダーとメッシュレット](/ja-jp/build/core-features/graphics/newfeatures/ms/index.md)
- [メッシュ シェーダー パイプラインの概要](/ja-jp/build/core-features/graphics/newfeatures/ms/ms-overview.md)
- [メッシュレット](/ja-jp/build/core-features/graphics/newfeatures/ms/ms-meshlet-render.md)
