Version: 2019.3
言語: 日本語
動的ライティング
エキスパートガイド

ベストプラクティス - ライティングパイプラインの設定

定義

最初に、このガイドで頻繁に登場するいくつかの重要なグラフィックスレンダリング用語の定義を見てみましょう。

  • レンダリングパイプライン は、シーンのオブジェクトの表示方法を 3 つの主要な段階で決定します。
    • 最初の段階は カリング です。レンダリングする必要のあるオブジェクトをリストします。できれば、カメラから見えるオブジェクト (錐台カリング) と他のオブジェクトで隠されていないオブジェクト (オクルージョンカリング) が望ましい。
    • 第 2 段階の レンダリング はこれらのオブジェクトを描画します。適切なライティングとプロパティの一部と共にピクセルベースのバッファに描画します。
    • 最後に ポストプロセス 操作をこのバッファで実行します。例えば、カラーグレーディング、ブルーム、被写界深度を適用して、ディスプレイデバイスに送信される最終的な出力フレームを生成します。これらの操作は、1 秒間に何度も繰り返されます (フレームレートに応じて回数が異なります)。
  • シェーダー はグラフィックス処理ユニット (GPU) で実行されるプログラムや一群のプログラムの総称です。例えば、カリング段階が完了した後、頂点シェーダーを使用して、可視オブジェクトの頂点座標を「オブジェクト空間」から「クリップ空間」と呼ばれ異なる空間に変換します。それから、GPU はこの新しい座標を使用して、シーンをラスタライズ、すなわち、シーンのベクトル表現を実際のピクセルに変換します。後の段階で、これらのピクセルはピクセルシェーダー (またはフラグメントシェーダー) で色付けされます。ピクセル色は、一般に、それぞれの表面のマテリアルの特性と周囲のライトに依存します。最近のハードウェア上で利用可能なもう 1 つのシェーダーは、コンピュートシェーダー です。これを利用すると、ライトカリング、パーティクル物理特性、体積シミュレーションなど、あらゆる種類の数学的演算に GPU の強力な並列処理能力を活用することができます。

  • 直接光 は、電球などの自発光型の光源から発生するライトを指し、ライトが表面から跳ね返ったものではありません。光源のサイズと受光側までの距離にもよりますが、このようなライトは通常、くっきりとしたシャドウを生成します。
    • 直接光と ディレクショナルライト を混同しないようにしてください。ディレクショナルライトは、無限に離れた光源 (例えば、コンピューターでシミュレートされた太陽) によって放出される光です。ディレクショナルライトの目立った特性は、シーン全体を平行な光線でカバーできることと、距離減衰 (または光減衰) がないことです。つまり、光源への距離が増加しても受ける光の量は減衰しません。
    • 実際には、太陽光は、他の光源と同様に、逆2乗法に基づいて距離とともに減衰します。簡単に言えば、受光側と光源との間の距離を増加すると、受光量は急速に低下します。例えば、水星での太陽の照度は地球上のほぼ 7 倍 で、木星では地球の約半分の太陽光で、冥王星ではわずか 0.06% の太陽光しか受けません。それにもかかわらず、高度範囲が非常に限られている大抵のリアルタイムアプリケーションでは、太陽光の減衰は重要ではありません。したがって、ディレクショナルライトは、巨大な惑星中心のオープンワールドなども含め、大抵の Unity シーンで太陽光をシミュレートするのにまったく問題ありません。ポイントやスポットのような他のタイプのライトの場合、Unity では最近、HD レンダーパイプライン (High-Definition Render Pipeline、HDRP) を選択すると、物理ベースのフォールオフを提供するようになりました。
  • 間接光 はライトが表面に反射し、大気や半透明なマテリアルなどの媒質を透過して散乱することによって発生します。このような条件下では、遮蔽物は一般的にぼんやりした、または識別できないシャドウを投影します。

  • グローバルイルミネーション (GI) は、主に直接光の関数としてシーンで間接光を生成するために使用されます。いくつかの GI の方法があり、ベイクの/動的なライトマップ、放射照度の量、光の伝搬量、ベイクの/動的なライトプローブ、ボクセルベースの GI、距離フィールドベースの GI などが含まれます。難しい設定なしで、Unity はベイクの/動的なライトマップとライトプローブをサポートします。
    • ライトマッパー は基本的なシステムで、光線を射影し、ライトバウンドを計算し、結果のライティングをテクスチャに適用することによって、ライトマップとライトプローブのデータを生成します。したがって、ライトマッパーが異なると、ライトのデータの生成に異なる技術を使用することがあるため、異なったライティングの外観を生成する場合があります。現在、Unity は 2 つのライトマッパー、Enlighten とProgressive Lightmapper (プログレッシブライトマッパー) を提供しています。GI システムとそのライトマッパーについての詳細は、この次のセクションで説明します。

概要

次のフローチャートは、コンテンツ作成者の視点で、Unity のすべてのライティングパイプライン全体を高レベルから見たものです。

まず、レンダリングパイプラインを選択します。次に、間接光をどのように生成するかを決定し、それに応じてグローバルイルミネーション (GI) システムを選択します。すべてのグローバルライティング設定がプロジェクトに適切に調整されていることを確認した後、ライトエミッシブサーフェスリフレクションプローブライトプローブLight Probe Proxy Volume (LPPV) を加えます。これらすべてのライティングオブジェクトの使用法や機能の詳細はこのページのスコープを超えています。ですから、マニュアルのライティングのセクションを読んで、プロジェクトで正しく活用する方法を学ぶことをお勧めします。

レンダリングパイプライン

2018 年の初めまで、Unityには 1 つのレンダリングパイプラインしかありませんでした。これは Built-In Render Pipeline (ビルトインレンダリングパイプライン) と名前が変更されました。このレンダラーでは、フォワード (Forward) レンダリングとディファード (Deferred) レンダリングの選択ができます。

  • (マルチパス) フォワードモードでは、シーン内のすべてのオブジェクトが、各オブジェクトに影響を与えるライトの数に応じて、場合によっては複数のパスで、1 つずつ順次にレンダリングされるため、そのレンダリングコストは、オブジェクトが複数のライトによって照らされると著しく増加します。このタイプのレンダラーは一般的に、さまざまなシェーダーを提供し、簡単に透明度を処理できます。
  • ディファードモードでは、すべての (不透明な) ジオメトリが最初にバッファにレンダリングされ、バッファはマテリアルに関する情報 (カラー、スペキュラー、スムースネスなど) に関する情報を格納します。後のパス (つまり、ディファード) では、各ピクセルは順にシェーディングされます。レンダリング時間は主に各ピクセルに影響を与えるライトの数に依存します。透明なオブジェクトと複雑なシェーダーを持つ特定のオブジェクトは、追加のフォワードレンダリングパスを必要とします。ディファードレンダリングは通常、人工的に照らされたインテリアや屋外と屋内のライティングを組み合わせたプロジェクトなど、多くの動的ライトを含むシーンを扱う場合に推奨されます。

2018 年 1 月に、スクリプタブルレンダーパイプライン (Scriptable Render Pipeline、SRP) を発表しました。これを利用すると、C# スクリプティングを使用してレンダリングループをカスタマイズすることができます。実際、これはゲームエンジンの分野での小さな革命です。ユーザーはついに、C++ のような低レベルのプログラミング言語を使用せずに、オブジェクトのカリング、描画、フレームのポストプロセスをパーソナライズすることができるようになりました。

現在 Unity は、最近多く使用されるハードウェアのためにパフォーマンスを念頭に置いて設計された 2 つのプレビュー SRP を提供しています。

  • HD レンダーパイプライン (High Definition Render Pipeline, HDRP) は、ハイブリッドのディファード/フォワードで、タイル/クラスターのレンダラーです。高度なレンダリングとシェーディング機能を提供し、高度な視覚的忠実性が求められる PC やコンソールのプロジェクト向けに設計されています。

タイルはフレームの小さな 2 次元の正方形のピクセル範囲であり、クラスターはカメラの錐台内部の 3 次元ボリュームです。タイルとクラスターのレンダリング技術は両方とも、個々のタイルとクラスターに影響を与えるすべてのライトのリストに依存しています。タイルやクラスターのライティングは、それから、既知のライトの対応リストを使って 1 回のパスで計算されます。不透明なオブジェクトはタイルシステムを使用してシェーディングされることが最も一般的ですが、透明なオブジェクトはクラスターシステムを利用します。このレンダラーが提供する主な利点は、ビルトインレンダリングパイプライン (ディファード) と比較して、ライティングの処理が高速で、帯域幅消費が大幅に削減されることです。ビルトインレンダリングパイプラインは、ずっと時間のかかるマルチパスのライト集積を利用しています。

  • The Universal Render Pipeline (URP) is a fast single-pass forward renderer; it has been designed for devices with lower real-time lighting requirements in mind, such as smartphones, tablets and XR devices. The lights are culled per-object and allow for the lighting to be computed in one single pass, which results in reduced draw calls compared to the Built-In Render Pipeline.

下のフローチャートを使用すると、いくつかの重要な基準に基づいてどのレンダリングパイプラインを選択すべきかがすぐにわかります。

テンプレート

You can download the latest versions of the HDRP and URP via the Unity Package Manager (Window > Package Manager). The easiest way to get started with one of these SRPs is to create a new project with the Unity Hub and use one of the corresponding templates.

手動での設定

If you want to set up your project for the HDRP or URP by hand, ensure you have the required package installed. Then create a new asset in your Project window via Create > Rendering > High Definition Render Pipeline Asset. Drag this asset into the Graphics settings. In case you selected the HDRP, ensure the linear color space is selected in the Player settings for your platform and add a Rendering > Scene Settings object into your scene.

Graphics の Project Settings ウィンドウでパイプラインアセットが割り当てられていない場合、Unity はデフォルトのビルトインレンダリングパイプラインを使用します。

拡張性

If you have some rendering knowledge and are familiar with C#, experimenting with the SRP concept to create your own Custom Scriptable Render Pipeline is definitely recommended if you need to fully tailor the renderer for your project. The URP is especially easy to extend, due to its smaller shader library and the ability to inject, remove and swap rendering passes easily.

互換性

Porting your project’s materials from the Built-In Render Pipeline to the HDRP or to the URP is relatively easy in Unity, thanks to a 1-click material converter under Edit > Render Pipeline > Upgrade…; be aware, however, that it is a non-reversible action. Backing up your project beforehand is highly recommended!

Nevertheless, custom shaders will have to be ported by hand, so transitioning from the Built-In Render Pipeline to the HDRP or URP during production might be time-consuming, depending on the number of custom shaders you would have to rewrite.

さらに、HDRP はビルトインレンダリングパイプラインよりも物理的に正確であるため (特に光の減衰と分布に関しては)、HDRP に切り替えた後にプロジェクトが同じように見えると期待すべきではありません。

Furthermore, the HDRP and the URP are not cross-compatible, as they do not share the same rendering features. Porting your project from HDRP to URP and vice versa is possible, but it is not a 1-click operation and will require manual rework of the lighting, the materials and the shaders!

Finally, the HDRP and the URP are still in preview and Unity is hard at work ensuring they will be production-ready very soon. Please be aware that not all features have been implemented yet for both pipelines. For instance, certain lighting modes that I detail below are not yet fully available for the URP, and XR is not yet properly supported by the HDRP.

グローバルイルミネーションシステム

Unityでは 2 つのグローバルイルミネーション (GI) システムが利用可能です。これらはWindow > Rendering > Lighting Settings で有効にすることができます。

  1. (Precomputed) Realtime Global Illumination: This system entirely relies on Enlighten, a third-party lighting middleware. During the precomputation in Unity, Enlighten goes through two lengthy stages, among others: Clustering and Light Transport. The first one consists in simplifying the scene into a collection of surface patches called clusters, and the second, in calculating the visibility between these clusters. This precomputed data is used at runtime to generate the indirect lighting interactively. The strength of Enlighten relies on the ability to edit the lighting in realtime, as the precomputed data relies on the relation between clusters. However, like in other traditional lightmapping techniques, editing the static geometries in your scene will trigger a new precomputation.

  2. Baked Global Illumination (ベイクした GI): ライトは、ライトマップと呼ばれるテクスチャとライトプローブにベイクされます。ベイクされた GIシステムでは、以下のライトマッパーの 1 つを使用します。  

    1. プログレッシブライトマッパー
    2. Enlighten

プログレッシブライトマッパーは、シーン全体のすべてのベイク時間を増加させる代わりに、カメラから見えるオブジェクトのライティング計算を優先し、ライティングのイテレーションを大幅に高速化します。プログレッシブライトマッパーは CPU を使用してパストレースで間接光を計算します。新しい GPU プログレッシブライトマッパー は現在開発中で、シーンのベイク時間を著しく短縮します。

Enlighten とプログレッシブライトマッパーはどちらもベイクしたライトを作成するために異なる方法を使用しているため、結果のライトを比較すると正確に同じとは限りません。

下の図を見て、どのような GI システムがプロジェクトに適しているか、またその主な長所と短所を判断してください。

静的 vs 動的

No matter which Global Illumination system you use, Unity will only consider objects that are marked as “Contribute GI” during the baking/precomputing of the lighting. Dynamic (i.e. non-static) objects have to rely on the Light Probes you placed throughout the scene to receive indirect lighting.

Because the baking/precomputing of the lighting is a relatively slow process, only large and complex assets with distinct lighting variations, such as concavity and self-shadowing, should be tagged as “Contribute GI”. Smaller and convex meshes that receive homogeneous lighting should not be marked as static, and they should therefore receive indirect lighting from the Light Probes which store a simpler approximation of the lighting. Larger dynamic objects can rely on LPPVs, in order to receive better localized indirect lighting. Limiting the number of objects tagged as “Contribute GI” in your scene is absolutely crucial to minimize baking times while maintaining an adequate lighting quality. You can learn more about this optimization process and the importance of Probe lighting in this tutorial.

注意

Unity ではベイクされた GI システムとリアルタイム GI システムの両方を同時にアクティブにすることができ、これによりすべてのライティング機能にアクセス可能です。ただし、両方のシステムを有効にすると、同じデータセットに依存しないため、ランタイム時のベイク時間とメモリ使用量が大幅に増加することに注意する必要があります。さらに、ランタイムに間接光をインタラクティブに更新すると、CPU に負担がかかります。また、ベイクとリアルタイム GI システムが作成する間接光を視覚的に比較すると、両システムは間接光をシミュレートするのに異なるテクニックを使用し、しばしば著しく異なる解像度で操作することがあるため、矛盾が生じる場合があります。

両方の GI システムを使用することは、ハイエンドプラットフォームや、コストが予測可能でシーンを厳密に制御できるプロジェクトに制限する必要があります。このアプローチは、両方のシステムの管理は著しく複雑さを増すため、すべてのライティング設定を深く理解している熟練ユーザーのみに適しています。結果的に、2 つの GI システムのうちの 1 つを使用することが、通常、ほとんどのプロジェクトにとってより安全な方法と言えます。両方のシステムを使用することは、ほとんどの場合、推奨されません。

ライトモード

ライトのモードは、よくある混乱の原因となります。最も重要なことは、ライトのモードは Baked Global Illumination が有効になっている場合にのみ関係があります。

Light インスペクターには 3 つのモードがあります。

  1. Baked: ライトからの直接光と間接光をライトマップにベイクします。これは時間のかかる処理になります。これらのライトを処理するためのランタイムのコストはありませんが、シーンに結果のライトマップを適用するのにわずかなコストがかかります。
  2. Realtime: ライトからの直接光とシャドウはリアルタイムなので、ライトマップにベイクされません。ランタイムコストは、シーンの複雑さ、投影するライトの数、重なるライトの数などによって高くなる可能性があります。さらに、リアルタイム GI を有効にすると、ランタイムに間接ライトを更新するためにさらにパフォーマンスの低下が発生します。
  3. Mixed: ベイクした間接光やリアルタイムの直接光など、ベイクした機能とリアルタイムの機能を混在させたハイブリッドモードです。シーンのすべての混合ライトの動作とパフォーマンスの影響は、選択するグローバルの Mixed ライティングモードに依存します。それについて、次のセクションで説明します。

GI システムを使用しない場合や、Realtime GI システムのみを使用する場合は、Baked と Mixed のライトはすべて Realtime にオーバーライドされます。

以下の図は、フローチャートと比較表を組み合わせたものです。新しいライトがシーンに追加されるたびに適切なライトモードを決定するのに役立ちます。

Mixed ライティングモード

上の図で分かるように、Mixed ライトは Rendering > Lighting Settings ウィンドウで選択したグローバルの Mixed Lighting モードに応じて、特定のベイクとリアルタイムの機能を持っています。

4 つのモードから選択できます。

  1. Subtractive
  2. Baked Indirect
  3. Shadowmask Mode: Shadowmask
  4. Shadowmask Mode: Distance Shadowmask

Shadowmask Mode と Shadow Distance は Edit > Project Settings > Quality で調整できます。HDRP を使用する場合、Graphics 設定で割り当てた HDRenderPipelineAsset で Shadowmask モードが有効になります。シャドウの Max Distance は Scene Settings オブジェクトで設定できます。

HDRP は新しいハイブリッドシャドウマスクモードをサポートしています。追加設定の Non Lightmapped Only チェックボックスでリアルタイムシャドウを投影するかどうかを制御できます。このパラメーターを使用すると、カメラがライトの Fade Distance 内にある場合はライトがリアルタイムの動的なシャドウを投影します。そうでない場合は、ベイクしたシャドウマスクに戻ります。 HDRP のこの新しいモードの主な利点は、リアルタイムのシャドウの代わりに、メインのディレクショナルライトに使用される Shadow Distance 内の特定のライトにベイクしたシャドウマスクを使用できることです。

パイプライン比較表

The URP and HDRP are still in preview, which means that on the one hand they bring exciting new features to the table, but on the other hand, they might not support certain functions offered by the Built-In Pipeline yet, or drop support for others. The following table gives you an overview of the current state of the lighting pipeline for Unity 2018.3.

ライティングシナリオ

レンダリングパイプラインと主なライティング機能を説明したので、いくつかのプロジェクトの例で、どの設定をライトに使用するかを見てみましょう。すべてのプロジェクトはそれぞれ独特であるため、要件に応じて若干異なるオプションを使用する場合があります。

1. プロトタイプまたは素早い事前可視化

If you heavily rely on the Asset Store to build your prototype, the Built-In Render Pipeline could be the only suitable render pipeline, as most assets found on the Store are not fully compatible with the HDRP and URP; nonetheless, asset compatibility will improve over time. If you are building all the assets from the ground up and already have a clear idea of your project’s requirements, then you could pick one of the two SRPs (i.e. URP or HDRP) or create a custom one.

製作作業やプリプロダクションの初期段階で、ライティングの迅速な転換や最大級の柔軟性が必要な場合は、事前計算を必要としない完全なリアルタイムの方法が便利な場合があります。そのため、ベイクされた GI とリアルタイム GI の両方をオフにします。適切な間接光の不足を緩和するために、Post Processing Stack V2 の Screen Space Ambient Occlusion (スクリーンスペースアンビエントオクルージョン) を有効にします。スクリーンスペースアンビエントオクルージョンは、コストが低いリアルタイムのコンタクトシャドウで、シーン内のオブジェクトの接地感を出すのに役立ちます。

2. 3D モバイル戦略ゲーム

If you are targeting mobile devices, the URP could be a great candidate to ensure solid performance for your strategy game. If the rendering pipeline needs to be customized to better suit your game, a graphics programmer will probably find extending the URP straightforward.

If you pick the URP and use Baked Global Illumination, be aware that at the moment, only the Subtractive Lighting Mode is available for the Mixed lights. Support for Baked Indirect and Shadowmask will be added in a later release.

また、Asset Stoere から多くのアセットを使用するなど、古いビルトインレンダリングパイプラインを引き続き使用する場合は、すべてのグローバルの Mixed ライティングモードがサポートされます。この場合、Shadowmask ライティングモードを使用するとベイクしたシャドウが提供され、動的オブジェクトがリアルタイムのシャドウを投影することが可能です。プロジェクトでシャドウマスクのコストが高すぎる場合は、最もコストの低い Subtractive モードに戻すことができます。最後に、フォワードレンダリングパスは、おそらく、レベルに少数のライトしかない場合や、古いハードウェアをターゲットにしている場合に最適な選択です。

3. 優良画質の迷路のシューティングゲーム (1 日の固定された時刻)

リニアの 1 人称シューティングゲームで PC やコンソール用に優良画質のビジュアルを目指す場合は、HDRP をレンダリングパイプラインに使用すべきです。また、グラフィックスプログラマーの助けを借りて、カスタムの SRP を開発することもできます。

レベルに多くのリアルタイムのシャドウを投影するライト (例えば、破壊可能なライトの小道具や動くライト) がある場合、Baked GI システムを Baked Indirect モードで使用すると、静的ライトプロパティの混合ディレクショナルライトとベイクしたライトからの間接光がきれいに見えるようになります。レベルに高い割合で固定された投影ライトのプロパティが含まれる場合は、シャドウマスクを使用する方法がお勧めです。なぜなら、HDRP は素晴らしいハイブリッドの Shadowmask モードを提供して、リアルタイムシャドウとベイクシャドウのブレンドをより細かく制御できるからです。

このタイプのリニアゲームは一般に、パフォーマンスとメモリ消費の観点から非常に予測可能であるため、ベイクした GI とリアルタイムの GI システムの両方を同時にアクティベーションできます。ただし、GI のセクション で説明しているように、両方のシステムを同時に使用すると、パフォーマンスコストとベイクにかかる時間が大幅に増加します。すべての技術に精通している専門的知識のあるユーザーのみが使用してください。

4. バトルロイヤル (昼夜のサイクル)

If you plan to release a battle royale game for PC and consoles, that features large-scale environments and fully dynamic lighting, you should select the HDRP, or extend it to tailor the rendering pipeline to your project. You could consider the URP if you are not aiming for AAA visual fidelity and are targeting mobile devices or systems with lower specifications.

昼夜のサイクルに対応するために、HDRP を選択した場合、Realtime GI システムをアクティブにして、1 日の間の任意の時間の間接光をシミュレートする必要があります。特定の密集した状態で光を受ける内部でパフォーマンスを最大限に上げるには、Realtime GI システムが特定のライトを無視してレンダリングコストがかからないようにするように、特定のライトの Indirect Multiplier を 0 に設定します。

The URP does not support the Realtime Global Illumination system: the day-night cycle would have to be handled with a custom script that would, for instance, modulate the sun and ambient color throughout the day.

この特定のシナリオでは、Realtime GI とBaked GIシステムの両方をアクティブにすることはお勧めできません。なぜなら、パフォーマンスとシーン管理に重大なレベルの多大なオーバーヘッドが発生するからです。GI システムを両方使用することに対するもうひとつの議論は、このような大規模なマルチプレイヤーゲームの予測不可能な性質です。例えば、パフォーマンスの見積もりは、スクリプティングを多く使用したシングルプレイヤーの冒険よりもさらに困難です。   

最後に

スクリプタブルレンダーパイプラインが導入されたことで、Unity のレンダリング環境は著しく変化しました。したがって、ライティングパイプラインのためのこれらのすべての変更とそれらの影響に追いつくことは、大変な作業です。

このガイドと多くの図が各レンダリングパイプライン の機能をよりよく理解する助けとなり、みなさんが Unity のプロジェクトを確実に適切な設定で自信をもってライティングできるよう願っています。

Unity のライティングとレンダリングパイプラインの詳細については、以下の記事を参照してください。


  • 2018–08–17 公開ページ
動的ライティング
エキスパートガイド