RenderModeの設定によるライティングの変化
About
Unity上であつかうことのできる光源(Light)には"RenderMode"が用意されています。パラメータの設定によって光源によって照らし出される(ライティング)される面の表情、レンダリング結果が変化するので、それぞれどういう特徴があるか押さえておく必要があります。ここでは特にSpotlightに焦点を合わせて解説します。
複数の光源(ライト/Light)を近い位置に配置したり、多数配置すると、レンダリング結果が変わって、光が強く反射しているところ(照り返し・ハイライト)が消える。ライトがちらつく。見えていたはずの光が消える。これらの現象が発生していてそれを改善したい場合、この記事の内容がその解決に役立つ可能性があります。
- Unity_RenderModeTest.zip
- Unity.4.0.1f2
用意されているパラメータは3つ
設定されているRenderModeはInspectorビューの項目、RenderModeから確認することができます。用意されているパラメータは次の3つです。
- Auto
- ImportantかNotImportantを自動的に判定して決定する。
- Important
- 計算コストが高いが、綺麗にレンダリングされる。
- (ピクセル単位でライティングする)
- NotImportant
- 計算コストが低いが、おおざっぱにレンダリングされる。
- (頂点単位でライティングする)
厳密にはピクセル単位と頂点単位の処理の違い
RenderModeのパラメータの違いについて、先の項目では計算コストやレンダリング結果で比較しました。しかしながら実際には描画(処理の)ロジックが異なっていて、()で表記しているような違いがあります。これらはCG分野においては基本的な知識です。CGのレンダリング工程について知識を持った人が見れば両者の差は良くわかり、適切に使い分けられると思いますので、重ねて掲載しました。また処理ロジックの違いについて取り上げるとここで取り扱う内容から外れるので、CGのレンダリング工程について知りたい場合には他の資料を参照してください。
またスクリプト側からLightのRenderModeを設定する場合には、Import、NotImportの表記ではないことに注意する必要があります。それぞれForcePixel(Important/ピクセル単位)、ForceVertex(NotImportant/頂点単位)とされています。Autoについては共通です。
設定の変更によるレンダリング結果の差
サンプルの環境を用意してSpotlightとそのRenderModeの設定によるレンダリング結果の比較を行います。
画像のシーンは、3つのSpotlight(光源/Light)のRenderModeがすべてImportant(ピクセル単位の処理)に設定されたシーンです。すべてのSpotlightが床面に円形の光を演出していることが分かります。Lightをシーンに追加するときの初期値はAutoですから、任意に設定しなければこのような状況は作り出せません。分かりやすさのためにImportから解説を行っていますが、Autoについてはこの項目の後半で解説しています。 |
画像のシーンは、3つのSpotlightのRenderModeがすべてNotImportant(頂点単位の処理)に設定されたシーンです。Spotlight特有の円形の光が床面に現れていないことに注目してください。Spotlightを追加したのに、光が床面に見られない、という状況は、RenderModeがNotImportantになっている可能性があります。もちろん異なる他のLightの影響もうけますし、Materialに起因することもありますし、Autoによって自動的にNotImportantが選択されている可能性もありますが。 |
画像のシーンは、3つのSpotlightのRenderModeがすべてAutoに設定されたシーンです。Autoによって自動的にImportantかNotImportantが決定された結果、右の1つがImportantに設定され、残りの2つがAutoに設定されたようです。これはカメラの位置やレンダリングの設定、Lightの位置などに依存して決定されているようですが、Auto設定時のパラメータ決定アルゴリズムの詳細については調査していません。 "Spotlightがちらつく"という現象は、RenderModeがAutoに設定されたことによって発生している可能性があります。ImportantとNotImportantが切り替わるためです。もちろんその他のLightやMaterialに依存しますが。 |
画像は、1つ前の画像が示すシーンから、上の方に配置されたSpotlightを少し右に移動したシーンです。少し移動したことによって対象のRenderModeがImportantに設定されたことが分かります(設定はAutoのまま変わらず)。 |
画像は、1つ前の画像が示すシーンから、対象のSpotlightをさらに右に移動したシーンです。対象のRenderModeがNotImportantに設定され、代わりに左に配置されたSpotlightのRenderModeがImportantに切り替わったことが分かります。 |
実用的なRenderModeの設定
RenderModeの違いによってどのような影響が出るかは確認できたことと思います。では実際のステージ/シーン設計などではどのような基準でRenderModeを選択すればよいのか。私見ですが、次のような基準でRenderModeの選択を行ってはどうでしょうか。基本的には計算コストを考慮することになります。
- 画面のちらつきや、実行環境の違いによるレンダリング結果の変化、の原因になるので、Autoは基本的に利用しない。
- 主要なキャラクターやシーンを表現するために、Lightが重要な構成要素である場合は、Importantを設定する。
- Ex.車のヘッドライト、ビーム攻撃、サーチライトの表現など。
- 光源が多数配置されるオブジェクトである場合、主要なキャラクターやシーンの演出に重要な構成要素ではない場合、NotImportantを設定する。
- Ex.空間中に大量に配置される光源、街灯や光るアイテムオブジェクトなど。
- メニュー画面やキャラクター選択画面などではImportantを設定する。
- リザルト画面など、ゲームの実行中と比較して計算コストが低いシーンでの演出。
- Ex.選択したキャラクターのライトアップなど。