ライティングと設定

確認済のバージョン: 2017.3

-

難易度: 中級

ここまでの時点で、メッシュに適切なテクスチャが施され、シーンが組み立てられ、適切なトーンマッピングが施されてレンダー設定が整いました。しかし、シーンの見た目を良くするためには、ライティングも適切に設定される必要があります。ここでは、リアルタイム GI を用いたセットアップを使用し、即座にフィードバックを得るためにリアルタイムライトによるライティングを行っている前提で話を進めて行きます(ベイキングに対しても同様の原則を適用しています。)

屋外のライティングとシーンの設定

  • 半球ライティング 屋外ライティングの最初のコンポーネントは、半球ライティングです。これは Unity では Environment Lighting と呼ばれ、簡単に言うと空の光のことです。夜空が寄与する光は最小となり、日中の空が寄与する光は極めて明るくなります。半球の設定は Lighting タブ内(Window > Lighting > Settings > Environment)で行えます。 最初は、HDRI キューブマップではなくプロシージャルスカイボックスマテリアルから開始するのが賢明です。プロジェクト内で新規マテリアルを作成し、それを SkyMaterial と名付けて、Skybox/Procedural に設定してください。

これを、Lighting タブ > Scene 内にある Environment の Skybox Material にアサインしてください。

シーンにいくらかライティングが施されました。環境光として全体的に照らされていますが、あまり正確な半球ライティングとは言えません。しかし現時点ではこのままにしておきます。

  • ディレクショナルライト 一般的な太陽光や月光は、ライトとシャドウの方向が平行で、ほぼ無限遠の距離にある光源を模倣するものであるため、通常はディレクショナルライトで表現されます。

  • グローバルイルミネーション ディレクショナルライトと環境光だけでは、現実のようなライティングは作れません。しっかりした半球ライティングには、空の光のライティングのオクルージョンが必要で、太陽光に関しても間接的なライティングの反射が必要となります。この時点では、空はシーン全体にひとつの色値でレンダリングしているため、均一的な印象になってしまっています。ここで必要となるのが、オクルージョンや間接反射光ライティングの計算を行うリアルタイムグローバルイルミネーションやベイクしたライティングです。これを行うには、下記の手順に従ってください。

    • リアルタイム GI やベイキングに寄与する必要のあるメッシュ全てに、必ず Enable Lightmap Static および Reflection Probe Static のフラグを追加するようにしてください(一般的には、大きな静的メッシュがこれに当たります)。

    • 次に、Lighting タブ > Scene > Realtime Lighting で Realtime Global Illumination を有効にしてください(デフォルトの「Medium」の設定のままにしてください)。 「Generate Lighting」を押すか、「Auto Generate」にチェックマークを入れてください。

ライトの生成が完了すると、シーンが暗くなってしまいました。それだけでなく、シーン内の一部の要素が周囲から不自然に浮いた印象になっています(路面電車と背景の扉に注目してください)。この時点では、シーン内の静的オブジェクトには、半球に対する適切なオクルージョンと、ディレクショナルライトからの間接反射反応がある状態です。しかし、それ以外のオブジェクトには適切なライティング設定がされていません。

  • ライトプローブとリフレクションプローブ 動的オブジェクトや非ライトマップオブジェクトが、リアルタイムあるいはベイク済のグローバルイルミネーションを受けるためには、シーン内にライトプローブを配置する必要があります。動的にライティングされるオブジェクト(プレイヤーなど)が配置された(または通過する)領域の近くに、効率的にライトプローブグループを分布させてください。 ライトプローブグループに関する詳細は、こちらでご確認いただけます。

「Generate Lighting」を再度押してください。または、「Auti Generate」にチェックマークが入っている場合は、事前計算の完了を待機してください。

路面電車と背景の扉は周囲に溶け込みましたが、反射がまだ不自然な状況です。空の反射がトンネル内にまで表れてしまっています。ここでリフレクションプローブの出番です。必要に応じて適切な範囲にリフレクションプローブを効率的に配置しましょう(上のシーンでは、中央のメインの部屋に 1 つで十分です)。一般的な基準としては、キューブマップの解像度(Resolution)を 128 ピクセルに設定して立方体投影(Box Projection)を使用すれば、反射のベイク時間やメモリの消費を抑えることができます。

リフレクションプローブに関する詳細はこちらをご覧ください。

ここまでの作業で、シーン全体に自然なまとまりを持たせることはできました。これは現実世界のようなシーンを作るためには重要な要素です。しかし、全体的に作業前よりも暗くなってしまい、今のままではまったく説得力のあるビジュアル品質とは言えません。

  • HDR ライティングの値 半球ライティングと太陽光は、実際には、我々コンテンツ制作者の多くが想像するよりも遥かに明るい光源です。これらの光源の明るさは 1 よりずっと高い値になります。ここで HDR ライティングの出番です。試しにディレクショナルライトをオフにして SkyMaterial Exposure を 16 に設定してみてください。こうすることで、適切な半球ライティングがシーンにもたらす影響を確認することができます。

シーンの見た目がより現実味を帯びてきました。これは、太陽光が完全に空で拡散されている(ディレクショナルライトが表れていない)状態、つまり曇りの日と考えてください。 ここで、太陽光を大幅に高い値で再投入してみましょう。まず Intensity を 5 に設定してみます。太陽光はほぼ白く見えていますが、ディレクショナルライトの色は適切に選択することが重要です。なぜなら、強い太陽光による間接色の影響で、シーンの見た目が劇的に変わってしまう可能性があるからです。

太陽(ディレクショナルライト)が、現実世界と同じように高エネルギーの光に見えるようになりました。シーンがかなり現実らしさを帯びてきました。

  • スクリーンスペースアンビエントオクルージョンとスクリーンスペースリフレクション シーンのライティングはここまででかなり改善されましたが、ディティールを追加することで更にクオリティを上げることができます。通常は、詳細なオクルージョンのベイキングは行うことができません。これは、パフォーマンスを維持するためにリアルタイム GI の解像度に制約が設けられるためです。そこで役立つのが、スクリーンスペースアンビエントオクルージョン(SSAO)です。Ambient Occlusion の下の Post Process Profile 内で SSAO を有効に設定してください。この例では Intensity が 0.5、Radius が 1、Medium Sample count が Downsampling に設定され、Ambient Only にチェックマークを入れてあります。

追加で発生する環境光ライティングのオクルージョンは SSAO が処理してくれますが、反射に関しては、単純なリフレクションプローブのままではなく、精度を向上させる余地がありそうです。 これを行うには、レイトレーシングによるスクリーンスペースリフレクションが役立ちます。ポストプロセスプロファイルで Screen Space Reflection を有効にしてください。

湿った線路の左側では明るい反射がレンダーされなくなっています。これは SSR のおかげで画面上にあるオブジェクトの反射がより正確になったからです。これら 2 つのポストプロセッシングエフェクトは両方ともランタイムでのパフォーマンスコストを発生させますので、必要な場合にのみ有効化し、ご自身のプロジェクトにおけるランタイムの制約に合わせて、パフォーマンスへの影響度合いを考慮してバランスの良い画質設定を行ってください。

  • フォグ ここまでで、露出の固定された状態で、屋外・屋内の値の分離を行うことで幾分現実的なシーンとなりました。暗い屋内領域では、強いハイライトと深くくすんだ色値によって反射が表現されています。

しかし、深い奥行きを表す要素があるにも関わらず、手前と奥の要素が見えにくくなっています。これに関しては、シーン内に微かなフォグを加えることで大きな変化をもたらし、シーンにより奥行きを持たせることができます。

フォグなしのシーンと比較すると、手前の柵がより鮮明になっています。 フォグは、Lighting タブ > Scene > Other Settings で有効にできます。この例では Fog color が #6D6B4EFF、Density が 0.025 に設定され、Exponential が有効になっています。デファードレンダリングでは、自動で有効になっていない場合に、ポストプロセスプロファイル内でもフォグを有効にしなければならない可能性があります。

屋内および局所的ライティング

  • スポットライトとポイントライト リアルタイムの局所的ライティングの定番はスポットライトとポイントライトです。エリアライティングは、高画質スクリプタブルレンダーパイプライン(HD SRP)を使用している場合以外は、ライティングをベイクする場合にのみ使用可能です。HD SRP モードでは、リアルタイムでレンダー可能な新しいエリアライトが使用できます。 基本的にこれら 2 種類のライトは、空間内の 1 点からライトを照射し、範囲の制限を持っています。スポットライトの場合はこれに角度の制限も加わります。 詳細はこちらをご覧ください。

この 2 種類のライトの大きな相違点は、シャドウの落とし方とクッキーとのインタラクト方法に関連しています。ポイントライトのシャドーイングにはシャドウマップが 6 つ必要ですが、スポットライトの場合は 1 つです。このため、シャドウを落とすポイントライトは大幅にコストが高くなるので、使用は極力控えることが推奨されます。

(注)ベイクされたライトに関しては、この問題はありません。 もうひとつの違いは、スポットライトのクッキーテクスチャ―は単純な 2D テクスチャーであるのに対し、ポイントライトには(通常 3D ソフトウェアで作成される)キューブマップが 1 つ必要になることです。 詳細はこちらをご覧ください。

  • ライトの色と強度 説得力のある表現を実現するための適切なライトの色と強度の選択は、一定のおおまかなガイドラインに沿って行う必要があります。 選択する色と値が及ぼす影響を考慮する必要があります。 屋内のライトの強度を選択する際は、どの屋内ライトにも太陽より高い強度を持たせないようにしてください。屋内ライトが太陽より高い強度を持っていると、シーンによっては見た目のバランスが悪くなります。

例えばこのサンプルシーンの場所でも、日中の明るさを超えるほどの強い光が天井から照らされるような状況はほぼ考えられません。

色を選択する際は、できるだけ、どのカラーチャンネルも完全に除外しない(値を 0 にしない)ようにしてください。除外するとホワイトポイントに達することのできないライトが作られてしまいます。

技術的には使用可能なライトの色ですが、左の画像のライトの色は、最終出力から青色の成分を取り除いてしまいます。シーンの基準となる最終的なカラーパレットを限定的なものにするのはあまり賢明ではありません。後にカラーグレーディングを行いたい場合はなおさらです。

  • Emissive サーフェス Unity では、リアルタイム GI やベイクした GI が有効になっていれば、Emissive(放射性の)サーフェスをライティングに寄与させてエリアライティングの効果を表現することができます。これは特に、リアルタイム GI が有効の場合に役立ちます。デベロッパーは、(事前計算が行われれていれば)Emmisive サーフェスの強度と色を修正し即座にフィードバックを得ることができます。

上の画像では、天井のメッシュから発せられる微かな拡散ライティングが確認できます。

ここまでの時点で、説得力のあるシーンを作るために必要な設定とライティングについての基礎を学ぶことができました。