ライティング
光源

ライティングの概要

Unity が3D オブジェクトのシェーディングを計算するためには、そのオブジェクトに当たる光の強度、方向、色の情報が必要です。

これらのプロパティーは、シーン内にある Light オブジェクトによって提供されます。ライトのタイプが異なると、異なる方法で設定された色を発します。ライトの中には、光源からの距離で減衰するものもあります。Unityに用意されているさまざまなタイプの光源については Types of lightを参照してください。

Unityでは、いろいろな使用目的それぞれに、複雑で高度なライティング効果を、さまざまな異なる方法で計算することが可能です。

ライティング方法の選択

大まかに言うと、Unityのライティングには ‘リアルタイム’ なものと ‘事前計算’ によるものがあり、両方組み合わせて使うことでシーンのライティングをより印象的にできます。

ここでは、技術の相違による効果の違い、長所、個々のパフォーマンスの特徴などの簡単な概要を説明します。

リアルタイムライティング

デフォルトでは、 Unity にはディレクショナル、スポット、ポイントの各ライトがあります。それらのライトは、シーンのダイレクトライトとともに、毎フレーム更新されます。ライトとゲームオブジェクトがシーン内で移動すると、ライトは即座に更新されます。これはシーンとゲームビューどちらでも確認できます。

リアルタイムライティングは、リアルタイムライトのみの結果です。影は完全な黒で、ライトをまったく反射しません。唯一、スポットライトのコーンによるフォールオフだけが影響します。

リアルタイムライティングは、シーン内のオブジェクトをライティングする最も基本的な方法で、キャラクターなどの動くジオメトリを照らすのに向いています。

残念ながら Unity のリアルタイムライトから放たれる光は、一度放たれた後は、反射しません。より写実的でリアルなシーンを作成するためには、事前計算によるライティングを有効にして、グローバルイルミネーションなどの技法を使います。

ライトマップのベイク

Unity では、静的で複雑なライティング効果を計算することができます(グローバルイルミネーションやGIと呼ばれる技法を使います)。計算結果は、ライトマップと呼ばれる参照用テクスチャマップに保存されます。この計算のプロセスをベイク(焼き付け)と言います。

ライトマップをベイクすると、シーン内にある静的なオブジェクトへの光源の影響が計算され、その結果がシーン内のジオメトリの上に、テクスチャとしてオーバーライドされます。これによってライティング効果が生み出されます。

左: 簡単なライトマップシーン。右: Unity によって生成されたライトマップテクスチャ。両方のシャドウとライトの情報がどのように捕らえられているかに注目してください。
左: 簡単なライトマップシーン。右: Unity によって生成されたライトマップテクスチャ。両方のシャドウとライトの情報がどのように捕らえられているかに注目してください。

これらのライトマップにはサーフェイスを直に照らす直接光と、シーン内にある他のオブジェクトやサーフェイスから跳ね返ってくる間接光の、どちらも含めることができます。このライティングテクスチャは、オブジェクトのマテリアルと関連付けられたシェーダーによって、色情報(アルベド)やリリーフ(法線)などのサーフェイス情報と組み合わせて使うことができます。

ライティングをベイクして生成されたライトマップには、ゲーム中に変更を加えることができません。そのため ‘静的(スタティック)’ と呼ばれます。リアルタイムライトは、ライトマップされたシーンの上から加算的にオーバーライドして使うことはできますが、ライトマップ自体を変化させることはありません。

この手法により、ゲーム中にライトを自在に動かす自由と引き換えに、モバイル端末のような非力なハードウェア上でのパフォーマンス向上を狙うことができます。

詳しくは ライティングウィンドウ事前計算されたライティングの使用 を参照してください。

事前計算されたリアルタイムグローバルイルミネーション

スタティックなライトマップではシーン内でライティングを変化させることができませんが、事前計算によるリアルタイムGIは、シーンの複雑なライティングをインタラクティブに更新する方法を提供します。

この手法により、間接光によるリッチなグローバルイルミネーションを使ってライティングされた環境を生成しつつ、リアルタイムでライティングを変更することが可能になります。時刻システム(時間とともに光源の色と位置が変化する)は最適な例です。ベイクによるライトマップでは、これは出来ません。

事前計算されたリアルタイム GI を使った時刻の簡単な例
事前計算されたリアルタイム GI を使った時刻の簡単な例

これらのエフェクトをプレイできるフレームレートで行うためには、長々と時間がかかるものをリアルタイム処理から事前計算処理にする必要があります。

事前計算によって、ゲーム中に行っていた複雑なライトビヘイビアの計算を、比較的時間に余裕のあるときにできるようになります。 これを「オフライン」処理と呼んでいます。

詳しい情報は lighting and rendering チュートリアルを参照してください。

利点と欠点

ベイク GI ライティングと事前計算したリアルタイム GI を同時に使用することも可能ですが、レンダリングのパフォーマンスコストは単純にそれらを合算した値になってしまうことに注意してください。ビデオメモリーに両方のライトマップ一式を保存しなければいけないだけでなく、シェーダー内でデコードするプロセッサのコストも必要になります。

対象ハードの性能とプロジェクトの特性から、ライティング方法をどちらか一つ選択したい場合があります。例えば、ビデオメモリーとプロセッサ性能が非常に限られているモバイルデバイスでは、ベイク GI ライティングを使った方がパフォーマンスを上げやすいでしょう。専用のグラフィックスハードウェアを持ったデスクトップPCや、最近のゲーム機では、事前計算のリアルタイム GI を使うことも、同時に両方のシステムを使用することも問題なく可能です。

どのアプローチを使うかは、それを使用するプロジェクトとターゲットプラットフォームの性質によります。異なるハードウェアの範囲をターゲットにしているとき、どのアプローチが必要かはしばしば、最低限の性能によって決定されます。

関連資料: Light のトラブルシューティングとパフォーマンス

ライティング
光源