見出し画像

Unity : PostProcessing Stack v2 : Bloom

はじめに

光の表現に欠かせないBloom機能。
unity2018では、PostProcessing Stack v2で実現します。

環境

* MacBook Pro(Retina, 15-inch Mid 2015)
* Unity2018.2.2f1
* XCode v7.2

Steps

> PostProcessing Stack v2をプロジェクトに追加

新規Project作成で、"3D With Extras以下のテンプレート"では、本Stepは不要です。次のStepへ進んでください。

Unity2018を起動したら、WindowメニューからPackage Managerを選びます。

画像1

さらに、All -> PostProcessing -> Install 2.0.5-previewの順にクリックしていきます。インストールが完了したら、Packagesダイアログの右上のxをクリックして閉じます。

画像2

> camera設定

PostProcessingを適用したいカメラに、Post-process Layerコンポーネントを追加します。カメラを選択し、Inspectorビューから、Add Componentをクリック、Rendering -> Post-process Layer、で追加します。"Post-process Layer"と入力して直接 探してもOKです。

画像3

addされたcomponentで、Layer欄をPostProcessingにします(Component追加時、自動で本Layerが追加されています)。

画像4

Anti-aliasingは任意で設定します。
モバイルやVRなど軽量にしたい場合はFXAA、デスクトップなど高負荷で構わない場合は用途に合わせてSMAA, TAAでもOKです。

以下、各項目の説明です。

>> Trigger

Triggerは、「後に設定するPost-process Volumeにおいて、Localと設定した場合(IsGlobalのcheckBoxを外す)」に、Post-processを発動させる距離を決めるためのObject(のtransform)を指定します。

通常は、デフォルト(= アタッチしてあるカメラ)で構いません。

この時、"カメラ"と、"Post-process VolumeをattachしたObject"が、指定距離内に入ると、Post-processが発動します。

この場合は、Post-processが適用されるObject(実際にボヤっと光るsphereなど)との距離は、関係ないので注意してください。
あくまで、"Trigger"と"Post-process Volume"の距離が問題です。

トップビュー・ゲームの場合、カメラではなく、プレイヤーオブジェクトからの距離で発動範囲を設定した方がいいかもしれません。

そのような場合は、ここにプレイヤーオブジェクトを設定します。

>> Layer

カメラは、「ここで指定したLayer内にあるPost-processing Volume(をaddされたGameObject)」から影響を受けることになります。

unity2018では、自動でPostProcessing Layerが定義されるので、これを設定すると良いでしょう。もし、自動でLayerが作成されていない場合は、自分で追加すればOKです。

Performanceに影響するので、このLayerをDefaultやEverythingにするのはやめましょう。

>> Anti-aliasing

Post Processによるアンチエイリアシング(ドットのギザギザを滑らかにする処理)を使いたい時に設定します。
FXAAがモバイル用の軽量なもの。
SMAAはハイクオリティーですが、モバイルには不向きで、VR/ARでは現状で非対応のもの。
TAAは過去のフレームなどを使ったアルゴリズムでやはりFXAAより高負荷で、リソースも食い、数年前のopenGLES2のモバイル端末は非対応のものです。

FXAAを選択しておいて、必要に応じてその他のものに変更して様子を見るのが良さそうです。

>> Stop NaN Propagation

真っ黒な場所にPost Processを適用しようとすると無効な計算が行われておかしな現象が起きたりするので、それを防ぐ設定です。
基本的にtrueのままにしておくのがよいでしょう。

> Post-process Volumeを設定

Post Processを適用する範囲や内容を個別に設定して、レイヤーやTriggerからの距離で適用範囲を切り替えることが可能です。

シーン全体で設定する場合は、1つだけ設定すれば構いません。
それ用の空のオブジェクトを作成することが推奨されていますので、それに従います。GameObjectメニューからCreate Emptyを選択して、空のゲームオブジェクトを作成します。
ゲームオブジェクトの名前はPostProcess Volumeとしました。

InspectorビューのLayerで、先ほど、Post-process Layer componentのLayerに設定したもの、を設定します。今回はPostProcessingです

画像5

InspectorビューからAdd Componentをクリックして、Rendering -> Post-process Volumeを選択して追加します。

画像6

続いて、シーン全体に適用して構わない場合は、Is Globalをチェックします。

画像7

Is Globalチェックを入れないと、このゲームオブジェクトと、カメラのPost-process LayerのTriggerに設定したオブジェクトの距離がBlend Distance欄で設定した距離以内になった時に、Post Processが発動するように設定できます。

ただし、距離判定のため、"PostProcess Volume(先程の空オブジェクト)"に、colliderを設定するのを忘れずに。

Profile欄のNewボタンをクリックして、このPost-process Volumeで発動させたいプロファイルデータ用のアセットを生成します。
Project蘭にProfileが作成されていることを確認してください。作成済みのProfileを差し替えることも可能です。

画像8

以上で、Post Processの初期設定完了です。効果を設定していきます。

> Post Processを設定する

Post Processの内容は、Post-process Volumeオブジェクトで設定して行きます。定番のBloomを設定してみましょう。Hierarchyビューで、設定したいPost-process Volumeが設定されているオブジェクトを選択します。

画像9

Inspectorビューから、Post Process VolumeコンポーネントのAdd effect...ボタンをクリックします。

画像10

Unity -> Bloomを選択します。

画像11

InspectorビューにBloomが追加されるので、クリックして開きます。

画像12

全ての項目が「無効」になっていて、、少しわかりにくいのですが、
左の●をクリックすると有効になります。

画像13

Intensityを有効にして、1を入力します。

画像14

以上でBloomが有効になります。他の項目もチェックを入れれば使えるので必要に応じてチェックを入れて設定してください。

最後に、光らせたいオブジェクトのマテリアルの設定をします。

> materialを設定してObjectを輝かせる

Sphereなどを作成したら、Materialを作成して適用します。
Bloomの効果を出すには、自己発光させますので、マテリアルのEmissionにチェックを入れます。

画像15

さらに、EmissionのColor欄をクリックします。

画像16

輝かせたい色を設定したら、Intensity欄を1以上の値にします。例では5にしています

画像17

光りました!

画像18

空間全体を暗くして、sphereのIntensityを3程度に下げてみました。
Bloom、格好いいですね。

画像19

まとめ

手書きですが、以下のような感じです。

画像20

Editor's note

こちらと、materialをDynamicに変更するscriptを使い、音楽連動Systemにつなげてみる予定です。

参考文献/ URL

* PostProcessing Stack v2を使う
* 【Unity】PostProcessingStack v2を使ってみる





もしよろしければ、サポートをお願いします! 頂いたサポートは、Creatorとしての活動費に充てさせて頂きます。