前回の続きです。
3. 光りを放つものを作っていく
今回のシーンでは、光を放つものが3つあります。
1つが既に発光している店の扉。もう1つが提灯。最後が店の看板です。
今回は、この3つについて設定をしていきたいと思います。
3.1 店の扉
店の中から発される光を設定していきます。
本当は扉の裏に光源を設置し、扉がその光を透通すような表現をするのが正しいのかもしれないんですけど、今回は扉自体が光を放出しているとして、Emissionの設定を行っていきます。
Standard ShaderのDocumentを見てみると
エミッシブマテリアルは、通常、内側から照らされているように見えるゲームオブジェクトに使用されます。例えば、暗闇の中で見えるモニターの画面、高速時にブレーキをかけている車のディスクブレーキ、コントロールパネルの光るボタン、モンスターの目などです。
とあるので、今回のユースケースにも適していそうです。
一方、物理的に正しそうな表現(物体がその背後にある光源の光を透過させる)もLit Shaderでは可能です。
この後着手していく提灯は、そのように実装していきたいと思います。
Lit ShaderでEmissionの設定
Lit ShaderではEmission inputsの項目でEmissionの設定を行います。
Use Emission Intensityにチェックを入れると、Emissiveカラーと発光強度を別々に設定することができます。今回は利用していませんが、一通り完成後の調整で使うかもしれません。
Baked Emissionは、GIを利用する場合はチェックを入れないといけません。現状Realtime GIには対応していないようです(Unity 2021系では復活するのかな?)
以下、チェックを入れてないもの/入れたものの比較です。(Bake済み)
Baked Emissionにチェックが入っていない方では、GIが計算されないため段ボール、地面などに本来当たるはずの間接光が反映されていないことがわかります。
Bakedの方では、段ボールはもちろん、地面もうっすら照らされていることがわかります。
ここまで
ちょっと色味と強度を修正してベイクしてみました。 手前の段ボールなどにEmissiveカラーの間接光が反映されていることがわかります。
3.2 提灯
提灯は内部に光源となる電球が存在して、そこが発光し内部で光が散乱した後に外部へ出ていきます。
このような表現のメカニズムをSubsurface Scatteringといいます。Lit Shaderではこの表現が可能です。
このSubsurface Scatteringでよく例にあげられるのは「人間の肌」です。
たとえば、人間の肌の質感などがよい例である。人間の肌の表面は実は半透明であり、光は完全には反射されず、一度肌の内部に入り、内部において何度も何度も反射と散乱を繰り返した後に、外に出る。そこで出てきた光を見て、人間は色を感じている。(wikipediaから引用)
Subsurface Scatteringの前にEmission
比較用に、Material TypeはStandardの状態で、光源を置くのではなくドア同様Emissionを設定してみます。
充分いい感じに見えますね。。
Subsurface Scattering
まずは、Lit ShaderのMaterial TypeをSSではなくStandardにした状態のまま内部に光源(Point Light)を設置してみます (Emissionの設定は元に戻しておきます)
内部に光源を配置するとき、Lit ShaderのDouble Sidedにチェックをつけておきます。 こうすることで、内部に配置した光源の光が外に漏れる事がなくなります。
Surface TypeがOpaque(不透明)のため、内部に光源を配置しても光が一切提灯の中から漏れることがありません。
ここでMaterial TypeをStandard→Subsurface Scatteringに変更します。
すると、内部の光源がいい感じに放出されているような見た目になります。
ただし、Diffusion Profileが設定されていないので緑色になってしまっています。 新しくDiffusion Profileを作成し、設定していきたいと思います。
・・の前に、少し逸れてしまいますがまずは内部の電球のパラメータを調整していきましょう。
Point Light
提灯の内部にPoint Lightを生成しておきます。 ググると、提灯用LED電球を発見しましたので、これが中に入っているということにして数値を設定していきます。
Radius
光源の半径です。今回は直径45mmの電球とのことなので半径は22.5mm。メートルに換算して0.0255mとなります。
Temperature
色温度。スペックに書いてある通り2200Kelvinを設定します
Intensity
こちらもスペックに書いてある通り340Lumenを設定します。
Range
光の最大到達距離を設定します。
この記事曰く、光源から2mほど離れると照度はほぼ0になるらしいので、Rangeは2に設定してみました。
Diffusion Profile
Diffusion Profileは Create → Rendering → Diffusion Profileから作成できます。 作成後、使用するためにはVolumeのDiffusion Profile Overrideに追加したProfileを登録しておく必要があります。
Parameters
Scattering Distance
ここをコントロールしてDiffusion Profileの形、ぼかしなどを設定します。
物理的に正しい値をどう設定するのか・・など詳しい事はわかりませんでした。
とりあえず見た目で良い感じになるように設定しています。
Index of Refraction
値を大きくすると鏡面反射の強度が上がります。
今回は光源が内部にあるので関係なさそうです。
Subsurface Scattering only
Post-scatterだとsubsurface scattering適用後にマテリアルにAlbedoを適用します。よって、テクスチャがくっきり表示されます。
Pre and post scatterでは、名前の通りAlbedo適用前後でsubsurface scatteringを適用します。よって、テクスチャがぼやけソフトな感じになります。
Transmission only Parameters
以下はthicknessの利用がONになっているときのみ有効なパラメータです。
今回はONですが、tchikness mapがないのでmaterial全体で均一の厚さ(1.0)の設定にしています。
Transmission Mode
厚い素材の場合はThick Objectに設定するよう。すると、シャドウマップを利用してSSの計算をするらしい・・ 今回は薄い素材なのでThin Objectに設定しました。
Thickness Remap Values
素材の厚さのmin-maxをmm単位で指定します。
thickness mapの情報を元に0.0~1.0の厚さが設定されているはずなので、そこにThickness Remap Valuesが乗算された値が計算上の厚さになります。
今回は均一でthicknessが1.0のためmaxのみ利用されることになります。
厚めの和紙がだいたい0.3mmくらいみたいなので、そのように設定してみました。
とりあえずここまでで、提灯がいい感じに発行するようになりました。
Emissionと比べて、やわらかい感じが出ている気がします。
3.3 看板
看板は普通にEmissionを設定していこうと思います
結果(1)
全ての提灯、看板にライトの設定を入れました。
結果がこちら。
一部光っていない提灯があるので、原因を探っていきます。
Sceneと表示モードをLight Overlapにします。
この中で、赤い電球マークになっているものがあるのがわかります。
Shadow maskテクスチャでは、最大4つの重なり合うライト情報までしか格納できません。そのため、それ以上のライトについてはBakeされます。
Light Overlapモードで表示される赤い電球マークは、Bakeされる光源を意味しています。
Bakeされた光源については、リアルタイムで処理されないため光が内部で拡散せず、提灯が光っていないのだと推測してます。
じゃあ全部Realtime Lightにすれば良いのでは?と思うんですが、それはそれでshadow mapが使われたり使われなかったりするせいか狂います
といわけで 諦めます v(゚∀。)v
結局、提灯にもEmissionの設定をすることにしました。
結果(2)
紆余曲折ありましたが、結局Emissionの設定だけに落ち着きました・・
次回はambient occlusionやpost processの設定などやっていきます。