複数に分けたテクスチャを1枚に統合する方法

Blender

【Blender】複数に分けたテクスチャを1枚に統合(ベイク)する方法

こちらの問題について、動作検証と対策を追記しました。
2021/8/6_追記: UnityにImportすると見た目が崩れてしまう

VRChat用のアバターを用意するにあたって
テクスチャをベイクする必要があったので、その方法をまとめてみました。

Blender内で使用する分には、
マテリアルごとに別々のテクスチャ画像を作成しても問題ありませんが
VRChatへアップロードするにあたって、
1枚のテクスチャ画像に統合する必要があります。

VRChat用アバターの自作については
VRChat 日本wiki に制作の概要が紹介されていますので
こちらも参考にしてみてください。

今回はこのモデルのテクスチャを実際にベイクしていきます。

結論

ベイクするまでの手順とベイク後のテクスチャ画像です。

  1. ベイク用のUVMAPを作成する
  2. 新しいテクスチャ画像(2048x2048px)を作成
  3. ベイク用にUV展開する
  4. Shaderエディターで、テクスチャ画像として読み込む
  5. 読み込んだテクスチャ画像を選択状態にしておく
  6. デフォルトのUVMapをプレビュー状態する
  7. Bake用のUVMapを選択状態にする
  8. ベイクのタブを開き、照明のタブをすべてOffにする
  9. ベイクボタンを押す
  10. 古いUVMapは削除する! <= 2021/8/6 追記

テクスチャをベイクすると、
このようにすべてのテクスチャ画像が一枚に集約されます。

目次

  1. 結論
  2. 環境
  3. マテリアルごとにオブジェクトを分割する
  4. ベイク用のUVMapを作成する
    1. 新しいUVMapを作成
    2. 作成したUVMapを選択状態にする
  5. 作成したUVMapにUV展開する
    1. 新しいテクスチャ画像を追加する
    2. すべてのUVを1枚の画像に展開する
  6. テクスチャ画像として読み込む
    1. UV展開した画像をイメージテクスチャとして読み込む
    2. 読み込んだ画像を選択状態にする
  7. ベイクの設定をしてベイク!
    1. レンダーエンジンをCyclesに設定
    2. ベイクタブのオプションを変更する
    3. ベイクボタンを押す!
    4. 正しくベイクされているか確認
  8. 2021/8/6_追記: UnityにImportすると見た目が崩れてしまう
    1. 古いUVMapは削除する
    2. UnityにImportしてしまった / 修正したくない
    3. どうして古いUVMapが参照されるのか
  9. まとめ

環境

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モードに入ります。

UVEditingに移動しEditerモードになった状態

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から先ほどの画像を読み込みましょう。

ImageTextureを追加し、BakeTexture.pngを読み込む

読み込んだ画像を選択状態にする

画像を読み込んだら、ImageTexutreを選択状態にしておきます。
選択状態にすると、ノードのフチが白くハイライトされるので、確認しておきましょう。

この段階では、ノードは繋がなくて大丈夫です!

選択状態にしておく理由ですが
ベイクを実行した際に、選択状態になっているImageTexture
テクスチャの焼き付けが行われるためです。

これをしておかないと、正しくベイクされないので気をつけましょう
他のマテリアルに対しても同じ手順で、ImageTextureを追加して
選択状態にしていきます。

ベイクの設定をしてベイク!

ここまでの手順で、ベイクするための手順はほぼ完了しました!
いよいよ、ベイクしていきます。

ここまでの手順で準備したもの

  1. ベイク用のUVMap
  2. ベイク用のテクスチャ画像
  3. ベイク用のImageTextureノード
  4. ImageTextureはテクスチャ画像を読み込んで選択状態にする

レンダーエンジンをCyclesに設定

ベイクするために、レンダーエンジンをCyclesに変更します。
レンダーエンジンは、レンダータブから変更できます。

BlenderのレンダーエンジンはEeveeがデフォルトですが
Eeveeではベイクができないため、Cyclesに変える必要があります。
今回はBlender 2.92.0 で試していますが、やはりEeveeではベイクが無いようでした。

ベイクタブのオプションを変更する

ベイクするためのオプションを設定していきます!

レンダープロパティの下の方に、
ベイクタブがあるので設定していきましょう。

今回はこのように設定しました。

ベイクの設定一覧

  • Bake Type: Diffuse(ディフューズ)
  • Influenceタブ
    • Contributions:
      • Direct(直接照明): チェック外す
      • Indirect(間接照明): チェック外す
      • Color: チェックする
  • Selected to Active: チェック外す
  • Outputタブ
    • Target: Image Textures
    • Margin: 16px
    • Clear Image: チェックする

今回は、バラバラになっているテクスチャを
1枚にまとめるためにベイクしますので、
Contributionsの所は、Colorのみチェックを入れています。

ベイクボタンを押す!

これでベイクするための手順がすべて整いました!

最後に、ベイクするオブジェクトをすべて選択
ベイクボタンを押して実行しましょう!

ベイクボタンを押すと、画面の下に進捗状況が表示されます。
100%になるまで待ちましょう…

正しくベイクされているか確認

ベイクが完了したら、正しくベイクされているか確認していきましょう!

Bake_UVMapをプレビュー状態に変更します。

プレビューを切り替えると、表示が崩れてしまいますが
これは、元のテクスチャ画像に対して
Bake_UVMapに配置した展開図が適用されているためです。

続いて、Shaderタブに移動して、
ベイクしたイメージテクスチャを接続します。

元のImageTextureを外し、ベイクしたImageTextureを接続する

ノードを接続すると、ベイクしたテクスチャがメッシュに反映されるので
すべてのマテリアルでノードを接続して、
ベイクが正しく実行されているか確認してみましょう!

すべてのマテリアルでノードを接続し直した後

正しくベイクできていますね!
最後に、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_MapAUV_MapBとしてそれぞれをアクティブ状態にしてFBX形式で書き出しました。

アクティブは、カメラアイコンをクリックした状態で、
選択は、カメラアイコンはオフでUVMapを選択だけした状態です。

  1. UV_MapAがアクティブ状態で、UV_MapAを選択した状態
  2. UV_MapAがアクティブ状態で、UV_MapBを選択した状態
  3. UV_MapBがアクティブ状態で、UV_MapBを選択した状態
  4. UV_MapBがアクティブ状態で、UV_MapAを選択した状態

検証した結果

Blender、Unity共にFBXをImportした時には
UV_MapAアクティブ状態でかつ選択されている状態になりました。

つまり、FBXをImportした時には
UVMapのリストで一番上にあるUVMapが参照されるようです。

まとめ

今回は、テクスチャをベイクする方法を紹介しました。

マテリアルの数が多い場合、設定していくのがちょっと大変ですが
ベイクすることで、読み込むテクスチャ画像の数が減り、
容量が軽くなりますので、できるだけベイクしておいた方が良いのかなと思います。

ベイクする時は、
焼き付け先のImageTextureノードを選択状態にしておくのを忘れないようにしてください!

もしベイクが上手くいかない場合は、

  1. ImageTextureノードが選択状態になっているか
  2. 元のUVMapがプレビュー状態になっているか
  3. ベイク用のUVMapが選択状態になっているか

このあたりを確認してみて下さい!

ピックアップ記事

  1. 【Rails】selectメソッドで特定の条件を満たす要素を取得する
  2. 【Blender】Bumpを使用した質感表現の方法
  3. 【Rails】development? production? 開発環境ごとに処…
  4. 【MySQL】mysqlで新しくユーザーを追加する
  5. 【WPテーマ自作】UnderScoresの導入

関連記事

 
  1. Blender

    【Blender】zip版のBlenderをBlender Launcherに移行する

    Blenderのバージョン管理ができるツール、Blender Laun…

  2. Blenderの複数バージョンを簡単に管理できるBlenderLauncherの使い方

    Blender

    【Blender】複数バージョンを簡単に管理できる、BlenderLauncherの使い方

    Blenderを使っていると、最新版を入れて動かなくなったり、試験的に…

  3. Blender

    【Blender】起動時に強制終了してしまう問題

    Blenderを起動すると、コンソールが立ち上がった後にBlender…

  4. 慣れれば3分!Bumpノードを使用した質感表現の方法

    Blender

    【Blender】Bumpを使用した質感表現の方法

    マテリアルを設定したけど、リアルな見た目にならない。そんなお悩みの方へ…

  5. Blender

    【Blender】レンダリング結果を新規ウィンドウで開かないようにする

    カメラの微調整とか、FreeStyleで線画抽出作業をしている時に頻繁…

  6. Blender

    【Blender】拡張機能(アドオン)の基本的な使い方

    Blednerにはアドオン(拡張機能)と呼ばれる、制作を効率化してくれ…

カレンダー

2021年9月
 12345
6789101112
13141516171819
20212223242526
27282930  

最近の記事

  1. 慣れれば3分!Bumpノードを使用した質感表現の方法

    Blender

    【Blender】Bumpを使用した質感表現の方法
  2. MySQL

    【MySQL】mysqlで新しくユーザーを追加する
  3. Ruby on Rails

    【Rails】selectメソッドで特定の条件を満たす要素を取得する
  4. Ruby on Rails

    【Rails】findメソッドで連想配列から指定した値を検索する
  5. Blender

    【Blender】アニメーションでポーズを左右反転してコピペしたい時
PAGE TOP