【Unity2018】EmissionとBloomを使用してオブジェクトを光らせる

f:id:gunjyousky:20190107150720p:plain

はじめに、

あけましておめでとうございます。
Unity技術メモ始めました。
なにから書こうか迷ったのですが、年の初めということもあり『旧約聖書』にならって世界に光を実装する方法を記載したいと思います。

すばらしい先神たちによる福音書参考文献はこちら

初めに、神は天地を創造された。 地は混沌であって、闇が深淵の面にあり、神の霊が水の面を動いていた。 神は言われた。「光あれ。」こうして、光があった。 神は光を見て、良しとされた。神は光と闇を分け、光を昼と呼び、闇を夜と呼ばれた。夕べがあり、朝があった。第一の日である。

神は天地を創造された。

Unityで世界を創造してみましょう。
Unityを起動して、File > New Sceneから新しい世界を作ることができます。
ここでは試しにNewWorldという名前をつけて保存しています。
f:id:gunjyousky:20190102174348p:plain
Hierarchyビューをみてください。
すでにこの世界には2つの存在を確認することできますね。
これらは新しく世界を創造すると自動的に作られるものになります。

存在 詳細
Main Camera 世界をみるための(神の)目
Directional Light 世界を照らす光

さて、天地を創造するからには、地面をつくる必要があります。
Hierarchyビュー上で以下の処理をしてください。

右クリック > 3D Object > Plane 
InspectorビューでPlaneの位置を原点(0, 0, 0)にする

これで地面をつくることができました。
Hierarchyビューに新しくPlaneができていれば成功です。
ん?Gameビューに写っていないって?
Sceneビューに切り替えて、MainCameraの画角を調節しましょう。

Transform X Y Z
Position 0 2 -5
Rotation 30 0 0
Scale 1 1 1

f:id:gunjyousky:20190102181546p:plain

GameビューでもPlaneを確認できるようになりました。これで、下準備は完了です。

こうして、闇ができた。

さて、次はこの世界を真っ暗にする方法です。
いくつか手順があるので、順にみていきましょう。

1. Directional Lightを非アクティブにする

まず、Hierarchyビューの中に光となるオブジェクトが存在しますね。
このDirectional Lightを非アクティブにしてみましょう。

f:id:gunjyousky:20190101222535p:plain

おや、思っていたよりも暗くなりませんでした。 f:id:gunjyousky:20190102192453p:plain
Directional Lightの影響はなくなったものの、まだ何かしらの光の影響を受けているようです。
しかも、Hierarchyビュー上には存在しないソースのようです。
探してみましょう。

2. 拡散環境光の設定を変更する

調べてみると、どうやら拡散環境光(アンビエントライト)のせいで明るくなっているようです。

docs.unity3d.com

拡散環境光は、光源を持たず、世界全体を照らす光です。
そのため、特定のソースオブジェクトを持っていません。
設定は下記ウィンドウより変更できます。
Window > Rendering > Lighting Settings

f:id:gunjyousky:20190102212950p:plain

Lighting SettingsウィンドウのSceneタブ内にあるEnvironment配下の設定を変更します。

Environment 変更前の値 変更後の値
Environment Lighting > Intensity Multiplier 1 0
Environment Reflections > Intensity Multiplier 1 0

Environment Lightingはライトを配置する前のSceneの明るさを決める拡散環境光を表しており、Intensity Multiplierで明るさの度合いを変更することができます。
Environment Reflectionsは拡散環境光の反射光を表しており、Intensity Multiplierで反射光の映り込み具合を変更することができます。

f:id:gunjyousky:20190102213942p:plain

これでPlaneにかかる拡散環境光とその反射光は0になり、大地は暗闇に覆われました。
あとは大空を暗くするだけです。

3. カメラの背景設定を変更する

Scene上で奥行き方向に最も遠い空間に何を描画するかは、カメラから設定することができます。
Main CameraをクリックしてInspectorビューからCameraコンポーネントを確認すると、一番上にClear Flags という設定があります。
これが、カメラの背景を設定している項目です。
今回は世界を暗闇で覆いたいので、何も描画しないDon't Clearを選択肢します。
その他の項目の意味を理解したい場合は、下記を参照してください。

Clear Flags 意味
Skybox スカイボックスを使用する
Solid Color 特定の色で塗りつぶす
Depth Only 前のフレームに残っていた色か、前に表示されていた何かを残す
Don't Clear 何も表示しない

docs.unity3d.com

これで、世界は闇に包まれました。 f:id:gunjyousky:20190102220418p:plain

Emissonによって、オブジェクトに光が宿った。

ゲームオブジェクトを光らせる方法についてみていきます。
Sceneが暗いと作業しにくいので、<u><b>Lighting Settingsウィンドウ > Sceneタブ > Environment配下の設定を元に戻しましょう。
これまでの作業はなんだったのか・・・

Environment デフォルトの値
Environment Lighting > Intensity Multiplier 1
Environment Reflections > Intensity Multiplier 1

次に、光らせるオブジェクトとそれを取り囲むような左右奥3面の壁を用意します。

光らせるオブジェクト(Cube)

Transform X Y Z
Position 0 0.5 0
Rotation 0 0 0
Scale 1 1 1

左右奥の3面の壁
反射光のテストに使用するため、適当な大きさで光らせるCubeを取り囲むように配置する。
もし画角が悪いようであれば、カメラをX軸回転させて調節してください。
※図のカメラはX軸に20度回転させています。

f:id:gunjyousky:20190103014437p:plain

では実際のCubeを自己発光させたいと思います。

1. 自己発光用マテリアルを作成する

Cubeを光らせるには、自己発光用のマテリアルを作成してアタッチする必要があります。
Projectビュー > 右クリック > Create > Materialを選択して、新しくマテリアルを作成してください。
f:id:gunjyousky:20190103015358p:plain

ここでは新しく作成したマテリアルに、仮にM_Emissionという名前をつけました。
さて、マテリアルとはどのような質感の素材なのかを設定するためのものになります。
作成したマテリアルをクリックし、Inspectorビュー > Emissionにチェックをいれましょう。
f:id:gunjyousky:20190103015919p:plain

これで、マテリアルに自己発光(Emission)という質感を追加することができました。
どんな色で自己発光するかは、Emission下のColorから設定できます。
また、Colorの左のアイコンから白黒の画像を選択すると、そのテクスチャの白い箇所のみを発光させることができます。
f:id:gunjyousky:20190103140815p:plain

ここではテクスチャを使わず、RGB =(1, 1, 1) の白色を設定したいと思います。
これで、マテリアルの設定は完了です。

Sceneビューを開き、光らせたいCubeにマテリアルをD&Dしましょう。
Cubeの色が白色になれば、うまく適用できています。
f:id:gunjyousky:20190103021046p:plain

さて、Gameビューをみてみましょう。
f:id:gunjyousky:20190103021152p:plain

・・・おっと、拡散環境光を消し忘れていたため壁と床がはっきりと見えてしまっています。
拡散環境光の影響を受けないようにしてみましょう。

Window > Rendering > Lighting Settings > Sceneタブ > Environment

Environment 変更後の値
Environment Lighting > Intensity Multiplier 0
Environment Reflections > Intensity Multiplier 0

f:id:gunjyousky:20190103021802p:plain

Cubeのみ白く光っていますね。
無事オブジェクトを自己発光させることができました。

2. 反射光を設定する

Cubeの反射光を設定していきましょう。
反射光とは、Cubeを光源としたときの周りのオブジェクトへの映り込みになります。
Cubeを光源として壁や床を照らし出してみましょう。

設定は簡単です。
光源となるオブジェクトと、その影響を受けるオブジェクトをStaticにするだけです。
f:id:gunjyousky:20190103134525p:plain

光源となるCube、床、壁オブジェクトをStaticに変更しました。
f:id:gunjyousky:20190103134748p:plain

床や壁を照らし出すことができました。

最後に、staticな球体を空間に追加してみたいと思います。 f:id:gunjyousky:20190103135515p:plain

Cubeの光が綺麗に球体に写り込んでいますね。
左側の壁に球体の影も確認できます。

これで、反射光に関する設定は完了です。

Bloomによって、光が滲んだ。

表現をより豊かにしてみましょう。
自己発光している物体は、眩しくて光が滲んで見えますよね。
この光の滲みを実装してみたいと思います。
f:id:gunjyousky:20190104013111j:plain

1. HDRを有効にする

Bloom処理を行うには、カメラのHDR設定をアクティブにする必要があります。 docs.unity3d.com Main Camera > Cameraコンポーネント > Allow HDR をアクティブにしてください。

f:id:gunjyousky:20190107113218p:plain

2. Legacy Image Effectsをインポートする

光を滲ませるには、Bloomという処理が必要になってきます。
このBloom処理は、スクリプトから制御できます。
AssetStoreからLegacy Image Effectsをインポートしてください。

f:id:gunjyousky:20190104015019p:plain

3. Bloomエフェクトをアタッチする

インポートが終了したらカメラにBloomスクリプトを追加しましょう。

docs.unity3d.com

Main Camera > InspectorビューのAdd Componentをクリック > 検索欄に『Bloom』と入力します。
出てきた『Bloom』スクリプトをクリックしてcomponentに追加しましょう。 f:id:gunjyousky:20190107141818p:plain

ちなみにBloomと名のつくスクリプトは3種類ありますが、違いは以下のようになります。

スクリプト 内容
Bloom 今回使用する最も拡張されたスクリプト
Bloom Optimized 高速に動くよう最適化されたスクリプト
Bloom And Flares 同時にレンズフレアも自動生成の設定も出来るスクリプト

Bloomの設定項目についてみていきましょう。
今回はMode:Basicでの設定項目をみていきます。 f:id:gunjyousky:20190107141937p:plain

設定項目 デフォルト設定 説明
Quality High High で高品質、高周波数を維持し、エイリアシング低減します。
Mode Basic 高度なオプションを表示するには Complex モードを選択します。
Blend Add カラーバッファに Bloom を追加するために使用するメソッド。
HDR Auto Bloomの計算結果によってはHDRバッファを使用することがあるので、Onにしておく。
Intensity 0.5 Bloomの強度。
Threshold 0.5 Bloomの閾値。画像領域でこの値よりも明るい領域にBloomが適用される。
Blur iterations 2 ガウスブラーが適用される回数。
Sample distance 2.5 ブラーの最大半径。
4. Bloomとマテリアルの値を調節する

最後に、Bloomの設定とマテリアルを調節していい感じに仕上げましょう。

マテリアルの設定

設定項目
R 1
G 1
B 1
Intensity 0

※MaterialのIntensityを調節することで反射光を制御できます。

Bloomの設定

設定項目
Quality High
Mode Basic
Blend Add
HDR On
Intensity 0.5
Threshold 0.5
Blur iterations 2
Sample distance 2.5

※BloomのIntensityを調節することでボカシ具合の強度を制御できます。

Bloomなし
f:id:gunjyousky:20190107115906p:plain

Bloomあり
f:id:gunjyousky:20190107120033p:plain

以上、これで光のボカシを実装することができました。

参考文献

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

gametukurikata.com