今回はUnity 5で行うライティング設定や綺麗にするポイントについて調査した内容をメモしておきます。
Unity 4 free と比較して Unity5 Personal Editionで出来るようになった事
で紹介したように、Unity5はBeastからEnlightenへ移行しました。その過程で幾つかのUIや設定のコツが変化していましたので、早速追跡調査しました。
いざライティング!
目次
- 目次
- ステージ配置
- オブジェクトのマテリアル(材質)の設定
- ライトを焼く
- エフェクトを追加する
- モバイル向けの最適化
- イメージベースとライティング(IBL)
- Unity4で焼いたライトマップの移行について
- 参考資料
ステージ配置
まず従来通りライトとオブジェクトを配置します。前回の「影がこすぎる問題(アンビエントライト=環境光が低すぎる問題)は最初から良い感じの環境光が設定されている事から、かなり緩和されています。
オブジェクトのマテリアル(材質)の設定
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
staticで自動的に焼いてくれますが、ワークフロー的に無駄が多いのと、シーン読み込み時にライトが表示されない不具合があるため、明示的にBakeした方が良さそうです。
赤い床に光が反射して白い壁に薄っすらと赤い色が付いたりしているのは、Bounce Intensity(反射光)の設定です。
LightProbeの設定
この間接光はstaticを付けていない、動的なオブジェクトには反映されません。そこでライトプローブを使用し、間接光もプローブに焼き付けてしまいます。
ライトプローブの設定は、Unity - マニュアル: ライト プローブで行います。手軽にプローブを配置したければ、UnityのLightProbesを手軽にセッティングする は使い勝手が良いと思います。
場合によってはReflecctionProbe(周囲の景色を使って色を塗る。レーシングゲームで車体に映る景色的な)も使えます。屋内といったskyboxを反射に使いたくない環境ではreflectionProbeを使用しますが、その内。
エフェクトを追加する
最後にAmbient OcclusionとBloomを追加します。どちらも物理的に正しいかと言われると微妙ですが、見栄えは良くなる演出ですので正義です。パラメータはアーティストのさじ加減が割と重要なんじゃないかと思います。
ImageEffectの導入
メニューバー> 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は画像を元に環境光を設定してくれる仕組みです。これを上手く使うと、雪山や密林・街角といった環境光を手軽に設定することが出来ます。
設定はCubemapに変換した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…
続きます