このページでは Deferred Lighting の Rendering Path の詳細を説明します。Deferred Lightingの技術的な概要については この記事 を参照下さい。
Deferred Lighting レンダリングパスはもっとも光と影を忠実に再現します。オブジェクトに影響を与えるライトの数に制限はなく,全てのライトはピクセルごとに評価され,すなわち法線マップやその他と正しく連動することを意味します。さらに,全てのライトにLight Cookieやシャドウ(影)をつけることが出来ます。
Deferred Lightingの長所としてライティングの処理オーバーヘッドは,たとえいくつものオブジェクトを照らそうと,画面に映されたライトの大きさに比例します。したがって,ライトを小さく抑えることによりパフォーマンスを改善することが出来ます。Deferred Lightingは抜群に安定していて予測可能な動作をします。各ライトはピクセルごとに計算されるため,三角形が大きすぎることにより計算が破綻する,などいったこともありません。
逆に短所としては,Deferred Lightingはアンチエイリアスをサポートせず,部分的に透過のオブジェクトをハンドリングできません(これらはForward Renderingでレンダリングする必要があります)。さらにメッシュレンダラのReceive Shadowsフラグはサポートされず,カリングマスクのサポートも限定的です。 (具体的には,カリングマスクは最大 4 つまでしか使用できません。すなわち,カリング レイヤーマスクは少なくとも全てのレイヤーから 4 つの任意レイヤーを引いた数を含む必要があるため 32 レイヤーのうち 28 はセットする必要があります。そうしない場合はグラフィックに画像の乱れが生じます。)
Deferred Lightingは__Unity Pro__でのみ利用可能です。シェーダモデル3.0(またはそれ以降)に対応し,デプス レンダーテクスチャおよびステンシルバッファをサポートするグラフィックスカードが必要です。2004年以降に製造されたグラフィックスカードであれば,Deferred Lightingをサポートし,GeForce FXとそれ以降, Radeon X1300とそれ以降,Intel 965 / GMA X3100とそれ以降が含まれます。しかしモバイルプラットフォームやFlashでは現在利用できません。
Deferred Lightingのリアルタイムのライトのレンダリングオーバーヘッドはライトにより照らされるピクセルの数に比例し,シーンの複雑さには依存_しません_。このため小さなポイントやスポットライトはレンダリングが安価であり,さらに完全か一部オクルージョンされる場合はさらに安価になります。
もちろん,よりシャドウ(影)のないライトがシャドウ(影)のあるライトに比べて高価であることは当然です。Deferred Lightingでは,影を投影するオブジェクトは,各々の影を投影するライトごとに一回以上レンダリングされる必要があります。さらにはシェーダが影を適用するライティングは,影を無効化した場合と比べレンダリング オーバーヘッドが大きくなります。
Deferred Lightingが使用されるとき,Unityでのレンダリングプロセスは3つのパスで行われます:
Deferred Lightingをハンドリングできないシェーダのあるオブジェクトは,このプロセスが完了した後に, forward rendering パスでレンダリングされます。
Base Passでは各オブジェクトを一回づつレンダリングします。ビュー空間の法線および反射の強さは一つのARGB32 Render Texture にレンダリングされます(法線をRGBチャネル,反射の強さはアルファチャネル)。 もしプラットフォームとハードウェアにより,Zバッファのテクスチャ読み込みに対応している場合,デプスは明示的にレンダリングされません。もしZバッファがテクスチャとしてアクセスできない場合,デプスは Shader Replacement を使って別のレンダリングパスでレンダリングされます。
Base Passの結果はシーンのコンテンツが詰まったZバッファと,法線マップ・反射の強さを含むRender Textureとなります。
Lighting Passはデプス,法線マップ,反射の強さにもとづいてライティングを計算します。ライティングはスクリーン空間で計算されるため,処理にかかる時間はシーンの複雑さと独立しています。ライティングバッファはひとつのARGB32 Render Textureで,拡散ライティングをRGBチャネル,モノクロの鏡面ライティングをアルファチャネルに含みます。ライティングの値は対数的にエンコードされ,ARGB32テクスチャで通常可能であるレンジより範囲が広いダイナミックレンジを提供します。Defferedレンダリングで唯一利用可能であるライティングモデルはBlinn-Phongです。
カメラのニアクリップに交差しないポイントライトやスポットライトは3D図形としてレンダリングされ,シーンに対するZバッファテストが有効化されます。これにより一部あるいは全体がオクルージョンされたポイントライトやスポットライトはレンダリングが非常に安価です。ニアクリッププレーンを交差しないDirectional Light(指向性ライト)およびポイントライト・スポットライトはフルスクリーンの四角形としてレンダリングされます。
ライトの影が有効化されている場合,それらもレンダリングされパスに適用されます。影は“タダ”でないことに留意して下さい,shadow caster(影の投影)もレンダリングする必要があり,より複雑なライトシェーダも適用する必要があります。
唯一利用可能なライティングモデルはBlinn-Phongです。別のモデルを使用したい場合はライティングパス シェーダを自ら修正することが可能で, Built-in Shader からInternal-PrePassLighting.shaderファイルの修正バージョンを “Assets” フォルダ配下の “Resources” フォルダに格納します。
Final Passは最終レンダリングイメージを生成します。次に再度ライティングをフェッチするシェーダにより全てのオブジェクトはレンダリングされ,テクスチャと合成し,発光ライティングを追加します。ライトマップもFinal Passで適用されます。カメラの近くで,リアルタイムライティングは使用され,焼き込みされたIndirect Lighting(間接ライティング)のみが加えられます。これはカメラより離れた場所にある完全に焼き込みされたライティングとクロスフェードします。