JKになりたい

何か書きたいことを書きます。主にWeb方面の技術系記事が多いかも。

【準備~環境光、ボリュームの初期設定まで】HDRPで絵作りに挑戦していく【Part 1】

今回から何回かにわたり、HDRPを利用したシーンのライティングに挑戦していきたいと思います。

自分もHDRP素人というか、そもそもライティングからよくわからない人間なので、勉強したことの備忘録という感じです。

間違っている箇所もあるかと思いますので、ご了承下さい。

1. アセットとシーンを準備

1.1 アセットのインポートとマテリアル変換

今回利用したアセットはこちら。 https://assetstore.unity.com/packages/3d/environments/urban/japanese-alley-162907

https://www.youtube.com/watch?v=7IWHoTkw_sQ&feature=emb_title

このアセットをインポートすると、Materialsが真っピンクになっていると思います

f:id:sakata_harumi:20210207235931p:plain

これは、ShaderがHDRPに対応していないために起こってます。

HDRPは自動でbuilt-in shaderをHDRP shaderにコンバートしてくれる機能が存在していますので、そちらを利用します。

※ build-in shader以外が使われている場合は手動でHDRP shaderに変換をしないといけないようです。今回利用するアセットは問題ありませんでした

"Render Pipeline Wizard" → "Upgrade Project Materials To High Definition Materials" もしくは "Edit" → "Render Pipeline" → "HD Render Pipeline" → "Upgrade from build in pipeline" → "Upgrade Project Materials To High Definition Materials" からコンバートが可能です

f:id:sakata_harumi:20210208000917p:plain

コンバートすると、概ね正常にプレビューが表示されるようになりました。

f:id:sakata_harumi:20210208001004p:plain

一部、正常にプレビューが読み込めていないものがあります。

こちらは、ピンク色になっているPrefabを選択し、Resetを選択することで解消されるようです。

Resetは赤線の部分から選択できます。

f:id:sakata_harumi:20210208001401p:plain

これで、アセットが利用可能になりました。

1.2 シーンにオブジェクトを設置していく

インポートしたアセットを並べて、シーンを作っていきます。

ここで、電球マークのチェックを外しておいてシーンのライティングが無効になった状態で作業を進めていくと見やすくて良いです。

f:id:sakata_harumi:20210208001812p:plain

いい感じにオブジェクトを置いてみました。 f:id:sakata_harumi:20210208002104p:plain

f:id:sakata_harumi:20210208002031p:plain

これで、準備は完了です。

2. Directional Lightと基本的なVolumeを設定

2.1 Directional Light

今回は夜のシーンを作ろうと思うので、Directional Lightもそれに合わせて設定します。

色温度は4500 kelvin、Intensityは0.5 Luxあたりに設定しました。 (※後で変更することになります)

f:id:sakata_harumi:20210208003530p:plain

こちらの値はUnityの公式ブログのチートシートを参考にできます。

f:id:sakata_harumi:20210209100632p:plain
(引用: https://blogs.unity3d.com/jp/2021/01/07/explore-learn-and-create-with-the-new-hdrp-scene-template/

他にも一般的なライトのIntensityやExposureの値(重要)なども参考にできるので、覚えるまではとても重宝します。。

blogs.unity3d.com

この通り、HDRPは現実世界の値をそのまま反映させることを念頭に実装されていますので、例えば現実世界の電球のパッケージに書かれている値などを参考にする・・等々もしていくと良さそうです。

LightのModeの違い

Lightには "Baked" "Mixed" "Realtime" が存在します。

Baked
ライトからの直接光と間接光をライトマップにベイクします。 Baked Global IlluminationがONのときのみ利用可能。

Global Illuminationとは、直接光だけでなく間接光も計算して表現しようとするレンダリング手法です。

GIにより、例えば直接光が赤色のオブジェクトにあたり、その光が反射して赤色の光を返す・・のような表現が可能になります。

docs.unity3d.com

Bakedモードでは当然ですが、ベイクされるのはstaticオブジェクトのみになります。

非staticなオブジェクトでBakedモードのライトに対してGIを表現しようとするにはライトプローブを利用します。

docs.unity3d.com

Realtime
直接光とシャドウはリアルタイムで処理されます。間接光はリアルタイムGIを有効にしたときのみ反映されます。

※ リアルタイムGIは以前、Enlighten Lightmapperで利用可能でしたが2020.2現在、非推奨であり新規で利用することはできません。Unity 2021.1に代替ソリューションを提供予定・・とのことです

blogs.unity3d.com

Mixed
Bakeするものとリアルタイムに計算するものを混合させることができます。 さらに以下の3つのMixed LightingモードがあってLigthing Settingから選択できます(HDRPではSubtractiveは選択できないっぽい?)

Subtractive
Baked Indirect
Shadowmask

詳細は割愛しますが、ざっくり理解はこんな感じです。

Substractive
Directional Light以外は直接光もBakeする。なので、非staticなオブジェクトからリアルタイムで影を落とせるのはDirectional Lightのものだけ、スペキュラの表現も不可能。
非staticなオブジェクトはライトプローブを利用してstaticオブジェクトからの影を受けることができる。

Baked Indirect
間接光のみを事前計算し、影の事前計算は行わず、Shadow Distanceの範囲でリアルタイムで描画。超えると影は作られない。

Shadowmask Mode: Shadowmask
間接光はベイク、影は事前計算されたシャドウマスクテクスチャを元に表示する。

Shadowmask Mode: Distance Shadowmask
間接光はベイク、影はShadow Distanceの範囲内はリアルタイム、それを超えたものはシャドウマスクテクスチャを利用して描画。

BuildRenderPipeline(以前のレンダーパイプライン)では、Shadowmaskのモードが2つに分かれていましたが、HDRPではShadowmaskモードでさえあれば個々のライトに応じてどちらを利用するか選択ができます。

今回は、Lighting Modeはshadowmask、Directional LightにはDistance Shadow Maskモードを設定しています。

f:id:sakata_harumi:20210208225906p:plain

f:id:sakata_harumi:20210208225923p:plain

2.2 Volumeの初期設定

Volumeはデフォルトのボリュームから必要な値だけオーバーライドする形になります。 ただ、今回はオーバーライドしてる、してないの認識統一が面倒なので、デフォルトのボリュームにこのシーンで使用するために新しく作成したボリュームを設定しておきます。

f:id:sakata_harumi:20210209011206p:plain

細かい調整は後でするとして、最低限SkyboxとExposure(露出)の設定を行います。

f:id:sakata_harumi:20210209014928p:plain

Mode
ModeではGlobal/Localが存在します。Localでは1シーン上にボリュームの設定を変えたい場合(例えば、外の部分と部屋の中の部分があるなど)に使用します。
今回は、外のみなのでシーン全体に適用されるようGlobalに設定しています。

Intensity(HDRI Sky)
先ほどのチートシートにも書かれてる通り、真夜中の環境光は0.001Lux程度とのことでした。 なので、Directional LightとSkyBoxの値を足して0.001Lux程度になるように設定します。
今回はDirectional LightのIntensityを0.0008Lux、Sky BoxのIntensityを0.0002Luxに設定してみました。

明るい昼間の外のシーンでは、太陽光:空=5:1くらいの割合になるようです。

Exposure
Volumeで最も需要なパラメータがExposure(露出)です。

カメラのレンズに入ってくる光の量は昼間の外だと12万Lux、今回のような真夜中のシーンだと0.0001Luxと大きな差があります。 そこで、撮影素子に当たる光の量をいい感じに調整するために露出のコントロールが必要になります。

現実の世界のカメラでは、シャッタースピードと絞り、ISO感度の3要素から適正露出を求めますが、Unityでは(三要素から決定することも可能ですが)露出値をダイレクトに入力できます。

ざっくりとEV値が低いほど明るい絵、高いほど暗い絵になります。

適正露出は先ほどのチートシートが参考になります。

深夜では-2程度が適正とのことでしたので、そのように設定してみました。

Mode Fixedはシーン全体で固定の露出値を使う設定です。 今のところ固定視点のシーンなのでこれで問題ないですが、本来であれば明るいところに視点があるとき、暗いところに視点がある時で露出値を調整しないといけません。

そこで、ExposureのModeにはAutomaticをはじめとする幾つかのモードがあります。こちらは余裕があれば次回以降の記事で見ていければと思います。

ここまでの結果

f:id:sakata_harumi:20210209020002p:plain

まだ暗すぎな感じがしますね。

このシーンには現状Directional Light以外のLightは存在しません。

ドアが光っているのはLitShaderのEmission Inputsが設定されているためです。

次回は主にLit Shaderの設定をみつつ、提灯に明かりを灯す作業をしていこうと思います。