今回はUnity 5で行うライティング設定や綺麗にするポイントについて調査した内容をメモしておきます。
Unity 4 free と比較して Unity5 Personal Editionで出来るようになった事
で紹介したように、Unity5はBeastからEnlightenへ移行しました。その過程で幾つかのUIや設定のコツが変化していましたので、早速追跡調査しました。
いざライティング!
ステージ配置
まず従来通りライトとオブジェクトを配置します。前回の「影がこすぎる問題(アンビエントライト=環境光が低すぎる問題)は最初から良い感じのライトが配置されている事から、かなり緩和されています。
オブジェクトのマテリアル(材質)の設定
Unity5はStandardShaderによる物理ベースシェーディング機能により 「マテリアル(材質)」設定が非常に重要な意味を持ちます。
というのも、物理ベースシェーダーは「現在世界にある反射係数や色の設定を入れることでフォトリアルな絵作りを実現する」物ですので、アーティストのセンスによる設定ではなく物理的なパラメータを元にして設定する必要があります。*1*2
試しにWorking with Physically-Based Shading: a Practical Approach – Unity Blogを参考に、オブジェクトの一つを「金」にしました。チャートを元に色や反射係数を決定します。
他にも岩やコンクリート、鉄等様々な固有の色を使ってよりフォトリアルな感じに設定できるらしいのですが、知識不足なのでその内
テンプレートとしてShader Calibration Scene [5.0 beta]が使えそうです。WOODはちょっと微妙な感じがしますが。
ちなみに、光沢を出したければエッジを丸めたオブジェクトの方が良いです。光が綺麗に反射するためにはある程度の面が必要なのですが、Unity標準のCUBEは角が尖っているので、金属を指定しても上手く光ってくれません。
ライトを焼く
より良いライティングを行うため、ライトを焼きます。
但し、EnlightenはBeastとは違い明示的に焼く必要はありません。静的なオブジェクトとしてstaticのチェックボックスを入れると、勝手にGIの計算や必要であればライトを焼いてくれます。*3
赤い床に光が反射して白い壁に薄っすらと赤い色が付いたりしているのは、Bounce Intensity(間接光)の設定です。
この間接光はstaticを付けていない、動的なオブジェクトには反映されません。そこでライトプローブを使用し、間接光もプローブに焼き付けてしまいます。
ライトプローブの設定は、Unity - マニュアル: ライト プローブで行います。手軽にプローブを配置したければ、UnityのLightProbesを手軽にセッティングする は使い勝手が良いと思います。
場合によってはReflecctionProbe(周囲の景色を使って色を塗る。レーシングゲームで車体に映る景色的な)も使えますが、まあその内。
エフェクトを追加する
最後にAmbient OcclusionとBloomを追加します。どちらも物理的に正しいかと言われると微妙ですが、見栄えは良くなる演出ですので、アーティストのさじ加減が割と重要なんじゃないかと思います。
メニューバー> Assets > import Package > Effect にイメージエフェクトや丸影・フレア等のエフェクトがあるので、それをインポートして使います。新しいUnityのStandardAssetsはJSもどきではなくC#になったので、かなりC#から管理が楽になりました。
使用するのは Bloom とScreen Space Ambient Occlusion です。Bloomは輝度が1以上の値を使用できるように、CameraのHDRにチェックを入れます。
下の絵は以下のパラメータでやってますが、見ながら良さそうな値を調整した物ですので参考程度に。
上手く演出が出来たらカラーコレクションでメリハリの有る絵に調整します。他にもDepth Of Field(被写体深度)やアンチエイリアス・Vignette、Tonemapping等々、色々と絵を強化するエフェクトはあるので、色々と試してみると良いと思います。
ただ、VRで使う場合は、こういった「目やレンズの現象をエミュレートするエフェクト」が意味があるかは、よく考える必要がありそうです。
モバイル向けの最適化
Enlightenは基本的にリアルタイムなライト+間接光を事前計算という形をとっていますが、モバイル向けにライト総数を減らしたい場合、ライトをbake設定に変更しライトをベイクしてしまうアイディアがあります。
本来オブジェクトに対して行う光表現はライトプローブで代用します。ライトプローブは基本的にライトを使うより超軽いので、割と良い感じのパフォーマンスが出せます。
ただライトプローブでは光沢や影といったダイナミックな光表現を行うことが出来ないので、その辺りは判断が難しい所です。
なお影に関しては自分が色々と試した限り、ライトマップを焼いて影に濃い目のSSAOで付けるのが今のところ一番綺麗に出来る印象です。もしくは複数の丸か。*4。
イメージベースとライティング(IBL)
IBLは画像を元に環境光を設定してくれる仕組みです。これを上手く使うと、雪山や密林・街角といった環境光を手軽に設定することが出来ます。
設定はHDR画像をシーンにドラッグ&ドロップするだけです。画像自体は自分で用意出来れば一番良いと思いますが、とりあえず試したい場合はHDR LabsさんのsIBL Archiveから使わせてもらうと良いんじゃないかと思います*5。
実はディレクショナルライトを設定するよりコレだけでライティングを設定したほうが綺麗な絵が作れるのですが、IBLだけでは先のライトをベイクする問題と同様に動的なオブジェクトに影と光沢が設定しづらいので悩ましい所です。
Unity4で焼いたライトマップの移行について
焼き直しです。基本思想が違うので、まあ仕方のない所です。
何かEnlightenへアップデートする的なボタンがあった気がしますが、基本的に焼き直しだったハズです。
参考資料
Unity 5 Graphics - Lighting Overview - Unity Official Tutorials - YouTube
Working with Physically-Based Shading: a Practical Approach – Unity Blog
『THE COMPREHENSIVE PBR GUIDE Volume 1: The Theory of PBR by Allegor…
『THE COMPREHENSIVE PBR GUIDE – Vol. 2: Practical guidelines for creat…