見出し画像

全てのデザイナーへ贈る次世代のライティング!Unity HDRPを介して、普遍的な絵作りの知識を身につけよう【CEDEC 2020】


画像1

ゲーム開発者向けカンファレンス「CEDEC 2020」の初日(2020年9月2日)、ユニティ・テクノロジーズ・ジャパンの大下岳志氏が『クオリティを引き上げる!Unity HDRPのライティング、カメラ、ポストプロセス設定』と題したセッションを行った。

 このセッションでは、Unity2019から正式版となったHigh Definition Render Pipeline(HDRP)について、これまでのUnityと違って求められる知識や不明点を解消し、より多くの方がHDRPが楽しめることを目標に、設定項目と具体的な数値などが紹介された。徹底した物理ベースレンダリングによって、より確実に高品質なグラフィックを作り出すことができるHDRPのセッション内容をお伝えしていこう。

はじめに

 ゲームを専門としてるアーティストにとっては、HDRPを使うメリットや勘所はやや掴みづらいかもしれない、と大下氏は語る。それは、HDRPがUnityを含む従来のゲームエンジンに比べて、かなり現実世界に寄せた「物理ベース」の考え方を大胆に導入してることが原因。そのため、クオリティを上げるには一般的なゲームと違う知識が必要になる。
 マテリアルにおいては「物理ベース」の単語は聞き馴染みがあるが、HDRPの物理ベースはレンダリング全体に流れる大きなコンセプトになっているため、聞きなれない用語や仕組みが多いはず、とのこと。
 よって今回は、最も基本的な

・Lighting
・Camera
・Fog

について、HDRPの挙動のモチーフとなっている物理現象がどういうものか、それを具体的にUnityでどう設定すればよいのかについて解説する。

Lighting

画像2

ライトは、オブジェクト・カメラと合わせて、レンダリングのための最も基本的な要素の一つ。HDRPでは、このライトがかなり現実に近い形に進化している。

画像3

これは Physical Light units(現実に存在する光の単位)を扱えるようになったことがとても大きく貢献している。
※以下、PLUと呼ぶ

 UnityのHDRPで扱える光の単位は複数ある(現実世界と同じ)。

画像5

■Candelas(カンデラ)
 これは最も基本的な光の単位で、光源が特定の方向を照らす明るさのこと。単位の意味は Candle(キャンドル)で、ロウソク一本分の明るさというのが元々の意味だが、今ではもう少し厳密な定義がある。

■Lumens(ルーメン)
 一つの光源が全方向に照射する光の総量。Candelasは特定方向、Lumensは全方向という違い。

■Luminance(ルミナンス)
 Candelas/㎡(カンデラ毎平方メートル)という意味を持つ単位。Candelasが一点の明るさであるのに対して、それを面にしたときの明るさを表すのがLuminance。テレビやモニターの明るさを表すものだと思えば理解しやすい。

画像6

■Lux(ルクス)
 ここまでの単位が光源の明るさを表す単位だったのに対し、Luxはある光によって照らされた場所がどれくらいの明るさになるかを表す単位。例えば、複数の光源によって照らされた場所が最終的にどれくらいの明るさになっているかを表すことができる。

■EV100
 概ねLuxと同じような考え方だが、それを光の単位ではなく、カメラの露出値(Exposure Value)で表現したもの。「ISO感度100の時のEV値」という意味で「EV100」と呼ぶ。
※ISO感度=レンズから入ってきた光を、カメラ内でどのくらい増幅させるかの指標

画像4

 さて、ここまでの説明だと、現実の光の単位(PLU)を使うことに対して面倒な印象を持つ。しかし、以降の説明でその不安は払拭できる。

PLUを使う利点

画像7

 現実世界のさまざまなシチュエーションの明るさがどのくらいの値であるかの情報は、CGの分野に限らず、世界中のあらゆる場面で共有・活用されていて、誰でもすぐそのデータを手に入れることができる。

画像10

 これらのデータがあることで、UnityのHDRPもアーティストが各自の感覚でライトの設定をするのではなく、世の中の値を参照してそのまま使って破綻なくリアルな環境が作れる。

画像11

 現実世界から引っ張ってこれる情報は他にもある。

画像10

 それは色温度。光源の色を色温度という単位で指定することができ、これも現実世界でどんなものがどの色温度であるか、一般化されたものがある。

HDRPのLighting設定実演(昼)

今回は昼と夜のLightingをそれぞれ実演。

 まずは昼から。普段と同じように、最初に太陽の役割になる Directional Light を Hierarchy  上に作る。
 HDRPの Directional Light は、初期設定だと Intencity(輝度)が非常に低い状態であるため、単位を Lux にして、先程の現実世界でのLux値を参考に、作りたい環境の値を初めに設定する。

スクリーンショット 2020-09-08 18.57.50

今回は、明るく晴れた空を作るために 120,000Lux を設定。
※画面がとても眩しくなるが、後ほどCameraの設定で解消される

スクリーンショット 2020-09-08 19.00.18

ライトの色温度(Temperature)も資料を参照し、太陽光の真ん中あたりである5500K(ケルビン) を入力。

スクリーンショット 2020-09-09 3.02.43

 次に、空の設定として Global Volume というオブジェクトを Hierarchy  上に作る。Volume はHDRPの重要な概念の一つだが、ひとまず「シーンや特定の場所に作用する、様々な設定を行うためのオブジェクト」と理解しておけばよい。
 作りたての Volume には単に領域を指定するだけの効果しかないため、最初に各種設定を持たせるためのプロファイル(Volume Profile)を作成する。

スクリーンショット 2020-09-09 3.07.38

Volume とプロファイルはそれぞれ独立しているため、同じプロファイルを別な Volume に再利用することもできる。

スクリーンショット 2020-09-09 3.09.30

空を作るため、Inspector の Add Override から、「Visual Environment」という設定を作る。これは主に空の種類を指定するための設定。 

スクリーンショット 2020-09-09 3.11.49

タイプを「HDRI Sky」に切り替え、Add Override で「HDRI Sky」の設定を作る。

スクリーンショット 2020-09-09 3.15.41

「Hdri Sky」に空のキューブマップテクスチャを指定。

 これで空が表示されるが、まだオブジェクトにあたっているライティングの効果は Directional Light によるものがほとんど全てで、空の影響は受けていない。
 実際には空も間接光として地表を照らしているので、Directional Light のIntensity(輝度)を下げ、その分を HDRI Sky の Intensity に加える。

画像19

 太陽と空の Intensity の比率は、晴天時で 5:1 、曇り時は 4:1 くらいになるとのこと。
 今回は、空(HDRI Sky)を 20,000Lux とし、その分を太陽(Directional Light)から引いて 100,000Lux とした。

 これで昼のライティングは完成。入力する値は現実世界の値を参照するだけで、どこに設定するかを覚えるだけでよいので簡単。特に日中の屋外は太陽と空の影響がほとんどなのでとてもシンプル。
 ここまでの設定が済んでも画面が明るすぎて真っ白になっているが、本来ライティングは常にカメラの設定をあわせて完成するものなので、次のCameraの解説までこのままでおいておく。

HDRPのLighting設定実演(夜)

 次は新規に別シーンを作り、夜のライディング設定を実演。ここでの設定は、室内でのライティングでもほぼそのまま応用することができる。
 夜と室内のライティングの共通点は、昼のように明るい太陽がなく、人工的な発光物の配置によってその場所が照らされてるということ。そのため、昼のように強力な光源で直接その場の明るさを決定するのではなく、いろいろな種類の小さな光源をたくさん配置し、その結果として環境の明るさが出来上がる、という流れになる。
 この最終的な明るさをどう決めるかについては、カメラの話が終わった後に戻ってくるので、ここではその前段階として「配置する照明器具をどう作るか」という話から始める。

 まず初めに空だけを作る。先程と同じように Global Volume を作り、HDRI Sky を Add Override。キューブマップテクスチャを設定しておく。

スクリーンショット 2020-09-09 4.09.22

夜空の明るさを参照し、値を 1Lux にする。
※この状態だと暗すぎて作業しづらいので、一時的に100Lux程度にして、後ほど元に戻すことを推奨

スクリーンショット 2020-09-09 4.12.17

これから街灯を作るが、リアルなCGで何もない場所に光源を置くのは違和感があるので、電球モデルを用意。Hierarchy 上で電球と同じ位置に Point Light を作成する。

画像22

 今回は Intensity に Lumen を使用。これまでと同じように輝度や色温度を現実世界の情報を元に各種設定していく。電球の明るさに関しては、実物の商品のスペックなどでも公開されているのでそれを参照するのもよい。

スクリーンショット 2020-09-09 4.32.12

 次に光の範囲を設定。この値が現実世界のものを大きく乖離してると違和感が出るため、自然な値を入れたい。これについても PLU のおかげで簡単に算出することができる。
 現実の光は、明るさが距離の逆二乗に沿って減衰する。HDRPではこれを再現しているため、光源の明るさから光が見えなくなる距離を計算できる。
 10000Lumenの場合、距離が100mを超えると明るさが 1 以下になるため、この値とした。(つまり √(明るさ)=距離 で概ね計算できる)

画像24

 続いて電球のモデルに自己発光の設定を行う。
 マテリアルの Use Emission Intensity にチェックを入れると、PLU で発光時の明るさが指定できるようになる。先に、大まかに Emissive Color を色温度と合わせる。
 次に Emission Intensity。Emission には EV100 と Luminance が使えるが、今回は Luminance にした。これは、光の単位は条件が揃えばお互いに変換もできるが、Lumen からの変換が簡単だったのが Luminance だったため。HDRPの Luminance は、Candelas の値を入れると自動で面積を考慮してくれるので、実際には Lumen から Candelas への変換となる。

画像25

 1 Candelas(ロウソク1本分の明るさ) = 12.57Lumen。今回作るライトは 10000Lumen なので、10000 / 12.57 ≒ 796Canderas となり、これを Emission Intensity へ設定する。
 これで Point Light とオブジェクトの明るさが揃った。これをプレハブ化して、適宜配置していく。
※配置後に作業前に一時的に大きくしていたHDRI SkyのLuxを元に戻すこと

スクリーンショット 2020-09-09 4.58.17

 作業を進めて、街灯と建物の室内から溢れる光をたくさん配置した。まだ全体は暗いが、こちらも後ほど解決するのでひとまず作業はここまでとして、カメラの解説へ移る。

Camera

画像11

 Unityに限らず3Dを扱うソフトのカメラで、よく使うのは位置と角度、画角など。場合によってはDOFやモーションブラーなども使う。
 HDRPは現実に則した設定が重要であることはここまでで説明したとおり。では、現実のカメラにはどんな設定があるか?これについて解説していく。

画像27

 まずはピント。カメラから撮影対象までの距離。

画像28

 次に、画角はレンズの焦点距離という形で、ズームさせたりレンズをまるとご取り替えたりすることで切り替える。

画像29

 次に、シャッター速度というシャッターを開閉する時間の設定がある。これはモーションブラーや画面全体の手ブレなどに影響する。

画像30

 次に絞り。これはレンズからカメラに入ってくる光を減らす設定。理屈はやや難しいが、ひとまずここではDOFの設定の一部、という程度で認識しておけばよい。ただ、現実のDOFには絞りだけではなく画角とピントの距離も大きく影響している。

スクリーンショット 2020-09-09 6.21.54

 このように、CGと現実のカメラの効果は概ね揃えることができるが、現実のカメラ設定には他にも影響を与える部分がある。

露出値(Exposure Value)

スクリーンショット 2020-09-09 6.24.21

 CGでよく「トーンマッピング」と呼ばれている機能に相当する「露出」というものが、さきほどまでの設定によって変わる。

スクリーンショット 2020-09-09 6.26.44

 カメラというのは簡単に言うと、外部から入ってきた光をレンズを通して内部のフィルム(デジカメでは撮像素子)に当てて映像を作るという装置。

スクリーンショット 2020-09-09 6.27.47

 この撮像素子が受け取る光にはちょうどよい量が決まっていて、入ってくる光がこれを上回ると映像は白飛びし、下回ると真っ暗になってしまう。

 外から入ってくる光の強さについては、さきほどのLightingの項でも解説したとおり、晴天で120,000Lux、オフィスで300Luxといった具合に大きな振り幅がある。

画像35

 120,000Luxの光も、300Luxの光も、レンズから入って撮像素子に当たるまでの間にほぼ同じくらいの強さになるように調整しなければいけない。
 この「どのくらいの光が入ってくるようにするか」が 露出 であり、撮像素子がちょうどよく反応する光の量を「適正露出」と呼ぶ。

スクリーンショット 2020-09-09 6.35.45

 写真撮影では映す環境の明るさのことを EV と呼び、カメラを調整する露出の単位も EV と呼ぶ。
 ただし、環境のEVは明るいほど値が大きくなるのに対して、カメラのEVはそれを打ち消すように、逆に暗く設定するほど値が大きくなっていく。

画像37

 つまり、撮影環境のEVとカメラのEVが同じ値で、

環境のEV ー カメラのEV = 0

という状態が「適正露出」であるということになる。

スクリーンショット 2020-09-09 6.44.21

 「シャッター速度」と「絞り」ではブラーとDOFを調整できると説明したが、それと同時にこれらの値を上げ下げすることで入ってくる光の量も増減する。
 そのため写真撮影では多くの場合、まず光の量が適正露出になるよう設定した上で、可能な範囲でボケ(DOF)やブレ(ブラー)を調整する、という流れになる。

 やや説明が深いところまで至ったが、伝えたかったことは、現実の写真撮影では「露出」の値がとても大事で、それは様々な設定によって増減するものであるということ。
 UnityのHDRPでも最も重要なのはEV、すなわち Exposure Value の設定。

HDRPのCamera設定実演(昼)

 HDRPでの露出は、空と同じように Global Volume に対して Exposure という設定を Add Override で追加して調整する。
 Exposure には Fixed、Auto、Use Physical Camera の3種類のモードがある。

スクリーンショット 2020-09-09 6.53.02

 まずは最初に作成した昼のシーンで、Fixed(修正済)の設定でExposureを使ってみる。Fixedは最もシンプルな露出設定で、他の何の干渉も受けずに望んだ露出(EV値)を入力できる。
 このEVの値も、これまで同様に資料から参照できる。今回は晴天なのでEV13とした。

スクリーンショット 2020-09-09 6.57.20

 これまで眩しすぎたシーンに適正露出が設定されたことで、イメージ通りの見た目になった。
 Fixedではあまり凝った設定はできないが、そのシンプルさと直接的な作用からライティングの作業にも重宝する機能となる。

スクリーンショット 2020-09-09 7.05.15

 次に、Auto(自動)での露出設定。これは指定した範囲内で露出を自動調整する機能。HDRを使ったゲームではよく使われる手法。
 光の測定モードや可変の範囲、速度などを設定すると、明るい場所/暗い場所を判断して自動で露出が変化するモードで、スマホのカメラなどに近いイメージの動きになる。

 Compensation はいわゆる「露出補正」で、適正露出として狙う明るさ自体を上げ下げするので、常に少し明るめ/暗めという状態を作れる。

 Autoはいろいろな場面に対応できるので、プレイヤーの行動を制限しないゲームに向いた設定。一方で、平均的な露出調整にならざるをえないので、「あえてここだけは明るく/暗く見せたい」というような意図的な絵作りには向いていないという欠点がある。

スクリーンショット 2020-09-09 7.10.12

 次に、Use Physical Camera(物理カメラを使った設定)。これはカメラのコンポーネントに含まれる物理設定を使って、露出を決める方法。
 これを選ぶと Volume での設定は Compensation(露出補正)だけになり、それ以外は全てカメラ側で設定することになる。

スクリーンショット 2020-09-09 7.12.07

 カメラの物理設定では、前述したような本物のカメラの設定をそのまま入力できるので、絞り(Aperture)やシャッター速度(Shutter Speed)、ISO感度などを使って露出をコントロールすることになる。
 このモードの利点は、実際の写真撮影に慣れている人が日頃使っている設定をそのまま当てはめることができること。

 特にDOF(被写界深度)の設定にも、この Physical Camera を使うことでより実写に近い感覚で絵作りをコントロールできる
 本来のDOFの効果は光の量と密接な関係があり、そのバランスが崩れていると不自然な見た目となってしまい、正しいDOFの設定は従来非常に難しいものだった。
 Physical Camera を使うことで、現実に則した形で被写界深度を設定できるため、とても自然な仕上がりになる。

HDRPのCamera設定実演(夜)

 次に、夜のシーンのカメラ設定。夜や室内の照明配置では個別のライトの明るさは決められるものの、全体としてどのくらいの明るさのものを何個配置したらよいか、という調整が一般的に非常に難しい
 しかし、HDRPではカメラで確実に露出をコントロールできるので、それを利用して一般的な環境の露出値を先にカメラに設定して、そのカメラ越しに丁度良く見えるようライトを配置していく、という方法が使える。

スクリーンショット 2020-09-09 7.29.10

 今回の例では日没後と定義して、先にExposureを 1 に設定し、この状態で丁度良く見えるようライトを配置した。

スクリーンショット 2020-09-09 7.31.39

 図のように、破綻のない環境が出来上がった。もし明るすぎる/暗すぎるというような場合は、各種ライトのIntensity(明るさ)をむやみに調整せず、現実のもっと暗いライトのデータを探してそれに合わせたり、配置の数を増減したりして、調整するのがよい。

 このようにPLUを使って現実と同じ光の量でライティングされたシーンには、同じく現実と同じようにカメラでの露出調整が必須。しかしこれさえ正しく設定すれば、陰影の階調が豊かで自然な仕上がりが期待できる

Fog

スクリーンショット 2020-09-09 7.37.25

 最後に、Fog(霧)について解説する。従来のFogと言えば、奥行きを出したり、遠方のカリングやLODをごまかしたりというような、ややフェイク寄りのテクニックだった
 最新のFogはそれだけではなく、空気や霧の中を通過する光の再現などによって、空間にリアリティを与える重要な要素となっている
 現実世界では、CGのFogで表現されるような現象はとても多彩で、一様に考えられないことも多いが、今回はFogについてもできるだけ現実でのふるまいから設定を考えていく。

画像47

 Fogは英語で霧を指す単語だが、CGにおいてFogを使って再現するものは霧だけではない。

■大気散乱
遠方に行くほど風景が淡い色合いになる効果

■霧・靄(きり・もや)
主に大気中の水分によって発生するもの

■煙霧(えんむ)
煙や小さな砂などの不純物によって発生するもの

大まかに分けるとこのようなものがある。今回はその発生の仕組みによって、大気散乱と、それ以外の霧などの現象とで分けて解説する。

大気散乱

スクリーンショット 2020-09-09 7.58.44

 まずは大気散乱について。これは簡単に言うと空が青い理由と同じ現象
 光は波長によって色が違って見えるが、空気中の水分を中心としたごく小さな微粒子に光があたったとき、波長の短い青色の成分のみが散乱する。この散った光が人間の目やカメラのレンズに入ってくることにより、空が青く見えている。この光の散乱のことを「レイリー散乱」と呼ぶ。

画像49

 遠くの風景を見るときにも、カメラと風景の間にある大気で光が散乱することによって青く色がつくので、遠くにあるものほど空の色に近づいていく
※ちなみに夕方に空が赤くなるのもレイリー散乱によるものだが、話が長くなるため本セッションでは割愛(ぜひ調べてください!とのこと)

霧・靄・煙霧

スクリーンショット 2020-09-09 8.04.08

 霧と靄の違いは単なる濃さの違いで、1km先が見通せないものが霧(きり)、1km〜10kmの間で視界を遮るものを靄(もや)と呼ぶ。また、地面に接触してるものを霧(きり)、空に浮いているものを雲(くも)と呼ぶ。よって、ここからの話はこのあたり全て共通したものと考えてよい

スクリーンショット 2020-09-09 8.11.56

 霧は大気散乱と同じ仕組みの現象だが、大気散乱との違いは水の粒子の大きさにある。霧は晴れた空に比べてとても大きな水の粒子が浮遊している状態。
 大気散乱では小さい水の粒子が特定の波長(色)を散乱させるが、この粒子が一定よりも大きい場合、特定の色ではなく全ての色を等しく散乱させる。その結果、霧には特定の色がつかず、グレースケールか付近の照明の色がそのまま現れる。この現象は「ミー散乱」と呼ぶ。

スクリーンショット 2020-09-09 8.12.29

 この水の粒子は大きいため重く、大気の低い場所に集まって、高い場所に向けてグラデーション状に薄くなっていく。霧の背の高さは大きくても数百メートルで、600mに達する霧は珍しいとのこと。

スクリーンショット 2020-09-09 8.15.16

 また、霧は大気中のたくさんの水の粒子に光が当たってる様子から、角度によっては普通には見えないような、光源からの光の筋が見えることがある
 これにはゴッドレイなどのいくつか通称があるが、現象の名前としては「薄明光線」もしくは「チンダル現象」というのが正しい名称。

 靄(もや)や煙霧(えんむ)も、基本的には霧と同じ仕組みになっている。しかし、煙霧のように水以外の微粒子が何かの色を持っている場合、霧とは違ってその色が待機中に現れる 。
※例えば砂が含まれる場合、茶色っぽくなる

 以上を念頭に、HDRPでFogの設定を実演していく。

HDRPのFog設定実演(大気散乱)

 Unityでも大気散乱と霧の表現を別々に行う。とはいえ、大気散乱も霧も、気温や湿度、季節や場所など、様々な要素が複雑に関わっているので、一概に「こういう値」と表現することは難しい。
 今回はその中でも「おおよそこのあたりを狙えばよいのでは」というアタリになるような設定を紹介することを目標としている。

スクリーンショット 2020-09-09 10.05.28

 まずは大気散乱。空やカメラの露出と同様に、Fog も Volume に Add Override で設定する。ちなみに、HDRPのFogは奥行きと高さで濃度を調整できる Height Fog である。

 カラーモードに「スカイカラー」を選択すると、周囲の空の色をブレンドしてFogのカラーにするので、とても自然な色味になる(擬似的にレイリー散乱を表現している)。

 Base Height に値を入力すると、その値まではY方向に均一なFogとなり、それより高い場所では Maximum Height の高さまでグラデーション状に薄くなっていく。
 大気散乱を再現する場合は、高さに関わらず空に溶け込むように色の変化が起こってほしいので、高さ方向の変化が起こらないように Base Height を高い値に設定する。

 残るはFogの拡散距離(Fog Attenuation Distance)。どのくらいの距離で霧が濃くなるか、という設定。マニュアルには、ここに入力した距離で約54%の色が散乱されると書かれている。大気散乱の場合は状況によって大きく変化するもので、現実世界で参照できる情報も見つからなかった

Fogの拡散距離の算出の一例

 そこで、なんとか自身で適切な値を見つけることが出来ないか、と大下氏が試みた Fog Attenuation Distance の計算について紹介があった。本人は「根拠が薄いが…」と補足していたが、非常にユニークな手段であったため、本記事でも紹介しておきたい。

スクリーンショット 2020-09-09 10.15.15

 まず、参考になりそうな大気散乱が起こっている場所へ行き、写真を撮る。この山々は奥に行くほど色が淡くなっているが、この変化は山の色に空の色が重なることで見えているはず。そこで、PhotoShopで手前の山の色に空の色をブレンドし、その割合をメモした。

スクリーンショット 2020-09-09 10.20.44

 次に、地図を見て撮影場所から色をピックアップした場所までの距離を測る。その距離と、ブレンドの割合から計算式を作り、その計算で割合が54%になる距離を求めた。(54%=Fog Attenuation Distanceの距離地点での色の拡散割合)
 今回は晴れた環境でこの方法で算出した値が1206mとなったので、この値を使うことに。

スクリーンショット 2020-09-09 10.27.17

 最後に念の為、写真と同じ距離にオブジェクトを置き、Fogの影響を調べてみた。よく見ると、真ん中あたりは実写の方がやや暗めになっているが、概ね近い結果にはなっている。

 大下氏によると、この試みは半分自由研究のようなものなので、参考にならないかもしれないと補足した上で、こうした試みができるのも、単位や距離が実物と揃えやすいHDRPならではの方法だと語った。

HDRPのFog設定実演(霧)

 次に霧の設定を実演。今回は効果をわかりやすくするために濃霧を想定し、夕方の日差しが差し込む霧の風景を作ってみる。

スクリーンショット 2020-09-09 10.35.13

 濃霧ということで、拡散距離(Fog Attenuation Distance)は100m以下の60mとした。
 次に、霧の中の光の散乱と吸収を再現するため、Volumetric Fog を有効にする。

スクリーンショット 2020-09-09 10.36.50

 これだけで、太陽から光の筋が見える「チンダル現象」が再現される。チンダル現象を起こすにはいくつかコツがある。
 一つは、光源が逆光で、角度がやや浅い角度になっていること。もう一つは、霧が下から上に向かって薄くなり、高い位置では光を通し、低い位置では多く散乱する状態になっていること

 Volumetric Fog を使った光の透過・散乱は美しく、印象的な風景となるため、ここぞという場面でぜひ使ってみてほしいとのこと。

 ここまでのFogはシーン全体にかかるものだったが、HDRPではもっとリアルに、体積と密度を持った霧を作ることもできる

スクリーンショット 2020-09-09 10.44.36

 まずはさきほどと同じように、GlobalなFogの設定を行う。今回はGlobalのFogはあまり主張しないような設定にしておく。Volumetric Fog を有効にすることも忘れずに。

 次にHierarchyからもう一つ別のVolumeを作成する。さきほどまでのVolumeに設定することもできるが、このように分けて作ったり、複数の霧を配置することもできる

スクリーンショット 2020-09-09 10.48.05

 作成したVolumeには Density Volume コンポーネントを追加する。Density Volume には、Size(体積)を設定することができる。

画像62

 これだけでも、範囲の中が霧で満たされた様子が確認できるが、霧のない場所との境界がハッキリしすぎていて不自然。

スクリーンショット 2020-09-09 10.57.32

 これに対しては、Blend Distance の値を調整することで、境界を曖昧にすることができる。また、霧が濃すぎても境界がハッキリしすぎるため、Fog Distance で拡散距離を調整することで、より自然な見栄えに仕上げることができる。
 これで、霧の外から存在が確認できて、中にはいるとキチンと光の散乱が発生する霧が設定できた。

スクリーンショット 2020-09-09 11.00.11

 さらに、3Dテクスチャを使うことで霧の濃さに空間的な粗密を作ることもできる。また、これをスクロールさせることでより動きのあるリッチな霧の表現が可能。
 ただし、通常の霧の場合、あまり速いスピードでのスクロールは非推奨。現実の霧はどちらかというと、空気の停滞した場所で発生するため。一方で、高地や山の中腹などでは比較的速い風に流される霧も確認できるので、これも実際の風景をよく観察することが大事

まとめ

 現実世界でのライト・カメラ・霧の知識を元に、Unityに反映させる方法を紹介した。Unityでの設定はあっという間で、どちらかというとその設定がどういうものか、現実世界での背景を知ることが重要であることがおわかり頂けたと思う。

 このHDRPの物理ベースというコンセプトはかなり大胆なものだが、アーティストにとって、とても良いものとなっているはずだ。仮に綺麗なグラフィックを作るためのノウハウが、特定のツールやCGに限定したものであるならば、それはやがて必ず陳腐化してしまう
 しかし今回のような現実ベースの話の場合、これは普遍的な知識なので、ツールや環境が変わっても失われない、アーティストにとっての財産になりえると考えている。

 例えば、手書きでイラストを書く場合であっても、今回得た知識は無駄にはならない。こういう知識がエンジンでのアウトプットにまで活かせるというところがHDRPの良いところだと自負していると大下氏は語る。ぜひ、アーティストの方にこそ触ってほしい機能であると添えて、本セッションは締めくくられた。

いいなと思ったら応援しよう!