旧シェーダーコード
法線シェーダーファミリー

Unity シェーダーのパフォーマンス

Unityのシェーダーは、基本的にテクスチャのようなパラメーターを使用してシェーダーコードを組み合わせて Material を介して使用されます。シェーダー/マテリアル関係の詳しい説明はマテリアルの作成と使用で読むことができます。

マテリアルプロパティーは、マテリアルが選択されているかマテリアルの使用されている ゲームオブジェクト を選択している場合、インスペクター に表示されます。マテリアルのインスペクターは次のようになります。

各マテリアルは、マテリアルに使用されている特定のシェーダーに応じてインスペクターの見た目に少し違いが出ます。シェーダー自体がインスペクターの中で調節可能なプロパティーの種類を決めています。マテリアルインスペクターについての詳細は マテリアル を参照してください。シェーダーがマテリアルを介して実装されていることを覚えておいてください。シェーダーがインスペクターに表示されプロパティーを定義している一方、それぞれのマテリアルが実際にスライダー、カラー、テクスチャから調整されたデータを持っています。最も重要なことは、単一のシェーダーが複数のマテリアルで使用することができるということです。しかし、単一のマテリアルでは、複数のシェーダーを使用することはできません。

Unity シェーダーのパフォーマンス

ゲームの全体的なパフォーマンスに影響する要素はたくさんあります。このページは 旧シェーダーコード に絞ってパフォーマンスの考慮事項を説明します。シェーダーのパフォーマンスは主に 2 つのことに大きく影響を受けます:シェーダー自体と、プロジェクトあるいは特定のカメラにより使用される Rendering Path です。自分でシェーダーを記述する際のパフォーマンスの秘訣については シェーダーを書く場合のパフォーマンスのヒント のページを参照してください。

レンダリングパスとシェーダーパフォーマンス

Unity でサポートされているレンダリングパスのうち、Deferred ShadingVertex Lit がもっともパフォーマンスを予見できます。Deferred Shading では各オブジェクトは一般にどのようなライトに影響を受けるかに関わらず 2 回描画されます。同様に Vertex Lit で各オブジェクトは 1 回だけ描画されます。すなわちシェーダーのパフォーマンスの違いは使用してるテクスチャの数とどのような計算を行うかに依存します。

Forward レンダリングパスのシェーダーパフォーマンス

Forward レンダリングパスではシェーダーのパフォーマンスはシェーダー自体とシーンのライト 両方 に影響を受けます。次のセクションは詳細について説明します。パフォーマンス観点から 2 つの基本的なカテゴリがあり、Vertex-LitPixel-Lit です。

Forward レンダリングパスの Vertex-Lit シェーダーは常に Pixel-Lit シェーダーより安価です。これらのシェーダーはメッシュ頂点にもとづいてライティングを計算します。このため、オブジェクトにいくつライトが照らされていても、描画するのは 1 回のみとなります。

Pixel-Lit シェーダーは描かれたピクセルごとに最終的なライティングを計算します。このため、オブジェクトは Ambient (環境光)と Directional light (指向性照明)を得るために 1 回描画され、追加のライティングごとに 1 回描画する必要があります。計算式は N 回のレンダリングパスであり、N はオブジェクトに最終的に照らされる pixel light の数です。これにより CPU の処理、グラフィックカードへの命令発信、頂点とピクセルを描画するグラフィックスカード、の負荷が増加します。スクリーンに表示される Pixel-lit オブジェクトの大きさもまた描画速度に影響します。オブジェクトが大きいほど描画に時間がかかります。

このため pixel lit シェーダーはパフォーマンスコストが大きいですが、そのコストにより素晴らしいエフェクトが得られます:代表的な名前だけ挙げても影、法線マッピング、よい見栄えの specular highlight や light cookie などあります。

ライトを強制的に、pixel (“重要”)あるいは vertex/SH (“さして重要でない”)のモードに、切り替えることができることを覚える必要があります。Pixel-Lit シェーダーに照らされる vertex lights はオブジェクトの頂点と全体で計算され、レンダリングコストあるいは light に伴う映像エフェクトには加えられません。

一般的なシェーダーのパフォーマンス

旧シェーダーコード について、おおよそ次の順序にしたがって複雑さが増加します。

  • Unlit . テクスチャのみ、ライティングによる影響をうけません。
  • VertexLit
  • Diffuse
  • Normal mapped . Diffuse (拡散)よりわずかに高価:テクスチャ(法線マップ)をひとつ、シェーダーの指示を複数追加します。
  • Specular . Specular highlight (鏡面ハイライト)の計算を追加します。
  • Normal Mapped Specular . Specular よりわずかに高価。
  • Parallax Normal mapped . Parallax 法線マッピング計算を追加します。
  • Parallax Normal Mapped Specular . Parallax 法線マッピングと Specular highlight (鏡面ハイライト)計算を追加します。

モバイルのシンプルなシェーダー

さらに、Unity はモバイルプラットフォーム向けのシンプルなシェーダーをいくつか“Mobile”カテゴリーの下に用意しています。これらシェーダーは他のプラットフォームでも良く動作するため、このシンプルさ(例えば、approximate specular、no per-material color support (ほぼ鏡面、マテリアルごとのカラーサポートなし)等)を活用するため、是非とも試してみてください。

各シェーダーに行った特定の簡素化を見るには、Built-in shaders パッケージの .shader ファイルを見てください。情報はファイルの一番上のコメント内にリストされています。

以下のように変更例のいくつかは、複数のモバイルシェーダーに共通です。

  • シェーダーに色合いを加えるマテリアルの色や主要な色はありません。
  • シェーダーが法線マップを取得するために、ベーステクスチャからタイリングとオフセットが使用されます。
  • パーティクルシェーダーは AlphaTestColorMask をサポートしません。
  • 制限された特性とライティングのサポート - 例えば、シェーダーの中には 1 つのディレクショナルライトしかサポートしないものがある、など。
旧シェーダーコード
法線シェーダーファミリー