Version: Unity 6.0 (6000.0)
言語 : 日本語
複数のプラットフォーム用のコンピュートシェーダーの記述
URP でのカスタムシェーダーの記述

シェーダーの最適化

このページには、特に GPU パフォーマンスが制限されているモバイルプラットフォームにおいて、ランタイムパフォーマンスを向上させるためのシェーダーの最適化に関する情報が含まれています。

複雑な計算を回避

複雑な計算を避けるには、以下のような処理を行います。

  • powlogsin などのリソース負荷の高い関数の代わりにルックアップテクスチャを使用します。
  • 独自の関数を作成する代わりに、normalizedot などの Unity HLSL 関数を使用します。これにより、ドライバーがより適切なコードを生成できるようになります。

繰り返しの計算を避ける

シェーダーが計算を繰り返さないようにするために、以下のような処理を行います。

  • フラグメントシェーダーから頂点シェーダーに計算を移動します。そのため、計算はフラグメントごとではなく、頂点ごとにのみ実行されます。
  • 代わりに C# スクリプトで計算を行い、計算された値をシェーダーで使用します。
  • 不要な計算を回避します。例えば常に同じ色を使用する場合は、マテリアルごとに複数の色をサポートするコードを削除します。

精度の低いデータ型の使用

ワールド空間座標とテクスチャ座標を除くすべての変数に対して、float の代わりに half を使用します。詳細は、シェーダーで 16 ビット精度を使用するを参照してください。

サフィックスの代わりにキャストを使用する

Unity はサフィックスをサポートしないため、2.0h などの値は完全な float になります。つまり、GPU が計算を行う際に、他の値を float に変換したり戻したりしなければならない場合があります。これにより、シェーダーの速度が低下する可能性があります。

これを回避するには、サフィックスの代わりにキャストを使用します。例えば、2.0h の代わりに half(2.0) を使用します。

ピクセルやチャンネルの破棄を避ける

シェーダーの速度低下を回避するには、リソース負荷の高い以下の方法を避けます。

  • フラグメントシェーダーでの discard メソッド
  • モバイルプラットフォームでの ColorMask

深度バッファへの書き込みを避ける

モバイル GPU が早期に深度テストを使用してレンダリングをスピードアップできるように、フラグメントシェーダーで深度バッファに書き込まないようにします。

深度テストの詳細については、ShaderLab コマンド:: ZTest を参照してください。

追加リソース

複数のプラットフォーム用のコンピュートシェーダーの記述
URP でのカスタムシェーダーの記述