こちらの問題について、動作検証と対策を追記しました。
2021/8/6_追記: UnityにImportすると見た目が崩れてしまう
VRChat用のアバターを用意するにあたって
テクスチャをベイクする必要があったので、その方法をまとめてみました。
Blender内で使用する分には、
マテリアルごとに別々のテクスチャ画像を作成しても問題ありませんが
VRChatへアップロードするにあたって、
1枚のテクスチャ画像に統合する必要があります。
VRChat用アバターの自作については
VRChat 日本wiki に制作の概要が紹介されていますので
こちらも参考にしてみてください。
今回はこのモデルのテクスチャを実際にベイクしていきます。
結論
ベイクするまでの手順とベイク後のテクスチャ画像です。
- ベイク用のUVMAPを作成する
- 新しいテクスチャ画像(2048x2048px)を作成
- ベイク用にUV展開する
- Shaderエディターで、テクスチャ画像として読み込む
- 読み込んだテクスチャ画像を選択状態にしておく
- デフォルトのUVMapをプレビュー状態する
- Bake用のUVMapを選択状態にする
- ベイクのタブを開き、照明のタブをすべてOffにする
- ベイクボタンを押す
- 古いUVMapは削除する! <= 2021/8/6 追記
テクスチャをベイクすると、
このようにすべてのテクスチャ画像が一枚に集約されます。
目次
- 結論
- 環境
- マテリアルごとにオブジェクトを分割する
- ベイク用のUVMapを作成する
- 作成したUVMapにUV展開する
- テクスチャ画像として読み込む
- ベイクの設定をしてベイク!
- 2021/8/6_追記: UnityにImportすると見た目が崩れてしまう
- まとめ
環境
OS: Windows10
メモリ: 32GB
Dependents
Blender: v2.92.0
マテリアルごとにオブジェクトを分割する
作業を進めていくに当たって、
オブジェクトを結合している場合は、マテリアルごとにオブジェクトを分割しておくと作業を進めやすくなります。
オブジェクトの分割は、TabキーでEditモードに入り
Aでオブジェクトを全選択、Pで分割のメニューが開くので
By Material を選択します!
アウトライナーを確認してみると、オブジェクトが分割された事が分かります。
これで下準備は完了です!
では、テクスチャのベイク作業の準備を行っていきましょう。
ベイク用のUVMapを作成する
モデルにテクスチャを使用する時は
メッシュをUV展開していくと思います。
その時、UV展開された展開図を保存しておく場所を
UVMapと言います。
UVMapはオブジェクトデータプロパティから確認できます。
既にマテリアルごとにテクスチャが設定されている場合、
UVMapが1つあると思います。
これとは別に、ベイクする時のUVを保存しておくための
UVMapを作成していきます。
新しいUVMapを作成
UVMapsタブの右端にある
+ボタンから、新しくUVMapを作成できます。
作成すると、「UVMap.001」のような名前で作成されると思います。
作成したUVMapは分かりやすいように名前を変えておきましょう。
今回はBake_UVMapとしておきます。
作成したUVMapを選択状態にする
新規作成したUVMapを選択状態にしておきます。
右端にあるカメラマークのアイコンは、
UVMapをビューに適用するかどうかを切り替えるボタンです。
今は、選択状態にするだけでOKなので
カメラマークは押さなくて大丈夫です!
他のオブジェクトに対しても同じ操作を行いましょう。
作成したUVMapにUV展開する
さて、ここまでのステップで
分割したすべてのオブジェクトに対して、「Bake_UVMap」という
新しいUVMapを作成して、選択状態にできたと思います。
ここからは、一枚のテクスチャにすべてのUVを展開していきます。
新しいテクスチャ画像を追加する
まずはUV Editingタブに移動して、UV展開したいオブジェクトを選択し
TabキーからEditモードに入ります。
UV Editor(左側の画面)には、今まで使っていたテクスチャ画像と
選択しているオブジェクトの展開図が表示されているかと思います。
これから、UVを1枚の画像にまとめていくので
新しくテクスチャ画像を追加しておきましょう。
UV Editorの上側、紙が重なっているようなアイコンから新規作成できます。
画像のサイズは、今までよりも大き目にしておきましょう。
2k(2048 x 2048px)くらいが丁度良いです。
ファイル名: BakeTexture
Width: 2048px
Height: 2048px
Color: 黒(アルファを0に)
Alpha: チェック
Generated Type: Blank
32 bit Float: チェックなし
Tiled: チェックなし
アルファに関しては、あってもなくても大丈夫です。
個人的にベイク後に見やすいので、アルファを0に設定しています。
画像を作成したら、一度画像を保存しておきます。
imageから、Save as をクリックして画像を保存します。
すべてのUVを1枚の画像に展開する
それでは、順番にUV展開していきましょう!
UV Editorの方には、先ほど保存した画像が表示されている状態です。
ここに、すべてのオブジェクトのUVを整理して配置していきます!
顔のオブジェクトから展開してみます。
他のオブジェクトも配置することを考えて、小さめに配置していきます。
1つ目のオブジェクトの展開ができたら
Shift+クリックで次のオブジェクトを選択して整理、
という手順を踏んでいくと、やりやすいかと思います!
すべてのUV展開が完了すると、こんな感じになります。
テクスチャ画像として読み込む
UV展開が終わったら、保存した画像を
画像テクスチャとして各マテリアルに配置していきます。
UV展開した画像をイメージテクスチャとして読み込む
Shaderタブに移動します。
Shift+AからImageTextureを追加して、Openから先ほどの画像を読み込みましょう。
読み込んだ画像を選択状態にする
画像を読み込んだら、ImageTexutreを選択状態にしておきます。
選択状態にすると、ノードのフチが白くハイライトされるので、確認しておきましょう。
この段階では、ノードは繋がなくて大丈夫です!
選択状態にしておく理由ですが
ベイクを実行した際に、選択状態になっているImageTextureに
テクスチャの焼き付けが行われるためです。
これをしておかないと、正しくベイクされないので気をつけましょう。
他のマテリアルに対しても同じ手順で、ImageTextureを追加して
選択状態にしていきます。
ベイクの設定をしてベイク!
ここまでの手順で、ベイクするための手順はほぼ完了しました!
いよいよ、ベイクしていきます。
ここまでの手順で準備したもの
- ベイク用のUVMap
- ベイク用のテクスチャ画像
- ベイク用のImageTextureノード
- ImageTextureはテクスチャ画像を読み込んで選択状態にする
レンダーエンジンをCyclesに設定
ベイクするために、レンダーエンジンをCyclesに変更します。
レンダーエンジンは、レンダータブから変更できます。
BlenderのレンダーエンジンはEeveeがデフォルトですが
Eeveeではベイクができないため、Cyclesに変える必要があります。
今回はBlender 2.92.0 で試していますが、やはりEeveeではベイクが無いようでした。
ベイクタブのオプションを変更する
ベイクするためのオプションを設定していきます!
レンダープロパティの下の方に、
ベイクタブがあるので設定していきましょう。
今回はこのように設定しました。
ベイクの設定一覧
- Bake Type: Diffuse(ディフューズ)
- Influenceタブ
- Contributions:
- Direct(直接照明): チェック外す
- Indirect(間接照明): チェック外す
- Color: チェックする
- Contributions:
- Selected to Active: チェック外す
- Outputタブ
- Target: Image Textures
- Margin: 16px
- Clear Image: チェックする
今回は、バラバラになっているテクスチャを
1枚にまとめるためにベイクしますので、
Contributionsの所は、Colorのみチェックを入れています。
ベイクボタンを押す!
これでベイクするための手順がすべて整いました!
最後に、ベイクするオブジェクトをすべて選択し
ベイクボタンを押して実行しましょう!
ベイクボタンを押すと、画面の下に進捗状況が表示されます。
100%になるまで待ちましょう…
正しくベイクされているか確認
ベイクが完了したら、正しくベイクされているか確認していきましょう!
Bake_UVMapをプレビュー状態に変更します。
プレビューを切り替えると、表示が崩れてしまいますが
これは、元のテクスチャ画像に対して、
Bake_UVMapに配置した展開図が適用されているためです。
続いて、Shaderタブに移動して、
ベイクしたイメージテクスチャを接続します。
ノードを接続すると、ベイクしたテクスチャがメッシュに反映されるので
すべてのマテリアルでノードを接続して、
ベイクが正しく実行されているか確認してみましょう!
正しくベイクできていますね!
最後に、UV Editingタブに移動して
ベイクしたテクスチャ画像を保存しておきましょう!
これで、テクスチャのベイク作業は完了です、お疲れ様でした!
2021/8/6_追記: UnityにImportすると見た目が崩れてしまう
こちらの記事を参考に、テクスチャのベイク作業を行い
アバターをUnityにImportした所、古い方のUVMapが適用され見た目が崩れてしまう
というご連絡をいただきました。
今回、こちらを動作検証して対策を考えてみました。
古いUVMapは削除する
こちらの記事の通りにやっていくと、古いUVMapが残ったまま作業完了
となっていました(すみません)
なので、特に残す理由もないので古いUVMapについては削除してからUnityにImportしましょう。
残しておきたい場合はblendファイル自体を別名で保存するなどで
バックアップしておくことをおススメします。
UnityにImportしてしまった / 修正したくない
もうUnityにImportしてしまい、Blenderも終了してしまって
立ち上げなおしたくない、という方へ。
応急処置的な方法で、VRChatにアップロードするまでの動作確認はできていませんのでご了承ください。
UnityにImportしたFBXファイルをクリックした時に表示されるInspectorから
Geometryの項目の、Swap UVsという項目にチェックを入れることで見た目が治ります。
Swap UVsは、メインのUVMapと、ライトマップ用のUVMapを切り替えるという項目で
元々適用されていた古いUVMapから、ベイク用に作成した新しい方のUVMapを参照するようにしてくれます。
ただし、この方法はUVMapの数が2つの場合のみ有効です。
3つ以上UVMapがある場合には、治らないかもしれないので注意してください。
どうして古いUVMapが参照されるのか
UVMapを2つ持たせたFBXファイルをいくつか用意して動作検証をしてみました。
UVはそれぞれ、UV_MapA、UV_MapBとしてそれぞれをアクティブ状態にしてFBX形式で書き出しました。
アクティブは、カメラアイコンをクリックした状態で、
選択は、カメラアイコンはオフでUVMapを選択だけした状態です。
- UV_MapAがアクティブ状態で、UV_MapAを選択した状態
- UV_MapAがアクティブ状態で、UV_MapBを選択した状態
- UV_MapBがアクティブ状態で、UV_MapBを選択した状態
- UV_MapBがアクティブ状態で、UV_MapAを選択した状態
検証した結果
Blender、Unity共にFBXをImportした時には
UV_MapAがアクティブ状態でかつ選択されている状態になりました。
つまり、FBXをImportした時には
UVMapのリストで一番上にあるUVMapが参照されるようです。
まとめ
今回は、テクスチャをベイクする方法を紹介しました。
マテリアルの数が多い場合、設定していくのがちょっと大変ですが
ベイクすることで、読み込むテクスチャ画像の数が減り、
容量が軽くなりますので、できるだけベイクしておいた方が良いのかなと思います。
ベイクする時は、
焼き付け先のImageTextureノードを選択状態にしておくのを忘れないようにしてください!
もしベイクが上手くいかない場合は、
- ImageTextureノードが選択状態になっているか
- 元のUVMapがプレビュー状態になっているか
- ベイク用のUVMapが選択状態になっているか
このあたりを確認してみて下さい!