この前Blenderのジオメトリーノードでプロシージャルなテクスチャを作成し、ミャクミャクっぽいアニメーションを作ったんですが、あれをテクスチャにベイクしてUnityまで持っていけるのか。やってみました。
プロシージャルにテクスチャを作れたのはいいとして、他の3DCGソフトに持っていくには、イメージテクスチャにしないと互換性がないので持っていけません。ジオメトリーノードはBlenderの機能なので、そこで作成されたデータをそのまま他のソフトには持っていけないんですね。なのでせっかく作った柄とかパターンとかテクスチャはベイクしてイメージテクスチャとして持っていかなければなりません。
ジオメトリーノードで作成したテクスチャをベイクするって結構わかりづらいというか、ジオメトリーノード特有のよくわからない現象などもありました。
この記事は、BlenderのGeometry nodeで作ったプロシージャルなテクスチャをベイクする方法を書いた中級者向けの記事です。
難易度
とにかくUV展開
テクスチャをベイクするときに、とにかくUVマップがないとベイクはできません。UVマップは立体を切り開いて、テクスチャをどう貼り付けるかの設計図みたいなものなので、これがないと、決まった場所に決まった柄を貼り付けるようなテクスチャは作れません。
なのでUV展開をしないといけないんですが、ジオメトリーノードで作った形のUV展開って自分も苦手というかあまりわかってないところがあります。なんで?と思いながら、とにかく出来た方法を書いていきます。
ジオメトリーノードで作ったオブジェクトのUV展開
この間作ったミャクミャクのオブジェクト、ノードなどを複製して作業します。アニメーションはできないので、アニメーションのノードを消して、ミャクミャク柄テクスチャが残るようにします。
右のUV Mapsの欄を見て頂ければわかるようにUV Mapは存在していません。(デフォルトのオブジェクトについてたUVMapはまぎらわしいので消しました)

ノードの最後にStore Named Attributeノードを追加し、UVマップをそこに保存します。
UV Mapを取得するノード

左図のようにノードを組んでいきます。
UVを作るためのUV Unwrapノードを使います。
名前をmyakumyaku_uvとしました
※間違えてUV UnwrapのSelectionにつなげちゃってますが、Seamにつなげてください。なんでこれでできたんだろう。
Store Named Attributeの設定…
データタイプ → 2D Vector
保存するドメイン → Face Corner
よく忘れます。UVマップは二次元マップをFace Cornerにはりつけていくので、この設定を間違えるとテクスチャがおかしくなったりします
UV UnwrapノードについてるEdge Angleなどのノードは、エッジの角度が何度以上のエッジをシームの線にしてそこでUVマップを開いていくっていう意味です。だからこれはSeamにつながないと本当に意味がないです。ただこういう間違いをしても今回は奇跡的にうまくいってしまいました。真似しないでください。(どういうマップができているのかについては、Set PositionノードのPositionにUVアウトプットをつなぐと見れます。ただいつも大体汚いUVマップができます。今回は球を並べただけだったのでわりと綺麗でした。)
ダメなやり方
他にもUVマップの値を取得する方法があるんですが、なぜかうまくいかない方法がありました。以下にのせておきます。

これはうまくいかなかった方法なんですけど、Group Outputにつなげて、UVをモディファイアのメニューのOutput AttributesにUVマップ名をつけて取得するやり方です。なぜかこっちはうまくいきませんでした。何かいいやり方があったのかもしれませんが、今後やる、ファイルをエクスポートするやり方だとうまくいかなかったですね。
ジオメトリーノードで組んだオブジェクトごとファイルエクスポート
できたUVを抽出する方法がよくわからなかったので、もう力技というか、ファイルをエクスポートして自動的にUVマップを取得します。

UVを取得するノードを組んだオブジェクトを選択し、File > Export します。
今回はFBXでエクスポートしましたが、OBJとかでもいけるらしいです。

一つのオブジェクトだけをエクスポートしたい場合はSelected Objectsにチェックをいれ、名前をつけてExport FBXします。
ファイルをインポートして戻します
こんどはそのファイルをインポートします。

さきほどのファイルをインポートするので、形式はさっきエクスポートしたファイルと揃えましょう。今回はFBXファイルです。

さきほどエクスポートしたmyakumyaku.fbxを選択してImport FBXをクリックしてインポートします。

インポートしたオブジェクト(Bとします)を見てみると、ジオメトリノードは適用されてなくなっていて、マテリアルはついてるんだけど崩れています。でもUV Mapsを見ると、myakumyaku_uvというUVマップがちゃんとついてるんですね。

UV Editingを開いてみると、このような感じでUVマップがちゃんとできていることが確認できます。
今回ファイルをエクスポートして無理やりUVマップを作製しましたが、ただたんにジオメトリーノードを適用して、UVマップを手動で作製するのでもいいと思います(後からノードをまた使うので複製してから作業してください)
テクスチャをベイクする
とりあえずUVマップはできたんですが、このインポートしたオブジェクト(B)では、ノードで組んでプロシージャルに作成したテクスチャの柄が消えてしまっているので、このマテリアルは使えません。
さっきのUV Unwrapノードを組んでUVを作ったノードを組んであるオブジェクト(Aとします)を選択し、そのノード内で作業します。このノードで生成した値を使ってマテリアルを作ってベイクしないといけないので。

今回は、もうUVはあるので、UVを作ったノードは消します。
そして、今までミャクミャクの身体(赤いボディの部分)をノードでつくってたんですが、その部分を消して、UVmapを持っている、さっきインポートしてきたオブジェクト(B)をeye_posの値を保存するGeometryとしてStore Named Attributeにつなぎます。(わからない方は以前の記事を参照してください)
ベイクの前に気を付けること
イメージテクスチャの解像度

そうしたらベイクできるんですけど、UVマップがやはりあまりいい形じゃないので、ものすごく解像度が荒くなってしまいました。

Image Textureで新規にイメージを作るときに解像度を上げたりした方がいいかもしれません。
UVマップ修正

目玉がない部分を小さくして、目玉がある球体のUVマップを拡大したり、ちょっと調整しました。
ベイクする
ベイクするときは


それから、レンダープロパティのBakeのメニューで、
Bake Type…Diffuseを選択(テクスチャの色をベイクする)
Contributions…光の影響なく色だけを焼きたいので、Color以外のチェックは外す
それからBakeを押すとベイクがスタートします。
Bakeできなかったときは下にエラーやできない理由が書いてあるので、それをヒントにして修正します
また、できたイメージテクスチャは必ず保存してください。Texture Paintエディタに入るとできたテクスチャを見ることができ、イメージを保存できます。

これで、あとはノードが組んでない、インポートしたただのオブジェクト(A)にそのテクスチャをつければ、イメージテクスチャで柄がついた一般的なオブジェクトとなります。
Unityにエクスポートしてみよう
せっかくなのでできたオブジェクトをUnityにエクスポートしてみます。

今度は、エクスポートするときにPath ModeをCopyにしてみました。こうすると、今回は一枚しかテクスチャないんですけど、複数テクスチャがある場合、テクスチャをファイルにまとめてくれて、自動でそのマテリアルをUnity内でひもづけてくれるのでとても楽です。

エクスポートして出来たファイルは
- myakumyakuunity.fbx(オブジェクトのデータ)
- myakumyakuunity.fbm(テクスチャが入っている)
これらは同階層においておくべきらしいので、適当にAssets内にドラッグ&ドロップして、Sceneに追加しました。
Unityでもちゃんと表示できています。