Unityで使うライトクッキーをBlenderで作成してみました。
メッシュとライトを用意
まずBlenderでランタンのモデルを開きました。
中心にポイントライトを置きます。
ランタンの光源の部分にライトが来るように、ランタンを移動しました。
ライトと同じ位置にCubeを追加しました。
Cubeを選択して編集モードですべての面を選択し、Alt + N でメニューを開いて「Flip」をクリックします。
これですべての面が内側を向きます。このCubeにライトをベイクします。
CubeをUV展開
ランタンの正面を決めて、その方向のCubeの面を+Zとしました。
Unityマニュアルのキューブマップのページにキューブマップのレイアウトが書かれています。
この通りにCubeにシームを付けてUnwrapしました。
UVを編集
UVを回転させてまっすぐの向きにしました。
Cubeにマテリアルを付けて、Image Textureノードを作り、新しい画像を設定します。
一つの面が256*256だとして、縦を4倍の1024、横は3倍の768にしました。
UVエディタでこの画像を開くと、UVが上に細長く表示されました。
そこで、UVを全選択して、X方向に1.333333…倍しました。
UV > Pack IslandsでUVを画像いっぱいに表示します。
Rotateのチェックを外して、マージンを0にしました。
1024*1024など正方形にベイクして、GIMPなどで画像のサイズを変えることもできます。GIMPで開いて、画像 > キャンバスサイズの変更… をクリックします。
画像に合わせて片方を3/4倍して「リサイズ」をクリックするとサイズが変更できます。オフセットで位置を調節できます。
Cubeを球状にする
Cubeに「Subdivision Surface」モディファイアを付けて、球状にしました。
右クリックから「Shade Smooth」も適用しています。
Unityマニュアルのエキスパートガイドでも、Cubeを球にしてベイクしていました。立方体にベイクすると、ライトクッキーに四角い筋ができます。
ライトが通過する部分を調整
レンダープレビューにすると画面が真っ暗になります。ランタンのガラス部分でライトが遮られています。
この部分を削除しても良いですが、ラフネスマップなどからColor Rampを通してアルファに接続すると汚れを活かせます。
マテリアルのプロパティでBlend Modeを「Alpha Hashed」にしました。
ライトの設定
適当にライトを明るくしました。また、影が明るくなるのでMax Bouncesを0にしました。
Radiusが0だと影の輪郭がくっきりします。光源に合わせて少し上げました。
くっきりした影をベイクして、画像編集ソフトなどで後からぼかしをかけるとシームができるようです。
ベイクする
オブジェクトモードでCubeを選択して、ShaderエディタでImage Textureノードを選択します。
Bake Typeを「Diffuse」にして「Color」のチェックを外しベイクします。
ライトクッキーを設定
ベイクした画像を保存し、Unityでインポートします。インポート設定で、Texture Shapeを「Cube」にしてApplyを押します。
ランタンに置いたライトの「Cookie」にこれをアタッチします。
これでライトクッキーが設定されました。
ライトクッキーがあると、ランタンのガラス以外の部分にライトがあたらなくなるので、次はこの部分を発光させてみます。
線
この方法だとライトクッキーに線ができてしまいます。これは画像と画像の間ではなく中央にあります。
真っ白い画像でCubeマップを作っても、線が入ります。
Blenderのカメラで「Latitude-Longitude Layout」「Mirrored Ball」用にレンダリングしてみましたが、同じように線ができました。
プロジェクト設定の、HDRP > Lighting > Cookies > 2D Atlas Size を上げると少し目立たなくなります。
ライトの向き
ライトクッキーの正面(+Z)と思っていた部分が、ライトの左側に来ていました。
ライトのZ方向には、ライトクッキーの右(+X)があります。なので、ライトを-90度回転させました。
画像を横一列に並ばせた場合はライトを180度回転させる必要があるようです。