Version: 2020.1
言語: 日本語
旧シェーダーコード
法線シェーダーファミリー

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

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

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

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

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

このためピクセル Lit シェーダーはパフォーマンスコストが大きいですが、そのコストにより素晴らしい効果が得られます。代表的な名前だけ挙げても影、法線マッピング、見栄えの良いスペキュラーハイライトや ライトクッキーなどあります。

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

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

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

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

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

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

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

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

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