シェーダーのコンパイラーで処理してプレイヤーデータに含めるかを開発者が制御できるようになったことにより、プレイヤーのビルド時間とデータサイズが大幅に削減されます。プレイヤーのビルド時間とデータサイズはプロジェクトの複雑性が増すにつれて増加します。これはシェーダーバリアントの数が増えるためです。ベータ版で初公開となったスクリプタブルシェーダーバリアントの除去機能によって、シェーダーバリアントの生成数の管理が可能となり、結果としてプレイヤーのビルド時間とデータサイズの大幅な削減が可能になりました。この機能を使用すると、無効なコードパスを含むすべてのシェーダーバリアントを除去したり、使用されていない機能のシェーダーバリアントを除去することができます。「release」などのシェーダービルド設定を、イテレーション時間を長くしたり、メンテナンスを複雑にしたりすることなく作成できます。本記事は、まず始めにいくつかの用語について解説した上で、シェーダーバリアントの定義に焦点を当て、非常に多数の生成が可能な理由をご説明します。シェーダーパイプラインのアーキテクチャーに実装されているかをご説明します。ついてのご紹介と『Fountainbleau』デモの結果の解説をお届けし、最後に除去スクリプトを記述するに当たってのヒントをご紹介します。スクリプタブルシェーダーバリアントの除去について学ぶことは容易なタスクとは言えませんが、チームの生産性の劇的な向上に繋がるかもしれません!各種の概念スクリプタブルシェーダーバリアントの除去機能を理解するには、それに関連する様々な概念を正確に理解する必要があります。含む、完全なソースコードです。レンダリングパイプライン内の特定のステージです。通常は頂点シェーダーステージとフラグメントシェーダーステージです。シェーダーキーワード:複数のシェーダーにわたるコンパイル時ブランチのプリプロセッサー識別子です。シェーダーキーワードセット:特定のコードパスを識別する、特定のシェーダーキーワードの一式です。シェーダーコンパイラーによって生成されるプラットフォームごとのシェーダーコードです。特定のグラフィックスのティア/パス/シェーダーキーワードセットなどに関して、特定のシェーダーステージ用に生成されます。ウーバーシェーダー:多数のシェーダーバリアントを生成できるシェーダーソースコードです。プリプロセッサーディレクティブによって管理されます。シェーダーバリアントの生成数のカウントスクリプタブルシェーダーバリアントの除去機能を使用するには、シェーダーバリアントとは何か、またシェーダーバリアントがシェーダービルドパイプラインによってどのように生成されるかを明確に理解する必要があります。生成されるシェーダーバリアントの数は、ビルド時間とプレイヤーシェーダーバリアントのデータサイズに正比例します。シェーダーバリアントは、シェーダービルドパイプラインの出力のひとつです。シェーダーキーワードは、シェーダーバリアントを生成させる要素のひとつです。シェーダーキーワードの不用意な使用は、シェーダーバリアントの数の爆発的な増加に繋がりやすく、この場合ビルド時間が極度に長くなってしまいます。以下の簡単なシェーダーは、シェーダーバリアントの生成数をカウントするものです。シェーダーバリアントがどのように生成されるかをご確認いただけます。keyword"#endif}ENDCG}}}プロジェクト内のシェーダーバリアントの合計数は決定性で、以下の公式によって決定されます。例が、この公式に明確さをもたらしています。これは、以下のように公式を単純化する単一のシェーダーです。これに類似して、このシェーダーは単一のサブシェーダーと単一のパスを持っているので、公式が以下のようにさらに単純化されます。この公式内のキーワードは、プラットフォームとシェーダーキーワードの両方を参照します。グラフィックスのティアとは、プラットフォームキーワードのセットの特定の組み合わせです。つのマルチコンパイルディレクティブを持っています。つのキーワード(OP_ADD、OP_MUL、OP_SUB)を定義します。つのシェーダーステージ(頂点シェーダーステージとフラグメントシェーダーステージ)を定義します。それぞれに関して、専用のシェーダーバリアントのセットが必要です。数に正比例することになります。バリアントの前処理命令の収集前にシェーダースニペットを抽出するために、プロジェクト内の各シェーダーがパースされます。これらのコンパイルパラメーターには、シェーダースニペット、グラフィックスのティア、シェーダータイプ、シェーダーキーワードセット、パスタイプおよびパスの名前が含まれます。設定されたコンパイルパラメーターのそれぞれは単一のシェーダーバリアントの生成に使用されます。つのヒューリスティックに基づいて実行します。目は、除去をプロジェクト設定に基づいて行うものです。シェーダーバリアントが系統的に除去されます。Stripping」セクションに基づいて行うものです。設定のシェーダーバリアント自動除去のオプションシェーダーバリアントの自動除去は、ビルド時の制約に基づきます。ビルド時に必要なシェーダーバリアントのみを自動で選択することはできません。実行に依存するからです。スクリプトがポイントライトを追加するが、ビルド時にポイントライトがない場合は、シェーダービルドパイプラインは、ポイントライトシェーディングを行うシェーダーバリアントがプレイヤーによって必要とされることを把握する術がありません。以下は、自動除去される、有効なキーワードを含むシェーダーバリアントのリストです。無効になっている場合、以下の有効な組み込みのキーワードを持つシェーダーバリアントが除去されます。STEREO_INSTANCING_ON、STEREO_MULTIVIEW_ON、STEREO_CUBEMAP_RENDER_ON、UNITY_SINGLE_PASS_STEREO自動除去が行われる時、シェーダービルドパイプラインは、残りのコンパイルパラメーターセットを使用してシェーダーバリアントの同時コンパイルのスケジュールを設定します。コアスレッドの数と同数のコンパイルが同時に実行されます。以下は、このプロセスを視覚的に示した図です。ベータ版では、シェーダーパイプラインアーキテクチャーの、シェーダーバリアントのコンパイルのスケジュール設定の直前に新しいステージが追加されており、シェーダーバリアントのコンパイルをユーザーが制御できるようになっています。コールバック経由で利用可能で、各コールバックはシェーダースニペットごとに実行されます。API例えば、以下のスクリプトでは(開発プレイヤービルド内で使用される「DEBUG」キーワードによって識別される)「DEBUG」設定に関連付けられるすべてのシェーダーバリアントの除去を行えます。複数のコールバックを実装可能です。小さい数を戻すものです。複数のコールバックを実装可能です。小さい数を戻すものです。インスタンスの各組み合わせが、シェーダーコンパイラーによって生成される単一のシェーダーバリアントの識別子です。リストから削除するだけで行えます。シェーダーコンパイラーが生成すべきすべてのシェーダーバリアントがこのコールバック内に表示されます。シェーダーバリアントの除去を行う際はまず、プロジェクトの役に立たない、削除すべきバリアントはどれかを明確にする必要があります。結果レンダーパイプラインのためのシェーダーバリアントの除去スクリプタブルシェーダーバリアントの除去のユースケースのひとつは、無効なシェーダーバリアントを、シェーダーキーワードの各種組み合わせに基づいて系統的に除去するというものです。レンダーパイプラインを使用したプロジェクトのビルド時間とサイズを系統的に削減します。このスクリプトは以下のシェーダーに適用可能です。HDRenderPipeline/LitHDRenderPipeline/LitTessellationHDRenderPipeline/LayeredLitHDRenderPipeline/LayeredLitTessellationこのスクリプトは以下の結果をもたらします。シェーダーバリアントを自動除去でき、特にモバイルプロジェクトにおいて非常に有益であると予測されます。プロジェクトのためのシェーダーバリアント除去もうひとつのユースケースは、特定のプロジェクトにおいて使用されていないレンダーパイプラインのすべてのレンダリング機能を除去するスクリプトです。ライトウェイトレンダーパイプラインで弊社の内部的なテスト用デモを使用した所、プロジェクト全体に以下の結果がもたらされました。秒ご覧の通り、スクリプタブルシェーダーバリアントの除去機能を使用することで非常に大きな効果を得ることが可能です。除去スクリプトにさらに手を加えれば、これより大きな結果がもたらされることも期待できます。ライトウェイトレンダーパイプラインのデモのスクリーンショットシェーダーバリアント除去コード記述のためのヒントシェーダーコードの設計を改善するシェーダーバリアント数の爆発的な上昇は簡単に発生し得るもので、これによってコンパイル時間とプレイヤーのデータサイズが維持不可能なものになる場合があります。スクリプタブルシェーダーバリアントの除去機能は、この問題に対処する一助となりますが、より関連性の高いシェーダーバリアントを生成するためには、シェーダーキーワードをどのように使用しているか再評価する必要があります。シェーダー内では、前処理ディレクティブが以下のコードで宣言されます。オペレーターキーワードこのアプローチでは、色のキーワードとオペレーターキーワードのすべての組み合わせが生成されます。以下のシーンをレンダーしたいと仮定しましょう。OP_MULまず、すべてのキーワードが実際に役立つものであることを確認する必要があります。一切使用されていません。これらのキーワードが一切使用されていないことが保証できれば、これらは削除するべきです。次に、単一のコードパスを効果的に生成するキーワードを組み合わせます。この例では、「add」オペレーションは常に「orange」色と共にしか使用されていません。したがって、これらを単一のキーワード内で組み合わせて以下のようにコードをリファクタリングできます。OP_MUL#endifもちろん、キーワードのリファクタリングが可能でないこともあります。使用して複数のステップでシェーダーバリアントを除去する各スニペットに関して、すべてのシェーダーバリアント除去スクリプトが実行されます。メンバー関数によって戻された値を命令することで、スクリプトの実行を命令できます。増加する順にこのコールバックを実行しますので、最も低いものが最初に、最も高いものが最後になります。複数のシェーダー除去スクリプトを使用するユースケースのひとつは、スクリプトを目的ごとに分離するものです。以下のようなケースです。1:無効なコードパスを持つすべてのシェーダーバリアントを系統的に除去します。2:すべてのデバッグシェーダーバリアントを除去します。3:コードベース内の、現在のプロジェクトに不要なシェーダーバリアントをすべて除去します。4:除去スクリプトのイテレーション時間を短縮するために、残っているシェーダーバリアントをログしてそれらすべてを除去します。シェーダーバリアント除去スクリプトの記述手順シェーダーバリアントの除去は極めて効果的ですが、良い結果を得るためには多くの作業を要します。プロジェクトビューで、すべてのシェーダーをフィルタリングします。シェーダーをひとつ選択し、インスペクター内で「Show」をクリックしてそのシェーダーのキーワードとバリアントのリストを開きます。ビルドに常に含まれているキーワードが一覧表示されます。プロジェクトが使用しているグラフィックス機能を確実に把握してください。キーワードが使用されているかどうかをすべてのシェーダーステージで確認してください。スクリプト内でシェーダーバリアントを除去します。ビルドのビジュアルを確認してください。サンプルプロジェクトのダウンロード本記事で使用されたサンプルプロジェクトはこちらでダウンロード可能です。以降のバージョンをお使いください。Berlinで、バイナリのデプロイサイズの最適化について詳しくご紹介しています。講演で、最終的な完成版ビルドに何を含めるか制御できる新しいツールの全貌が紹介されました。講演の録画はこちらからご覧になれます。ニュースを受信し始めるには、あなたのメールアカウントにお送りしたリンクをクリックしてください。おっと...何らかの支障がありました。一度やり直してください。PolicyCookies。