Version: 2019.4
言語: 日本語
ビルトインレンダーパイプラインのレンダリングパス
ディファードシェーディングレンダリングパス

フォワードレンダリングパス

このページでは、Unity のビルトインレンダーパイプラインのフォワードレンダリングパスについて説明します。

フォワードレンダリングは各オブジェクトを 1 つ、または複数のパスで描画します。パス数は、オブジェクトに作用するライトによって決まります。フォワードレンダリングによるライトの扱いも、ライトの設定と強度によって異なります。

実装の詳細

フォワードレンダリングでは、各オブジェクトに影響を与える最も明るいライトのいくつかが完全にピクセルごとのライティングモードでレンダリングされます。次に、頂点ごとに 4 つまでのポイントライトが計算されます。他のライトは球面調和関数 (SH) として計算されます。これははるかに高速ですが、近似にすぎません。ライトはピクセルごとのライトになるかどうかは、以下によって決まります。

  • Render Mode (レンダーモード) を Not Important (重要ではない) に設定したライトは常に頂点単位か、球面調和 として計算されます。
  • 最も明るいディレクショナルライトは常にピクセル単位に計算されます。
  • Render Mode を Important (重要) に設定したライトは常にピクセル単位に計算されます。
  • 上記を行った結果、現在の Quality Settings (品質設定) の Pixel Light Count (ピクセルライト数) よりライト数が減る場合は、さらにいくつかのライトが、明るさの順にピクセル単位でレンダリングされます。

各オブジェクトのライティングは以下のように行われます。

  • 1 つのピクセル単位のディレクショナルライトと、すべての頂点単位や球面調和によるライトにベースパスが適用されます。
  • 他のピクセル単位のライトは、加算パスでレンダリングされ、各ライトに 1 つのパスが使用されます。

例えば、複数のライトから影響を受けるオブジェクト (下の図の円の部分。ライト A から H のすべてから影響を受けます) について考えてみましょう。

ライト A から H が同じ色と強度を持ち、すべての Render Mode が Auto に設定されている(レンダリングモードが自動である) と仮定すると、このオブジェクトに関して、この順番のとおりにソートされます。まず、最も明るいライト (A から D) はピクセル単位のライティング (Per-pixel)、それから、4 つのライト (D から G) は頂点単位のライティング (Per-vertex)、最後に残りのライト (G から H) が球面調和によるライティング (SH) でレンダリングされます。

ライトのグループは重複していることに注意してください、例えば最後のピクセル単位のライトは頂点単位のライティングモードにブレンドするため、オブジェクトやライトが動き回る際に、急なライトの変化は少なくなります。

ベースパス

ベースパスでは、1つのピクセル単位のディレクショナルライトとすべての球面調和/頂点ライトでオブジェクトをレンダリングします。このパスにはさらに、シェーダーからのライトマップ、アンビエントライティング、エミッシブライティングすべてが追加されます。このパスでレンダリングされるディレクショナルライトには影があります。ライトマップを適用したオブジェクトは球面調和ライトから照明されないことに注意してください。

OnlyDirectional pass flag がシェーダーで使用されると、フォワードベースパスは、メインのディレクショナルライト、アンビエント/ライトプローブ、ライトマップだけをレンダリングします (球面調和と頂点ライトはパスデータに含まれません)。

加算パス

加算パスは、オブジェクトに影響する追加のピクセル単位ライトごとにレンダリングされます。 multi_compile_fwdadd_fullshadows バリアントショートカットを使用しない限り、これらのパスのライトにはデフォルトでは影がありません(その結果、フォワードレンダリングで影があるのは 1つのディレクショナルライトのみです)。

パフォーマンスの考慮点

球面調和ライトは 非常に 速くレンダリングされます。CPU のコストがごくわずかであり、GPU を適用する場合も 事実上コストなし です (つまり、ベースパスは常に球面調和ライティングを計算しますが、球面調和ライトの性質から、球面調和ライトの数にかかわらずコストはまったく同じです)。

球面調和ライトには以下のような欠点があります。

  • 球面調和ライトはオブジェクトのピクセルでなく、頂点で計算されます。つまり、ライトのクッキーや法線マップはサポートしません。
  • 球面調和ライトは非常に低周波です。そのため、急なライティングを変化させることができません。また、拡散ライティングにしか作用しません (スペキュラーハイライトには低周波すぎます)。
  • 球面調和ライティングは局所的ではありません。つまり、球面調和ライトで表面に近い、ポイントあるいはスポットライトを作成すると、見た目に違和感があります。

まとめると、球面調和ライトは小さい動的オブジェクトに適しています。

ビルトインレンダーパイプラインのレンダリングパス
ディファードシェーディングレンダリングパス
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961