このページでは、Unity のビルトインレンダーパイプラインのフォワードレンダリングパスについて説明します。
フォワードレンダリングは各オブジェクトを 1 つ、または複数のパスで描画します。パス数は、オブジェクトに作用するライトによって決まります。フォワードレンダリングによるライトの扱いも、ライトの設定と強度によって異なります。
フォワードレンダリングでは、各オブジェクトに影響を与える最も明るいライトのいくつかが完全にピクセルごとのライティングモードでレンダリングされます。次に、頂点ごとに 4 つまでのポイントライトが計算されます。他のライトは球面調和関数 (SH) として計算されます。これははるかに高速ですが、近似にすぎません。ライトはピクセルごとのライトになるかどうかは、以下によって決まります。
各オブジェクトのライティングは以下のように行われます。
例えば、複数のライトから影響を受けるオブジェクト (下の図の円の部分。ライト 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 を適用する場合も 事実上コストなし です (つまり、ベースパスは常に球面調和ライティングを計算しますが、球面調和ライトの性質から、球面調和ライトの数にかかわらずコストはまったく同じです)。
球面調和ライトには以下のような欠点があります。
まとめると、球面調和ライトは小さい動的オブジェクトにはだいたい十分です。