Version: Unity 6.0 (6000.0)
言語 : 日本語
エディターでの非同期シェーダーコンパイル
シェーダーの非同期コンパイルを有効化/無効化

非同期シェーダーコンパイルの概要

シェーダーオブジェクトには数百から数千のシェーダーバリアントが含まれている場合があります。シェーダーオブジェクトをロードするときに、エディターですべてのバリアントをコンパイルするとインポートプロセスが非常に遅くなります。そのためエディターでは、最初にシェーダーバリアントを検出したときに、必要に応じてコンパイルします。

これらのシェーダーバリアントをコンパイルすると、グラフィックス API やシェーダーオブジェクトの複雑さに応じて、エディターがミリ秒から数秒にわたってストール (待機) することがあります。このようなストールを避けるために、非同期シェーダーコンパイルを使用してシェーダーバリアントをバックグラウンドでコンパイルし、その間プレースホルダーシェーダーオブジェクトを使用することができます。

非同期シェーダーコンパイルのしくみ

非同期のシェーダーコンパイルは以下のように行われます。

  1. エディターが、コンパイルされていないシェーダーバリアントを初めて検出すると、そのシェーダーバリアントをジョブスレッド上のコンパイルキューに追加します。エディターの右下にあるプログレスバーは、コンパイルキューの状態を示しています。
  2. シェーダーバリアントのロード中、エディターはプレースホルダーシェーダーでジオメトリを描画します。これは無地のシアン色として表示されます。
  3. エディターがシェーダーバリアントのコンパイルを終了すると、シェーダーバリアントを使用してジオメトリを描画します。
Unity は、コンパイル中のシェーダーバリアントを、コンパイルが完了するまでシアンのダミーシェーダーでレンダリングします。右下のプログレスバーは、コンパイルキューの進行状況を示します。
Unity は、コンパイル中のシェーダーバリアントを、コンパイルが完了するまでシアンのダミーシェーダーでレンダリングします。右下のプログレスバーは、コンパイルキューの進行状況を示します。

例外

以下の例外があります。

  • DrawProcedural または CommandBuffer.DrawProcedural を使用してジオメトリを描画する場合、エディターはプレースホルダーシェーダーを使用しません。代わりに、エディターはシェーダーバリアントのコンパイルが終了するまで、このジオメトリの描画をスキップします。
  • Unity エディターは、Blit 操作による非同期シェーダーコンパイルを使用しません。これは、最も一般的な使用例で正しい出力を保証するためです。
エディターでの非同期シェーダーコンパイル
シェーダーの非同期コンパイルを有効化/無効化