Version: Unity 6.0 (6000.0)
言語 : 日本語
シェーダーのロード
シェーダーバリアントコレクションの作成

シェーダーの事前準備

構築したアプリケーションで初めてシェーダーバリアントが使用されると、シーンがスタッターする場合があります。これは、Unity とグラフィックスドライバーがシェーダーバリアントをコンパイルし、コンパイルされたシェーダーコードとそれに関連する GPU 状態でパイプライン状態オブジェクト (PSO) を作成する必要があるためです。

スタッターを軽減するには、シェーダーをコンパイルし、最初に必要になる前に PSO を作成して、グラフィックスドライバーがそれらをディスクにキャッシュできるようにします。これはウォームアップや事前準備、事前調理と呼ばれます。通常は、アプリケーションの起動時やシーンのロード中など、ロード画面の間にウォームアップを行います。

ノート: 一部の API は実験的であり、本番環境では使用できません。API とドキュメントは今後、変更または削除される可能性があります。

DirectX 12、Metal、または Vulkan によるシェーダーのウォームアップ

DirectX 12、Metal、または Vulkan のシェーダーをウォームアップするには、実験的 GraphicsStateCollection API を使用します。この API は、最新のグラフィックス API が正確な PSO を作成およびキャッシュするために必要な、プロジェクトでランタイムに使用される特定の GPU 状態を収集します。

以下の手順に従ってください。

  1. ビルドしたアプリケーションのテスト実行で、GraphicsStateCollection.BeginTrace メソッドと GraphicsStateCollection.EndTrace メソッドを使用して、アプリケーションが使用するシェーダーバリアントと GPU 状態を記録します。
  2. 記録された情報を .graphicsState ファイルとして保存するために、GraphicsStateCollection.SendToEditor API を使用します。
  3. 最終的なプロジェクトで、.graphicsstate ファイルをロードし、WarmUp API または WarmUpProgressively API を使用してシェーダーバリアントをウォームアップします。どちらの API も、シェーダーバリアントを非同期でウォームアップするために使用できる JobHandle オブジェクトを返します。

使用するグラフィックス API ごとに異なる .graphicsstate ファイルを作成する必要があります。

詳細については、GraphicsStateCollection を参照してください。

他のグラフィックス API によるシェーダーのウォームアップ

以下のようにウォームアップを行います。

  • シェーダーオブジェクトをウォームアップするには、Experimental.Rendering.ShaderWarmup API を使用します。
  • Shader.WarmupAllShaders API を使用して、現在メモリ内にあるすべてのシェーダーオブジェクトのすべてのバリアントをウォームアップします。

シェーダーバリアントコレクションをウォームアップするには、以下のいずれかを行います。

シェーダーがウォームアップされたかの確認

Unity とグラフィックスドライバーでシェーダーがコンパイルされ、PSO が作成されるタイミングを確認するには、プロファイラーで以下のプロファイラーマーカーを検索します。

  • Unity で GPU 固有のシェーダーバリアントのバージョンを作成する Shader.CreateGPUProgram
  • Unity で PSO を作成する CreateGraphicsGraphicsPipelineImpl

追加リソース

シェーダーのロード
シェーダーバリアントコレクションの作成