ライティングを頂点にベイクする方法


こんにちは、篠島です。今回はライティングを頂点にベイクする方法を紹介したいと思います。

 

今回のサンプルファイルです。
bake_lighting.zip

 

ライティング情報を頂点にベイクする方法として、一旦ライティングをテクスチャファイルにベイクし、そのテクスチャから色情報を頂点に転送するという流れになります。大まかな流れを説明すると以下のようになります。各項目で注意すべき点が幾つかあるので細かく説明していきたいと思います。

  1. ベイクするジオメトリの準備(UV展開等)
  2. シーンをライティングする
  3. ジオメトリにベイク用のマテリアルを割り当てる
  4. Bake Texture ROPでライティング情報をUV空間でレンダリング
  5. 出来上がったテクスチャをAttribute from Map SOPで読み込む

 

ベイクするジオメトリの準備

ライティングをテクスチャにベイクするにはUVを用意する必要があります。複数のジオメトリをまとめて一つのテクスチャにライティング情報をベイクすることも出来ます。

  1. 複数のジオメトリがある場合それぞれを UV Unwrap SOP 等でUV展開します。
  2. それらのジオメトリをMergeして、UV Layout SOP でそれぞれのジオメトリの UV の位置を並べ替えます。これでベイクする際に2つのジオメトリが一つのテクスチャに書き込まれます。


    UV Layout SOP の設定で、Padding を増やし、Apply Padding to Tile Boundaries をオンにすることで、UVアイランドごとに若干隙間を作り、端にも若干の隙間を作っています。これは後のレンダリングのプロセスで色をブリーディングする時に役立ちます。

 

 

シーンをライティングする

サンプルシーンでは以下の様に色の異なるライトを3つ配置しています。

 

 

ジオメトリにベイク用のマテリアルを割り当てる

ライティング情報は実際にレンダリングする事によってライティング計算をしているので、マテリアルが必要です。理想的なマテリアルはDiffuseが100%で鏡面反射や屈折の無いマテリアルです。それを Principal Shader で行うと以下のような設定になります。

  • Base Color を 1,1,1 にする。
  • IOR を 1 にする。
  • Roughness を 1 にする。
  • Reflectivity を 0 にする。

 

Bake Texture ROPでライティング情報をUV空間でレンダリング

Bake Texture でライティングをベイクしていきます。

  1. UV Object 1 パラメーターでUV展開したオブジェクトを指定します。
  2. Bake Texture ROP内のImages > Mainタブ から、Extra Image Planes を追加し、VEX Variable に Cf を指定し、Channel Name に任意の名前 color 等を入力、Light Exports を Merge all lights into single channel にします。
  3. Baking タブから Disable Lighting/Emission をオフにします。これによりライティング情報がテクスチャにベイクされるようになります。
  4. Unwrapping タブから、Unwrap Method を Trace Closest Surface にします。この設定にするとジオメトリ形状が複雑でもベイクの結果がよくなるそうです。UDIM Post Process を Border Expansionにし、Additional Pixels at Border を2にします。
  5. 設定が出来たらRender to Disk を押してレンダリングします。

 

Border Expansion をしたことにより、UVの境界から色がブリーディングしているのが分かります。

 

 

出来上がったテクスチャをAttribute from Map SOPで読み込む

Attribute from MAP SOP はテクスチャの色を対応するポイントに転送するノードですが、注意しなければならない事があります。ポイントを一つ選択していても、実は頂点は複数あり、UVアイランドのエッジの部分等、頂点が離れている部分のテクスチャから色情報を持ってくる時におかしくなってしまいます。

 

ではどうしたら良いのかと言うと、下図の様にこのUVの境界の部分のポイントを分割します。

 

下のGIFは分かりやすいように UVのエッジで分割したメッシュのポイントを選択したものです。一つのポイントに対して、UV空間で頂点の位置が一つになっているのが分かるかと思います。

 

上の事を踏まえたネットワークが下図のようになります。

  1. まずはベイクする時に使ったジオメトリをObject Merge SOPで持ってきます。
  2. Vertex Split SOP で上で説明したUVアイランドごとにメッシュを分けてポイントを分割します。Attribute に uv を指定し、Promote to Point Attribute をオンにします。
    見た目ではわかりませんが、Exploded View で確認すると、UVアイランド毎にメッシュが切り離されたのが確認できます。
  3. Attribute from Map SOP でテクスチャからライティング情報をポイントアトリビュートとして読み込みます。Texture Map の所でベイクしたテクスチャファイルを読み込んでください。
  4. ポイントにCdアトリビュートが出来ましたが、欲しいのは頂点アトリビュートなので、Attribute Promote SOP で Cd アトリビュートを頂点に移動します。
  5. 今のジオメトリは Vertex Split によってUVアイランド毎に切り離されていますが、頂点アトリビュートは正しく設定されました。ここで、Attribute Transfer SOP でこのアトリビュートから元のジオメトリの頂点に Cd アトリビュートを転送します。

 

ビューポートでの確認

ライティング情報を頂点にCdアトリビュートとして持たせることができたら、ビューポート上でライティングを無効にすることで、ジオメトリが持つ頂点カラーを確認することが出来ます。ビューポート右側にある Disable Lighting ボタンを押すことでシーン内にあるライトをビューポートに反映させないようにします。これで頂点カラーの色を確認することが出来ました。