Version: Unity 6.0 (6000.0)
言語 : 日本語
レガシーの事前ビルドシェーダー
法線シェーダーファミリー

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

Unity のシェーダーは Material (マテリアル) を介して使用されます。マテリアルは基本的に、テクスチャのようなパラメーターを使用してシェーダーコードを組み合わせたものです。シェーダーとマテリアルの関係について、詳しい説明はこちらを参照してください。

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

各マテリアルの Inspector での外観は、使用しているシェーダーによって若干、異なります。シェーダー自体が、Inspector で調整できるプロパティの種類を決定します。マテリアルの Inspector については、マテリアルのリファレンスページで詳しく説明されています。重要なのは、シェーダーがマテリアルを通じて実装されることです。そのため、シェーダーによって Inspector に表示されるプロパティが決まりますが、各マテリアルに実際に設定されているのは、スライダー、色、テクスチャから調整されたデータです。これに関して特に重要なことは、1 つのシェーダーを複数のマテリアルで使用できる一方で、複数のシェーダーを 1 つのマテリアルで使用することはできない点です。

シェーダーの名前

古いシェーダーの名前を変更すると、その機能に影響する場合があります。Unity 5.0 以前では、シェーダーの機能の一部はそのパスと名前によって決定されました。古いシェーダーは現在もこの方法で動作します。詳しくは、古いシェーダーの名前を参照してください。

パフォーマンスの考慮点

ゲームの全体的なパフォーマンスに影響する要素は多数あります。このページはビルトインシェーダーに絞ってパフォーマンスの考慮事項を説明します。シェーダーのパフォーマンスは、主に 2 つの要素に依存します。シェーダー自体と、プロジェクトまたは特定のカメラによって使用されているレンダリングパスです。独自にシェーダーを作成する場合は、パフォーマンス改善のヒントを ShaderLab シェーダーパフォーマンスのページで参照できます。

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

Unity でサポートされているレンダリングパスのうち、特にパフォーマンスを予見しやすいのは Deferred Shading パスと Vertex 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 シェーダーはパフォーマンスコストが大きいですが、そのコストにより素晴らしい効果が得られます。代表的な名前だけ挙げても影、法線マッピング、見栄えの良いスペキュラーハイライトや ライトクッキーなどあります。

ライトは強制的に、ピクセル (“important”) あるいは頂点/SH (“not important”) のモードに切り替えることができる点に注意してください。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 つのディレクショナルライトしかサポートしないものがある、など。
レガシーの事前ビルドシェーダー
法線シェーダーファミリー