当ブログのリンクにはプロモーションを含む場合がありますのでご了承下さい (Please note that links on this blog may contain promotional offers)

COPでベイクしてサブスタンスライクにPBRテクスチャつくる

この記事は、Houdini Apprentice Advent Calendar 2025 シリーズ2の25日目の記事です。

Houdini Apprentice Advent Calendar 2025
https://qiita.com/advent-calendar/2025/happrentice


CGJ初めてのアドカレ参加です!
今回はHoudiniのCopernicusを使ってモデルからベイクしたテクスチャを使い、
サブスタンスライクにPBRテクスチャを作る方法をやってみます。

アドカレってなに?

元はクリスマスまでの日数をカウントダウンするために使われていたカレンダーでの。
インターネット上で決まったテーマに従って参加者が持ち回りで記事を投稿する企画ぢゃ。

Houdiniをテーマにしたアドカレってことですね!
25日目って最後じゃん!メリークリスマス!
…我々で大丈夫ですか?

Apprentice版のシリーズ2ですから…
ハードル低くいきましょー!

使用したモデル・テクスチャ素材

今回は、Poly Haven、cgbookcaseからモデルとテクスチャをダウンロードして使用させていただきました

3Dモデル

https://www.cgbookcase.com/textures/old-iron-01

木材テクスチャ

https://www.cgbookcase.com/textures/wood-02

金属テクスチャ

https://www.cgbookcase.com/textures/old-iron-01

ベイクするためのモデル設定

今回ダウンロードしたモデルは1万ポリゴンぐらいです。
ハイモデルは無いので、これをLowモデルとして使っていきます。

nameアトリビュートが入っていますが、金属部分と木材部分にうまく分かれてなかったので
自分でグループをironとwoodに分けています。

木材・金属に分けるためのID設定

CopernicusのIDは、Integer型で0, 1, 2, 3…と分かれたPrimitiveアトリビュートが必要なようです。
その為、グループからnameアトリビュートにして、Enumerateでidというアトリビュートを作っています。

これをIDとしてCopernicusで木材、金属部分のマスクを取れるようにします。

idですが、Enumerateは0始まりで割り振られるのですが、0だとUV境界外がCopernicusで割り当てられるようなので1から始まるようにVEXでずらしています。

ハイモデルの作成

ハイモデルは無かったので簡単にSubdivideで再分割してる程度です。

AO・Curvatureの作成

今回はハイモデルでCurvatureとAOをアトリビュートに付けています。

Measureノードでcurvatureを計算し、Curvatureという名前のポイントアトリビュートを作成。

Mask by FeatureノードでAOを計算し、aoという名前のポイントアトリビュートを作成。

関係ないですけど、Copernicusって名前格好いいですね

地動説を提唱した天文学者の名前かな?

CopernicusはHoudiniにおける 画像処理・コンポジット・データ処理の新フレームワークじゃからな。
👉 地動説 = 世界観の反転
👉 Copernicus = Houdiniにおける画像処理のパラダイムシフト
という意味かの。

おおおおおおおおおお!

ふふふ (…AIが言うておったぞぃ)

COP Netの作成

COP Networkノードを作成。ダウンロードしたテクスチャ素材は2Kなので、解像度は2Kとしています。

今回作成したネットワークの全体像です。

ベイクの設定

まず、bakesetupを作ると、モデルからのベイクに必要なノードをセットで作成してくれます。
Cageモデルは使わないのでCage用のSOP Importは削除。
SOPで作成しておいた、Lowモデル、Highモデルを指定します。

ベイクはノーマルマップと、Custom Attributesからid, curvature, aoの3種類をベイクしています。

ベイクしたテクスチャは分かりやすくNullを挟んでいます。
CustomアトリビュートはCableになっているので、CableUnpackで分解する必要があります。

Cableになっているデータを取り出しても、ノードのプレビューが一番初めの要素になってしまうんですよね…だれか…

Composite ViewのプレビューではちゃんとCurvatureが確認できます。

IDからマスクを抽出

ID to MaskノードでID番号を入れるとマスクを抽出できます。
これで金属・木材のマスクを得ることが出来ます。

ダウンロードしたPBRテクスチャの読み込み

木材・金属のPBRテクスチャセットを読み込みます。
サブネットワークにしておき、OutputはBaseColor, Normal, Roughness, Metalnessの4つを作成しています。

木材の方は以下のようになっています。
Fileノードでテクスチャを読み込み、タイリング数を変更できるようにTransform2Dノードを挟んでいます。Metalnessは無いのでConstantノードで黒を出力。

金属の方はこちらです。

この2つのマテリアルを、金属マスクを使ってBlendノードで合成します。

Curvatureマスクを使い、HSV Adjustノードで明るくした木材をScreenで合成して角が削れた感じを出しています。(画像1番)
また、ベイクしたノーマルマップをCombine Normalsノードで合成。(画像2番)

そしてベイクしたAOをMultiplyで合成してBaseColorは完成です。

メタルネスは金属テクスチャを金属IDマスクにMultiply合成しただけになります。

最後にPreview Materialノードへ完成したBaseColor, Normal, Roughness, Metalnessを接続し、
geo入力へLowモデルのSOP Importをつなげれば完成です!

ベイクしたテクスチャ群をマスクとして使って合成する感じが
サブスタンスと同じですね!

そう、同じノリで作れます!
モデルをSOPで自由に加工してカスタムアトリビュートから色んな要素をベイク出来るところが柔軟性が高くてHoudiniらしいフローですね!

いやぁこれは勉強していきたい

みんなで勉強していきましょー!
記事を読んでいただきありがとうございましたー!