
低レベルAPIでのメッシュシェーダーとメッシュレットのサポート

Evergineの最新安定版では、エンジン内のシェーダーモデルサポートを拡張しました。以前のバージョンのシェーダーモデル6.3からシェーダーモデル6.7に移行し、シェーダーでより幅広い命令セットを活用できるようになりました。
しかし、今回のアップデートで最もエキサイティングな点は、Evergineの低レベルレイヤーにメッシュシェーダーを実装する道が開かれ、DirectX 12とVulkanの両方で既に動作する統一インターフェースを提供していることです。
メッシュシェーダーとは?
メッシュシェーダーの概念は2018年にNVIDIAによって導入されましたが、実装されたのは2020年のDirectX 12 Ultimateからで、その後すぐにVulkanの拡張としても実装されました。
この新しいパイプラインは、レンダリング可能なメッシュをメッシュレットと呼ばれる小さな断片に分割することを提案しており、これにより非常に興味深い最適化が可能になります。
- メモリ使用量の削減。
- より効率的なカリング技術(視錐台カリングとオクルージョンカリング)。
- GPUがはるかに多くのメッシュを処理できるようになるため、複雑なシーンでのパフォーマンスが向上します。
つまり、メッシュシェーダーは、GPU上でジオメトリが生成および処理される方法を再考し、従来のラスタライゼーションパイプラインの一部を、よりコンパクトで柔軟なフローに置き換えるものです。
パイプラインの比較

従来のラスタライゼーションパイプラインは3つの固定機能ステージと5つのプログラマブルステージで構成されていますが、メッシュシェーダーを用いた新しいパイプラインは、2つの固定機能ステージと3つのプログラマブルステージに簡略化されています。
ピクセルシェーダーは両方のパイプラインに存在しますが、主な違いはジオメトリ生成にあり、そこに2つの新しいステージが登場します。
- タスクシェーダー(DX12ではアンプリフィケーションシェーダー、Metalではオブジェクト関数としても知られています)。
- メッシュシェーダー(頂点シェーダー、ジオメトリシェーダー、ハルシェーダーの役割を置き換え、拡張します)。
Evergineでの実用例
その動作を説明するために、Evergineで三角形を描画するには、メッシュシェーダーとピクセルシェーダーだけが必要です。

結果:

メッシュシェーダーは、位置と色を持つ3つの頂点を定義し、三角形化のためのインデックスを指定します。従来の頂点シェーダー、ジオメトリシェーダー、ハルシェーダーとは異なり、ここではメッシュをメッシュレットに自動分割する可能性を含め、はるかに大きな自由度が得られます。
メッシュレットとは?
メッシュレットは、GPUが非常に効率的に処理できる頂点と三角形の小さなグループです(理想的には64頂点と126三角形)。

これらのグループを自動生成するために、いくつかのライブラリが利用可能ですが、業界標準となっているのはMeshOptimizer(Arseny Kapoulkine氏作)です。
Evergineでは、このライブラリ向けにC#のバインディングを作成し、NuGetパッケージとして利用可能にしました。これにより、メッシュをメッシュレットに簡単に分割できます。
バインディングの使用例:

メッシュが分割されると、シェーダーはメッシュレットデータを展開し、最適にレンダリングできます。

メッシュレットコレクションからメッシュをレンダリングするメッシュシェーダーは次のようになります。


タスクシェーダー: 効率的なカリング
Task Shaderはオプションですが、どのメッシュレットをMesh Shaderステージに送信するかを決定できるため、特に興味深いものです。
これにより、オクルージョンカリング技術を非常に簡単に実装でき、可視のメッシュレットのみをレンダリングします。多数のオブジェクトがある大規模なシーンでは、リソースの節約は非常に大きくなります。
例: 画面の左側にあるすべてのメッシュレットを破棄し、右半分にあるものだけをレンダリングするタスクシェーダー。


デモとオープンソース
メッシュシェーダーを用いた新しいパイプラインは、Evergineの低レベルレイヤーですでに利用可能であり、DX12とVulkanで実験を開始できます。
この記事で使用したデモの完全なソースコードは、リポジトリからダウンロードできます。
メッシュのメッシュレットへの分割と、この新しいパイプラインでのレンダリングに関する他の例も含まれています。



まとめ
メッシュシェーダーの登場は、Evergineにとって非常に重要な一歩であり、最新のGPUを完全に活用することを可能にします。この技術により、より多くのジオメトリをより効率的にレンダリングでき、また、MeshOptimizerバインディングのようなツールを使って、すぐにメッシュレットでの作業を開始できます。
