Unity は、以下の方法で、ビルドされたアプリケーションから コンパイルされたシェーダー をロードします。
このアプローチを用いた場合、Unity とグラフィックスドライバーは、Unity がシェーダーバリアントを必要とするまでは、全てのシェーダーバリアントの処理および GPU への保存を行いません。ただし、グラフィックスドライバーが初めて GPU 固有のシェーダーバリアントを作成する時に、目に見えるストールが発生する可能性があります。
Unity は、それぞれの GPU 固有シェーダーバリアントをキャッシュして、そのシェーダーバリアントが再び必要になった時に再度ストールが発生するのを防ぎます。
シェーダーバリアントを参照するオブジェクトがなくなると、Unity は、そのシェーダーバリアントを CPU および GPU メモリから完全に削除します。
Unity は、プラットフォームのグラフィックス API、ハードウェア、および グラフィックスティア と互換性のあるコンパイル済みシェーダーのみをロードします。
(開発者または Unity が、ビルドしたアプリケーションから シェーダーバリアントをストリッピング したために) 必要なシェーダーバリアントが見つからない場合、Unity は、類似したシェーダーバリアントの選択を試みます。類似したシェーダーバリアントが見つからない場合、Unity は、マゼンタの エラーシェーダー を使用します。
シェーダーバリアントの厳密な照合を有効にする ことで、Unity が類似のシェーダーバリアントの選択を試みないようにすることができます。
シェーダーバリアントに複数の サブシェーダー が含まれている場合、Unity は、以下の全てと互換性のある 1 つのサブシェーダーの選択と使用を試みます。
Unity は、以下の要素の中から、以下の順番で、互換性のある最初のサブシェーダーを探します。
Unity は、互換性のあるサブシェーダーが見つからない場合には、マゼンタのエラーシェーダーを使用します。
ShaderLab タグを使用して、どのサブシェーダーにどのハードウェアと互換性を持たせるか設定できます。詳細については、ShaderLab: タグを SubShader に割り当てる を参照してください。
シェーダーがシリアライズされたデータからロードされるタイミングを確認するには、プロファイラー で以下のプロファイラーマーカーを検索します。
Shader.ParseThreadedShader.ParseMainThread