Version: 2017.1
Forward Rendering パスの詳細
Vertex Lit レンダリングパス詳細

旧 Deferred Lighting レンダリングパス

このページでは *旧 Deferred Lighting * の Rendering Path の詳細を説明します。Deferred Lighting の技術的な概要については この記事 を参照してください。

注意 : Deferred Lighting は(スタンダードシェーダー、リフレクションプローブなど)いくつかのレンダリングの特色をサポートしていないため、Unity 5.0 で開始するには時代遅れな特色だと見なされてます。新しいプロジェクトでは代わりに Deferred Shading レンダリングパスの使用を考慮するべきです。

注意: 垂直投影を使用している場合は、Deferred レンダリングはサポートされません。カメラの投影モードが垂直投影に設定されている場合は、カメラは常に Forward レンダリングを使用します。

概要

Deferred Lighting レンダリングパスはオブジェクトに影響を与えるライトの数に制限はなく、すべてのライトはピクセルごとに評価され、すなわち法線マップやその他と正しく連動することを意味します。さらに、すべてのライトに Light Cookie やシャドウ(影)をつけることができます。

Deferred Lighting の長所としてライティングの処理オーバーヘッドは、たとえいくつものオブジェクトを照らそうと、画面に映されたライトの大きさに比例します。したがって、ライトを小さく抑えることによりパフォーマンスを改善することができます。Deferred Lighting は抜群に安定していて予測可能な動作をします。各ライトはピクセルごとに計算されるため、三角形が大きすぎることにより計算が破綻する、などいったこともありません。

逆に短所としては、Deferred Lighting はアンチエイリアスをサポートせず、部分的に透過のオブジェクトをハンドリングできません(これらは Forward Rendering でレンダリングする必要があります)。さらにメッシュレンダラーの Receive Shadows フラグはサポートされず、カリングマスクのサポートも限定的です。(具体的には、カリングマスクは最大 4 つまでしか使用できません。すなわち、カリングレイヤーマスクは少なくともすべてのレイヤーから 4 つの任意レイヤーを引いた数を含む必要があるため 32 レイヤーのうち 28 はセットする必要があります。そうしない場合はグラフィックに画像の乱れが生じます。)

要件

デプス レンダーテクスチャと 2 面ステンシル バッファをサポートした、シェーダーモデル3.0(もしくはそれ以降)のグラフィックスカードが必要です。 GeForce FX 以降のものや、Radeon X1300 以降のものなど、2004年以降に製造された多くの PC 用グラフィックスカードは Deferred Lighting をサポートしています。 Intel 965 / GMA X3100 およびそれ以降のモバイルに関しては、すべての OpenGL ES 3.0 対応 GPU は、Deferred lighting をサポートします。 いくつかの OpenGL ES 2.0 対応のモバイルも defferred lighting をサポートしています(depth texture をサポートしているモバイル)。

パフォーマンス考慮点

Deferred Lighting のリアルタイムのライトのレンダリングオーバーヘッドはライトにより照らされるピクセルの数に比例し、シーンの複雑さには依存 しません 。このため小さなポイントやスポットライトはレンダリングが安価であり、さらに完全か一部オクルージョンされる場合はさらに安価になります。

もちろん、よりシャドウ(影)のないライトがシャドウ(影)のあるライトに比べて高価であることは当然です。Deferred Lighting では、影を投影するオブジェクトは、各々の影を投影するライトごとに一回以上レンダリングされる必要があります。さらにはシェーダーが影を適用するライティングは、影を無効化した場合と比べレンダリングオーバーヘッドが大きくなります。

実装に関する詳細

Deferred Lighting が使用されるとき、Unity でのレンダリングプロセスは 3 つのパスで行われます:

  1. Base Pass: オブジェクトはデプス、法線、鏡面の力によりスクリーンスペースのバッファを生成します。
  2. Lighting Pass:先に生成されたバッファを使用して別のスクリーン座標系のバッファを計算します。
  3. Final Pass:オブジェクトは再度レンダリングされます。計算されたライティングをフェッチし、カラーテクスチャと合成して、環境/発光ライティングを追加します。

Deferred Lighting をハンドリングできないシェーダーのあるオブジェクトは、このプロセスが完了した後に、Forward Rendering パスでレンダリングされます。

Base Pass

Base Pass では各オブジェクトを一回づつレンダリングします。ビュー空間の法線および反射の強さは一つの ARGB32 レンダーテクスチャ にレンダリングされます(法線を RGB チャネル、反射の強さはアルファチャネル)。もしプラットフォームとハードウェアにより、Z バッファのテクスチャ読み込みに対応している場合、デプスは明示的にレンダリングされません。もし Z バッファがテクスチャとしてアクセスできない場合、デプスは Shader Replacement を使って別のレンダリングパスでレンダリングされます。

Base Pass の結果はシーンのコンテンツが詰まった Z バッファと、法線マップ・反射の強さを含む Render Texture となります。

Lighting Pass

Lighting Pass はデプス、法線マップ、反射の強さにもとづいてライティングを計算します。ライティングはスクリーン空間で計算されるため、処理にかかる時間はシーンの複雑さと独立しています。ライティングバッファはひとつの ARGB32 Render Texture で、拡散ライティングを RGB チャネル、モノクロの鏡面ライティングをアルファチャネルに含みます。ライティングの値は対数的にエンコードされ、ARGB32 テクスチャで通常可能であるレンジより範囲が広いダイナミックレンジを提供します。カメラで HDR レンダリングが有効のときには、ライティングバッファは ARGBHalf フォーマットで、対数符号化は行われません。

カメラの NearPlane を横切らないポイントライトとスポットライトは、有効になっているシーンに対して深度テストをして 3D シェイプ(の前面)として描画されます。NearPlane を横切るライトは 3D シェイプも使用して描画されますが、代わりに逆深度テストをして背面として描画されます。これにより、一部またはすべてふさがれたライトでの描画がとても安っぽくなります。ライトがカメラの FarPlane と NearPlane の両方を同時に横切ってしまった場合、上記の最適化を使用することはできず、ライトは深度テストをしないきつい四角形として描画されます。

以上のものはディレクショナルライトには適用されず、常に画面一杯に広がる四角形として描画されます。

ライトの影が有効化されている場合、それらもレンダリングされパスに適用されます。影は“タダ”でないことに注意してください、shadow caster(影の投影)もレンダリングする必要があり、より複雑なライトシェーダーも適用する必要があります。

唯一利用可能なライティングモデルは Blinn-Phong です。別のモデルを使用したい場合はライティングパスシェーダーを自ら修正することが可能で、Built-in Shader から取得した Internal-PrePassLighting.shader ファイルの修正バージョンを “Assets” フォルダー配下の “Resources” フォルダーに格納します。そして、Edit->Project Settings->Graphics のメニューから Graphics ウィンドウを開き、“Legacy Deferred” のドロップダウン リストから “Custom Shader” を選択します。表示されたフィールドに使用するシェーダーを格納することで変更作業は完了になります。

Final Pass

Final Pass は最終レンダリングイメージを生成します。次に再度ライティングをフェッチするシェーダーによりすべてのオブジェクトはレンダリングされ、テクスチャと合成し、発光ライティングを追加します。ライトマップも Final Pass で適用されます。カメラの近くで、リアルタイムライティングは使用され、焼き込みされた Indirect Lighting (間接ライティング)のみが加えられます。これはカメラより離れた場所にある完全に焼き込みされたライティングとクロスフェードします。

Forward Rendering パスの詳細
Vertex Lit レンダリングパス詳細