見出し画像

Bakeryで至近距離のオブジェクトの綺麗な落ち影を出す方法について

はじめに

私のワールド制作が佳境に入りつつあるので、今月のワールド製作者向け記事は簡単に、制作中に発見したTipsについて書きたいと思います。
内容はタイトル通りです。

素早く結論だけ

ライトマップの解像度をキチンと確保しつつ、Bakeryのライト系コンポーネントのパラメータにあるShadow Spreadを0~1の間で細かく調整しながら焼く。
(ただしShadow Spreadにはむらがあり、この値が良いという厳密な値はなさそうので、試行錯誤が必要)

調べようと思った理由


ワールド制作初心者交流会で、『鳥かごのようなオブジェクトの中にライトを入れて、ベイクすると、リアルタイムライトと違って影が綺麗に出ない』という話を受けて、自分でやってみたところ、確かに全然影が焼けませんでした。

最初は、BakeryはUnity標準のライトベイクシステムと比較して、反射光の計算を丁寧にやっている印象があるので、そのためかなと思っていたのですが、それに関連するパラメータをいじっても全く改善しませんでした。

そこで片っ端から試してったところShadow Spreadの値が関係していることが分かったので色々検証してみました。

Shadow Spreadとベイク結果について


Shadow Spreadの説明を見ると、影のぼかし具合のように見受けられます。入力は0~1の間で、0が全くぼけていない状態、1が最大のぼけ具合になるようです。

Shadow spread: size of the light source or, simply put, shadow blurriness. 0 = max sharp shadows, 1 = max blurred shadows. Technically it interpolates from a single ray to a wider cone of rays.
(影の広がり:光源の大きさ、簡単に言うと影のぼやけ具合です。0 = シャープなシャドウ、1 = ぼやけたシャドウを最大にします。技術的には、1本の光線からより広い円錐形の光線に補間するものです)

BakeryのマニュアルとDeepLによる日本語訳

このパラメータは初期状態で0.01という凄く小さい値なのですが、0にすると全くぼかされていないくっきりとした影が出てきました。逆に言うと0,01という凄く小さい値でも効果が出てしまうパラメータのようです。
(素朴に上記の説明から考えると、光の影響を受けるオブジェクトが至近距離すぎる場合に、ぼかしのパラメータが効きすぎることは十分あり得そうだなと思います)

そしてかなり面倒なのですが、実験した限りではShadow Spreadの値はこれ!というような理想的な数値が無いパラメータのようです。

試しに0.25刻みでベイクした影の画像を以下に示します。

ShadowSpread = 0
ShadowSpread = 0.25
ShadowSpread = 0.50
ShadowSpread = 0.75
ShadowSpread = 1

見ていただければ分かる通り数値を上げれば上げるほどボケるという感じではないです。

今回焼いた中で一番好みな焼き具合だった時のShadow Spreadは0.05、0.25/0.50/0.75/1.00のいずれよりもボケてる感じがあります。謎ですね。

ShadowSpread = 0.05

つまるところ、Shadow Spreadのぼかし具合はかなりむらがありそうです。
そのため良い感じの影を出すためには試行錯誤が必要になってきそうです。

前提条件となるライトマップ解像度について

綺麗な影を出すためには、影を受けるオブジェクトのライトマップ解像度が適切である必要があります。

以下はライトマップ解像度を徐々に高くしていった様子です。

Scale in Lightmap = 1、Lightmap解像度 16×16
Scale in Lightmap = 20、Lightmap解像度64×64
Scale in Lightmap = 100、Lightmap解像度128×128

御覧になってもらった通り、影を綺麗に出したい場合はライトマップの解像度が重要になってきます。

ライトマップの解像度を変える方法は2つあります。

一つはBakeryの設定の中にあるTexels per unitの数値を大きくすることです。これは全てのオブジェクトのライトマップ解像度を上げます。

当然ながらあまりライトマップ解像度が必要ないオブジェクトも解像度があがってしまうため、私は少しでも容量を控えたい派なのでかなり控えめな値にすることが大半です。

もう一つはMeshRendererコンポーネントのLightingタブの中にあるScale in Lightmapをいじることです。こちらはオブジェクトごとに解像度をいじれるため、私は基本的にこちらで調整をかけます。

ただしこちらの設定方法でScale in Lightmapの値をいじっていると、このような警告らしき文章が出てきます。

object size in lightmap has reached the max atlas size.
直訳すると『ライトマップのオブジェクトサイズが最大のアトラスサイズに到達しました』ということですが、大半の人は多分さっぱり意味が分からないと思います。

これについてのきちんとしたUnityのリファレンスが見つからないので、私なりの理解にはなってしまいますが、簡単に説明します。

まず画像を敷き詰めて1枚の画像にすることを「アトラス化」と言います。
(おそらくCG特有の言葉だと思われます)

それを踏まえて、上記の文章を読み解くと、ようは
「このオブジェクトのライトマップ解像度が、敷き詰める時の最大サイズに到達しているよ」
ということだと読み取れます(かなりざっくりとした説明ですが)

1枚のライトマップは、沢山あるオブジェクトのライトベイクの画像を敷き詰めて作ってあります。つまりライトマップ自体がアトラス化された画像とも言えるでしょう。

そして、どうやら画像を敷き詰めるにあたって、敷き詰められるサイズの最大が決まっているようです。

具体的な数値についてのリファレンスは探し出せなかったので、実験ベースで探り当ててみましたが、解像度1024×1024の場合は128×128、つまり(解像度)×1/64が最大アトラスサイズに当たりそうです。

つまり上記の文章が出ている時、もうScale in Lightmapの値をそれ以上増やしても、そのオブジェクトのライトマップ解像度は上がりませんので、それ以上品質が良くなることはありません。

では、この最大アトラスサイズを増やすにはどうするかというと、Bakeryを触っている人には凄く罠な感じがしますが、Unityの標準ライトベイクシステムのパラメータをいじる必要があるようです。

Unityの標準ライトベイクシステムのLightmap Resolutionを上げることで、最大アトラスサイズを上げることが出来ます。

解像度が1024×1024の時と同じ法則性だと仮定すると、4096×4096の時の最大アトラスサイズは512×512です。
これくらいになるとだいぶまともな解像度な感じがしますね。上げることで警告文も消失します。

一方、Bakery側でこの最大アトラスサイズを無視するように焼くことも出来そうです。
私が把握している限りだとやり方は二つで
・Min Resolutionを最大アトラスサイズ以上にする。
・Bakery Lightmap Groupを利用して、解像度を指定する
などをすると、無視して焼いている挙動が見れました。

ただ、もし意図的にライトマップ解像度を確保したいなどの動機であれば、Bakery Lightmap Groupの利用をお勧めします。

余談ではありますが、ライトマップに割り当てられているオブジェクトごとのライトマップ解像度は、オブジェクトの大きさで決まっていそうです。
Scale in Lightmapを大きめに設定した上で、オブジェクトのスケールを大きくすると、上記の警告文が出てくることが確認できます。

逆に考えると、Terrainのような巨大なオブジェクトに対してベイクするときは、容易に最大アトラスサイズに引っかかってしまうので、注意が必要とも言えます。

おわりに

以上、簡単にではありますがBakeryで綺麗な落ち影を出す方法についてでした。

デフォルト設定だと影が出てこないので、至近距離の影の計算を無視してるのかと疑いもしましたが、無事に出す方法が分かってよかったです。

ワールドに良い影が落ちてると嬉しいので、皆さんの役に立つといいなーと思いながら文章を締めたいと思います。

読了お疲れさまでした。



この記事が気に入ったらサポートをしてみませんか?