HOME

Maneki Pipeline

ゲーム開発のためのプロシージャル

Cop/ Bake Geometry Texturesでcustom attributeを使って頂点カラーなどをベイクする

Bake Geometry Textures Copernicus Nodeで頂点カラーなどのアトリビュートを出力するための方法

COP用テクスチャベイカーについて

Houdini21で新しく追加されたCop用テクスチャベイカー。
非常に高速に法線や曲率、AOといったジオメトリに関する情報のテクスチャ化ができる。

ただし、ジオメトリを入力しただけでは頂点カラーをベイクができないので例えば以下のようなことを行いたい場合カスタムアトリビュートを利用する必要がある。

  • プロシージャルモデリングし、BaseColor用の色などを頂点カラーアトリビュートして持っているジオメトリのテクスチャを作成したい
  • 入力メッシュをローディテールモデルに加工しUVの配置しなおしなどを行った後に新しいテクスチャを作成したい
  • 苔の範囲を制御する、といった独自のマスクテクスチャをMaskアトリビュートなどから作成したい

今回は上記2つ目の項目のような、「元のテクスチャからUVを再生成したメッシュに合わせたテクスチャの焼き直し」を題材に、アトリビュートのテクスチャベイクを行う。

テストデータの作成

サンプルデータとしてMeshyAIから出力したモデルとテクスチャを利用する。
出力されるデータは30万~100万程度のポリゴン数(今回のサンプルは72万ポリゴン)とBasecolor、Metalness、Roughness、Normalテクスチャを持つ。

MeshyAIで作成したモデル。スキャンモデルのようなポリゴンで、Basecolor、Metalness、Roughness、Normalマップを持つ

今回はこのジオメトリの新しいUV位置に合わせたBaseColor、Metalness、Roughnessを作成する。
ベイク対象となるローモデルとして VDB From Polygon、Convert VDBを接続後にQuad RemeshでTarget Quad で1000ポリゴンまで削減。
(VDB経由だと穴をふさげるのと、個人的な印象としてQuadRemesh時の破綻も少ない気がしています)

QuadRemeshでリダクションしたローモデル(QuadRemeshはUVなどのアトリビュートが無くなる)

polyframeでNとtangentNを作成し、AutoUVでUVを作成して準備完了。

今回作成したローモデルはVDBやQuadRemeshでのリメッシュ、UVの再割り当てなど行ったので元のテクスチャに対応したUVではなくなっている

リメッシュし、新しくUVを作成したメッシュという想定でこのメッシュにリメッシュ前と同様のテクスチャをベイクしていく。

元メッシュのセットアップ

テクスチャの色をアトリビュートとして持たせてベイクを行うための準備として、元のジオメトリにUVで参照した頂点に該当するテクスチャ色を頂点カラーとして持たせていく。
Subdiveを接続し分割数を増やせるようにしてAttribFromMapを4つ接続し、元のBaseColor、Metalness、Roughness、NormalをそれぞれCd_BC、Cd_MT、Cd_RH、Cd_NMとしてアトリビュートを作成する。

テクスチャから頂点カラーを作成

この時、後工程でCOPに読み込む際にモノクロになるアトリビュートはAttribute From Mapでアトリビュート化する際にFloatにしておく必要がある

Roughness、Metalnessは後工程でモノクロで読み込むのでFloatアトリビュートとして取得しておく

頂点カラーとして持たせるので焼きこみ先のテクスチャ解像度を高くする必要がある場合はsubdivideで分割数を増やして調整する。

COPでのベイク

作成したCd_BC、Cd_MT、Cd_RH、Cd_NMの4つのアトリビュートをテクスチャにベイクしていく。
通常のベイク同様、ベイク対象となるローポリモデルと4種のテクスチャを頂点カラーとして持たせたハイポリメッシュをCOPにSOP Importで読み込み、Bake Geometry Texture Bakeを接続。

COPに移動しLowModel、HighModelを接続

接続するとNormal Mapは作成できるがそのままでは頂点カラーなどはテクスチャ化できない。
特定のアトリビュートをテクスチャとしてベイクするためにBake Geometry Textureのカスタムアトリビュート項目を追加する。

作成したアトリビュートを読み込むためのカスタムアトリビュート項目を作成

カスタムアトリビュートがケーブルとして出力されるので Cable Unpackを作成し各チャンネルに分解するとベイクされた各アトリビュートが利用できるようになる。

customとして設定したアトリビュートはケーブルとして出力される

また、packする際に各チャンネルの接続名を指定することができるのでCable Packを作成して再度packし、かつ各接続の名称をCop Previewの接続に該当した名称に設定することで、ベイク結果をケーブル接続用のパラメータとしても利用することができるようになる。

packする際にCOP Previewの接続に該当する名称に設定すればケーブル接続で紐づけることができる

※ケーブル回りの扱いは少し癖があります。
 以下の記事でまとめているのでよければ参考にしてください。

今回のようにカスタムアトリビュートを使ったベイクを利用すれば、例えば「苔や草などが生える範囲をシェーダーに設定するためのマップ」「マテリアルブレンドのためのマップ」といった独自マップのベイクも容易にできるようになる。

Mask By Featureなどでmaskアトリビュートを作成し、テクスチャから取得したBaseColorなどと一緒に元のハイポリモデルにアトリビュートとして持たせる
maskなどもベイクできる

Bake Geometry Texture/ カスタムアトリビュートの不具合のような挙動について

Bake Geometry Textureで頂点カラーなどをベイクした際、UVの境界を隣接色で補正したい場合にUV Bounding Fillingを有効にすると境界を隣接色で塗りつぶしてくれるのだが、

UV Bounding Fillingを有効にするとUV境界を隣接色で塗りつぶしてくれる

カスタムでベイクしたアトリビュートが一つだけだった場合、上述のようにパックされた地震で設定したチャンネルの出力ではなく「custom」という名称の出力が作成される。
そしてこの単一のカスタムアトリビュートのベイクでは正常にUV Bounding Fillingが動作しない。

単一のカスタムアトリビュート出力でベイクすると UV Bounding Fillingが正常に動作しない

対策としてはベイクしたいアトリビュートを二つカスタムアトリビュートとして出力するとパックされたケーブル出力となり、UV Bounding Fillingも動作するようになる。

力技ではあるが同じアトリビュートを2出力にするなどしてpackしたケーブルに出力にするとUV Bounding Fillingが反映される

Houdini21で追加されたCOP用のベイカーですがカスタムアトリビュートのベイク機能が非常に素晴らしいです。

過去にKarmaで工夫して同様の挑戦などしてみたこともあったのですが、(https://www.procedural.jp/articles/cetd194trb8/
COPで追加されたベイカーに「現状、僕が考えられる欲しかった機能」がすべて含まれているのでこちらを多用していくことになると思います。

fish_ball

プロシージャル魚類