Rendering paths in the Built-in Render Pipeline
Deferred Shading rendering path

Forward rendering path

This page describes the Forward rendering path in Unity’s Built-in Render Pipeline.

Forward rendering renders each object in one or more passes, depending on lights that affect the object. Lights themselves are also treated differently by Forward Rendering, depending on their settings and intensity.

実装の詳細

In Forward rendering, some number of brightest lights that affect each object are rendered in fully per-pixel lit mode. Then, up to 4 point lights are calculated per-vertex. The other lights are computed as Spherical Harmonics (SH), which is much faster but is only an approximation. Whether a light will be a per-pixel light or not is dependent on this:

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

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

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

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

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

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

ベースパス

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

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

加算パス

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

パフォーマンスの考慮点

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

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

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

まとめると、球面調和ライトは小さい動的オブジェクトにはだいたい十分です。

Rendering paths in the Built-in Render Pipeline
Deferred Shading rendering path