おもちゃラボ

Unityで遊びを作ってます

【Unityシェーダ入門】暗闇から光が溢れ出るライトブルームの演出をする

室内から外を眺めたときや、トンネルから出るとき、イルミネーションなど、暗い場所から明るい場所を眺めるときに、光が溢れ出るような映像がよく使われます。

f:id:nn_hokuson:20170226004333p:plain

この光のあふれるエフェクトをライトブルーム(Light Bloom)と呼びます。Unityでは標準機能を使って簡単にライトブルームを実現することができます。今回は「かまくら」から溢れ出る光を作ってみましょう。

Unityで真っ暗闇の世界をつくる

まずはライトブルームを作る前に、Unityの世界を真っ暗にしなければエフェクトの効果が分かりません。Unityで真っ暗闇を作るには次の2ステップです。

  1. Directional Lightを消す
  2. Skyboxからの光を遮断する

Directional Lightはライトオブジェクト自体を消しても良いですが、薄っすらと光を当てたい場合はインスペクタからIntensityを小さな値に設定します。

f:id:nn_hokuson:20170226005047p:plain:w250

Skyboxからの光を遮断するには、Lighting WindowからAmbient ColorとReflection Intensityの項目を設定します。Unityのメニューバーから「Window」→「Lighting」でウインドウを開き、次のように設定します。

f:id:nn_hokuson:20170226005454g:plain

ポイントライトを配置する

ライトブルームに使うポイントライト(Point Light)をかまくらの中に配置します。ポイントライトはヒエラルキービューから「Create」→「Light」→「Point Light」で使用できます。光の強度などはインスペクタから設定して下さい。

f:id:nn_hokuson:20170226005934p:plain

ライトブルームを実現する場合は明るさのダイナミックレンジを広げる必要があります。通常、Unityの画面の明度は0.0〜1.0の範囲ですが、HDR(High Dynamic Range)を利用することで1.0以上の値も扱えるようになります。

HDRを利用するには、Main CameraのインスペクタからHDRの項目にチェックを入れるだけです。

f:id:nn_hokuson:20170226010522p:plain:w300

ただ、上の画像のように「HDR and MultisampleAntiAliasing (in Forward Rendering Path) is not supported.」というエラーがでるので、アンチエイリアスの機能を切って下さい。アンチエイリアスを使わないようにするには、メニューから「Edit」→「Project Settings」→「Quality」を選択し、Anti AliasingをDisableに設定します。

f:id:nn_hokuson:20170226011027g:plain

ライトブルームのエフェクトをかける

ライトブルームのエフェクトにはStandard Assetsに用意されているEffectsパッケージを使用します。「Assets」→「Import Package」→「Effects」を選択してインポートして下さい。

インポートできたら「Standard Assets/Effects/ImageEffects/Scripts」フォルダにある以下の4つのエフェクトをMain Cameraにアタッチします。

  1. Antialiasing
  2. Bloom
  3. ScreenSpaceAmbientOcclusion
  4. Tonemapping

それぞれの効果は、次の画像を参考にして下さい。まずは元画像がこちらです。光は溢れ出してないし、エッジがギザギザしています。まだ、単純にオブジェクトを配置しただけ、という感じで余り綺麗な映像ではありませんね。
f:id:nn_hokuson:20170226011720p:plain

Antialiasingのエフェクトをかけることで、画面のエッジのギザギザを滑らかにしました。かまくらの入り口部分とUnityちゃんの髪の毛がきれいになりました。
f:id:nn_hokuson:20170226011758p:plain

Bloomエフェクトを追加しました。これで、かまくらの中から光の溢れ出す映像になりましたね。ただ、明暗のメリハリがなく立体感に欠けています。
f:id:nn_hokuson:20170226011819p:plain

ScreenSpaceAmbientOcclusionを追加することで、暗くなるべきところを更に暗くしています。SSAOと略されることが多いこのエフェクトは、地面とオブジェクトが接する部分や、オブジェクトが重なる部分など、光が回り込まない部分を更に暗くするエフェクトです。
f:id:nn_hokuson:20170226011848p:plain

最後にTonemappingをすることで、全体的な色のバランスを整えています。Unityで用意されているトーンマッピングには様々な種類が用意されているので、好みによって使い分けて下さい。
f:id:nn_hokuson:20170226011915p:plain

エフェクトをかけるのは、お化粧をしていくみたいで楽しいですね〜。UnityのEffectsパッケージには他にも色々と楽しいエフェクトが用意されているので、試してみると楽しいですよ^^/