テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】"家具を動かせる" 部屋(ステージ)の見栄えを、出来る限り良い感じにする

f:id:tsubaki_t1:20180116220627j:plain

綺麗なグラフィックを実現するのは8割以上はモデルとマテリアルのクォリティですが、〆としてライティングやポストプロセスも重要な要素の一つです。

ただし、場合によってはライティングのベイクを利用できないといったケースも存在するかもしれません。例えば建築デモなど、部屋の家具が変化可能といったケースです。
日差しの位置やライトの配置など、すべての要素が変化する可能性があります。

今回は、そういったダイナミックに追加/変化するオブジェクトでも綺麗に見せる為に色々と試行錯誤してみた結果を紹介します。

 

オブジェクトをダイナミックに生成しても、そこまで破綻なく表現出来ています。

f:id:tsubaki_t1:20180117112134g:plain

壁紙(金属製のカーペット??)の一部を変更すると、部屋の色味も変わります。

f:id:tsubaki_t1:20180117112755g:plain

 

目次

手順

手順ですが、基本的には下の方法で紹介しているような内容です。
下の内容と重複してる部分はあまりちゃんと紹介しません。


ただし今回は家具を動的に動かせるようにしたいので、可能な限りリアルタイムで変更可能にします。

tsubakit1.hateblo.jp

ただし、ところどころ順序が異なります。

事前準備なパート

まずは事前準備です。ベイクなしと言っても、ある程度は準備しておいたほうが色々と良いです。

1.  初期状態

まず前回に引き続き初期状態です。

大抵の場合、部屋はうっすら青く、また金属には空(Skybox)が写り込んでいます。

マテリアルだけはPBR想定で綺麗ですが、空間的に綺麗かと言われるとまだ微妙な状況です。

f:id:tsubaki_t1:20180117113518j:plain

部屋の家具を全て取っ払います。(非アクティブで)

引越し後のような状態!自分の部屋もこの状態に戻したいです。

 

f:id:tsubaki_t1:20180116222334j:plain

この部屋は固定なので(流石に部屋の破壊はしない!)、部屋はライティングスタティックを設定しておきます。

f:id:tsubaki_t1:20180116222723j:plain

Lightmapstaticは壁紙や地面の照り返しを受けたり変更するために設定します。

 

2. ReflectionProbeを追加する

次にReflection Probeを用意します。
範囲は部屋を覆う感じです。
またReflectionProbeの銀玉は部屋の中央が望ましいです。出来れば少し高めにしておくと良いかもしれません。

f:id:tsubaki_t1:20180116222943j:plain

f:id:tsubaki_t1:20180116223019j:plain

 

前回と明確に違う点は、Reflection ProbeのTypeをRealtimeに設定する事です。
Bakedだと追加した家具に対応できませんが、RealtimeならばReflection Staticの無い動的に追加した家具にも対応して、リアルタイムな反射を提供出来ます。

f:id:tsubaki_t1:20180116223101j:plain

 

3. Lightprobeを用意する

次はライトプローブを用意します。

ライトプローブは、照り返しやベイクした光の情報をプローブに格納しておきリアルタイムに配置したオブジェクトやキャラクターに反映させる機能です。

例えば下の木ですが、左の木は照り返し情報を受けてうっすらと赤くなっていますが、右の木は照り返し情報を受けていないのでそのまま白黒な表現になってしまっています。

f:id:tsubaki_t1:20180116224719j:plain

このLightprobeは通常は出来る限り数を削減するのが重要なのですが*1、今回は潤沢かつ大量に敷き詰めます。

f:id:tsubaki_t1:20180116223620j:plain

 

4.ライトをベイクする

ライトをベイクします。

前回はライトのベイクはもう少し後の手順でしたが、今回は部屋とLightprobeとReflectionProbeを置けば準備OKなので、もう焼きます。

 

今回はRealtime GIを使うのでRealtime GIはマストです。
逆に、Mixed Lightingは任意です。固定の光があるならMixedLightingの方が綺麗に出やすいので、固定の光があるなら。

f:id:tsubaki_t1:20180116225213j:plain

もしなお、部屋にカーペット等がある場合は、このタイミング前に敷いておきます。同様に部屋の壁の色を全面ではなく一部だけ変えたい…みたいな場合は、ここまでで分割しておきます。

f:id:tsubaki_t1:20180116230528j:plain

コレ以降はゲーム再生中にセットしても良いです。

Realtime GIがONの状態で壁紙やカーペットをベイクしておけば、壁紙やカーペットの色が変化した際にも色が変化してくれます。

その際には、色を変えるオブジェクトにMeshRenderer.UpdateGIMaterials()を忘れずに。
 

動的に編集可なパート

続きです。

ここからはリアルタイムで行う編集です。

順不同でOKです。

 

ポストプロセスを追加

画面にポストプロセスを追加します。

PostProcessingStackで。

f:id:tsubaki_t1:20180116233326j:plain

内容は良い感じに見える(屋内向け)ライティングの設定手順 と同様に、AA、AO、SSR、DOF、BLOOM、ColorGrading、Vignetteです。

f:id:tsubaki_t1:20180116233139j:plain

特にSSRは出来れば使いたい所です。
SSRを使用すると、細かい調度品の反射が破綻しにくく綺麗に出ます。

こちらはDeferredレンダリング前提です。

f:id:tsubaki_t1:20180117115304j:plain

 

部屋に家具を設置する

部屋に家具を設置します。

家具は基本的に動的に配置しても良いですが、今はテストなので今配置します。

f:id:tsubaki_t1:20180116231349j:plain

ここでのポイントは、大きめの家具にはLightprobe Proxy Volume(LPPV)を設定することです。

LPPVは、大きなオブジェクトの一部にLightprobeの影響を与えるような状況で、大きなオブジェクトを自然に見せてくれます。

f:id:tsubaki_t1:20180116231550j:plain

f:id:tsubaki_t1:20180116232720j:plain

tsubakit1.hateblo.jp

 

SSAOを追加する

家具を追加しますが、今回は家具に対してライトのベイクを行っていないので、家具と部屋、家具と家具のスキマには通常通りの影しかなく、存在感が希薄です。

なので、PPSに加えてSSAOを足してしまいます。

 

結果はどちらでも良いですが、どちらかは「薄く・濃く」反対は「広く・薄く」のAOを設定すると良いです。

f:id:tsubaki_t1:20180116234204j:plain

またPPSのSSAOはAmbient Onlyの設定を入れておくと、光の当たっている部分にAOがかからなくなるので自然に見えます。

f:id:tsubaki_t1:20180116234723j:plain

光を追加する

部屋が暗いと気分も暗くなりますので、明るくします。

ポイントライトやスポットライト、ディレクショナルライトを追加します。

ポイントライトは基本的に影有りです。負荷?知るかこちとらリアルタイムやぞ

f:id:tsubaki_t1:20180116234918j:plain

f:id:tsubaki_t1:20180116235006j:plain

 

感想

ということで、可能な限りベイクに頼らずやってみました。

まぁ初期よりは悪くないかな…?という所ですが、ベイクしたほうが存在感はあるなぁという印象です。主に影。

f:id:tsubaki_t1:20180117000314j:plain

f:id:tsubaki_t1:20180117000326j:plain

f:id:tsubaki_t1:20180117000343j:plain

 

関連

今回はGIをリアルタイムに実現しましたが、実はベイクなしでリアルタイムにGIを実現するアセットがあります。

dynamic voxel-based global illumination systemをリアルタイムに実現するオープンソースプロジェクトです。今回みたいに小細工するよりは良い絵が出来るかもしれません。

若干重めです。

github.com

 

tsubakit1.hateblo.jpf:id:tsubaki_t1:20180117000714j:plain

f:id:tsubaki_t1:20180117011414j:plain

 

ゲーム系に使うならこちら。

やはりライトは静的なものに限ります。

tsubakit1.hateblo.jp

*1:LightprobeはLightprobe間の移動時にコストが発生する。この頻度が多いと負荷になる。またオブジェクトの生成時にLightprobeの位置の探索が行われるが、この際にもLightprobeが多いとコストになる