前の記事「Blenderのレンダリングの基礎とノイズの消し方」で、コーヒーカップをレンダリングしました。この記事では、ライトでついた明暗を、テクスチャ(画像)に焼き付ける「ベイク」を解説します。
Blenderでライトを当てたときの見た目は、モデルを書き出しても、Webやゲームエンジンでは再現されません。そこで、まずは実際にベイクし、ライトがなくてもカップの明るさが残ることを確かめます。そのあと、画像が真っ黒になる原因と、glTFで書き出すときの注意点を見ていきます。
※この記事はBlender 5.2 LTSで確認しています。ベイクはCyclesだけの機能なので、レンダーエンジンは「Cycles」を使います。
なぜベイクするのか
記事「Blenderのライティングの基礎とライトの置き方」で、コーヒーカップのシーンにエリアライトを2つ置いています。このライトでカップに明暗がついています。
Blenderで作ったモデルをWebやゲームエンジンに持ち出すときは、glTFという形式がよく使われます。試しに、ベイクする前のシーンを、「ファイル」→「エクスポート」→「glTF 2.0」で書き出し、Webのビューアーで開いてみます。ビューアーの使い方は、補足コラム「書き出したglTFを、Webのビューアーで見る」にまとめています。
ビューアー側の照明では、カップは全体が同じように明るくなっています。その照明を消すと、カップもテーブルも真っ黒になります。Blenderで置いたエリアライトは、glTFでは書き出せないためです。
そこで、ライトでついた明暗をテクスチャに焼き付けます。この作業がベイクです。ベイクしたテクスチャはモデルに貼ったままglTFで書き出せるので、ライトがなくても、Blenderでライトを当てたときの見た目を再現できます。
ベイク用のUVマップを作る
ベイクするときは、カップのどの部分を画像のどこに焼き付けるかを、UVマップで決めます。そのため、まずはカップのUVがどうなっているかを確かめます。
ロゴ用のUVマップは、ベイクに使えない
画面上部のタブを「UV Editing」に切り替え、カップを選んでTabで編集モードに入ります。カップの側面のUVは、0〜1の枠より大きく広がっています。UV展開の記事で、ロゴの大きさに合わせてUVを拡大したためです。
ベイクできるのは、UVが枠の内側に収まっている部分だけです。いまのUVでは、カップの側面の大部分が枠の外にあるため、その部分にはライトでついた明暗を焼き付けられません。このUVはロゴの位置を決めるために使っているので、作り直すとロゴがずれてしまいます。そこで、元のUVはそのまま残し、ベイク用のUVをもう1つ作ります。
UVマップを追加する
オブジェクトデータプロパティ(緑の三角のアイコン)を開き、「UVマップ」の「+」を押します。「UVMap」の下に新しいUVマップが追加されるので、ダブルクリックして名前をbake_uvにします。
追加したbake_uvは、青く表示され、選ばれた状態になっています。ベイクで使われるのは、この一覧で選んでいるUVマップです。右にあるカメラのアイコンは、「UVMap」のままにしておきます。こちらはロゴの表示に使われているためです。
スマートUV投影で展開する
編集モードでAを押して全選択し、U→「スマートUV投影」を選びます。設定のウィンドウで「アイランドの余白」を0.02にし、「アスペクト比を補正」のチェックを外して、「展開」を押します。「アスペクト比を補正」がオンのままだと、ロゴ画像の縦横比に合わせて、アイランドが横に縮小されます。
展開すると、UVはいくつかのまとまりに分かれます。このまとまりを「アイランド」と呼びます。スマートUV投影では、すべてのアイランドが枠の中に重ならずに並びました。取っ手はカップと同じオブジェクトなので、取っ手のアイランドも同じ枠の中に入っています。
「アイランドの余白」は、アイランドどうしの間をあけるための値です。アイランドが重なっていてもエラーは出ませんが、重なった部分には、あとから焼き付けた面の色だけが残ります。画像を貼り直すと、重なっていた面すべてにその色が表示されます。
ベイク用の画像を用意する
ベイク用の画像を用意する前に、画面上部のタブを「Layout」に戻し、ソーサーのマテリアルを確認します。
ソーサー用のマテリアルを作る
ソーサーを選び、マテリアルプロパティを開きます。マテリアルの名前の右に2と表示されている場合は、カップと同じマテリアルを使っています。
このままだと、ベイクした画像をあとでカップのマテリアルに貼ったとき、ソーサーにも同じ画像が貼られ、正しく表示されません。2をクリックすると、ソーサー用のマテリアルが作られます。名前はcup.001になり、数字の表示は消えます。2が表示されていなければ、この操作は必要ありません。
画像テクスチャを追加する
画面上部のタブを「Shading」に切り替え、カップを選びます。シェーダーエディターでShift + A→「テクスチャ」→「画像テクスチャ」を追加します。
ノードの「新規」を押し、名前をbake_cup、「幅」と「高さ」を1024にして、「新規画像」を押します。
この画像テクスチャは、どこにもつなぎません。ノードをクリックして選択します。選択されたノードには、白い枠が付きます。
Blender 5.0からは、画像テクスチャのノードが選択されていないと、ベイクできません。ほかのノードをクリックすると、画像テクスチャのノードの選択が外れます。「ベイク」を押す前に、白い枠が付いているか確認してください。
取っ手のマテリアルにも、カップ本体と同じ画像を置く
取っ手には、カップ本体とは別のマテリアルが使われています。ベイクするには、マテリアルごとに画像テクスチャが必要です。画像テクスチャがないマテリアルは、ベイクされません。
シェーダーエディター上部の「スロット1」を「スロット2」に切り替えると、取っ手のマテリアルが表示されます。
ここにも画像テクスチャを追加します。今度は「新規」は押さず、ノードの画像アイコンからbake_cupを選びます。カップ本体と同じ画像を指定することで、本体と取っ手を1枚の画像にまとめてベイクできます。こちらもノードはつながず、選択した状態にしておきます。
ベイクする
レンダープロパティの「レンダーエンジン」を「Cycles」にします。EEVEEのままだと、「ベイク」の項目が表示されません。
「統合」でベイクする
レンダープロパティの下のほうにある「ベイク」を開きます。「ベイクタイプ」は初期値の「統合」(Combined)のままにします。統合は、ライトを当てたときの見た目を、そのまま焼き付ける方式です。カップの色に加えて、ライトから直接届く光と、周りの物に反射して間接的に届く光も入ります。
カップを選んだ状態で、「ベイク」を押します。画面下に「Baking map saved to internal image, save it externally or pack it」と表示されたら、ベイクは完了です。
左下の画像エディターにbake_cupが表示されます。表示されていなければ、上部の画像アイコンから選びます。カップのアイランドに、ライトの明暗が入っています。
ベイクには、レンダープロパティの「サンプリング」→「レンダー」の設定が使われます。「デノイズ」がオンなら、ざらつきを抑えてベイクできます。
画像を保存する
ベイクした画像は、まだBlenderの中にしかありません。画像エディターの「☰」→「画像」→「名前を付けて保存」で、ファイルとして保存します。
保存したあとは、画像ファイルを別のフォルダに移動したり、名前を変更したりしないでください。Blenderは保存した場所にある画像を読み込むため、ファイルが見つからなくなると、カップには画像の代わりにピンク一色が表示されます。
ベイクした画像を貼って確認する
ベイクした画像を、カップに貼ります。
ベイクした画像を貼る
Shift + A→「シェーダー」→「放射」を追加して、次のようにつなぎます。プリンシプルBSDFの線は外れますが、ノードは消さずに残しておきます。
bake_cupの「カラー」 → 放射の「カラー」- 放射の「放射」 → マテリアル出力の「サーフェス」
このままだと、ベイクした画像が正しい位置に表示されず、カップの見た目がばらばらになります。
画像テクスチャの「ベクトル」に何もつながないと、カメラのアイコンが付いた「UVMap」が使われます。ベイクしたときはbake_uvを使ったので、画像を正しい位置に表示するには、貼るときも同じUVマップを指定する必要があります。
Shift + A→「入力」→「UVマップ」を追加し、ノードの欄でbake_uvを選びます。UVマップの「UV」を、bake_cupの「ベクトル」につなぎます。
取っ手のマテリアル(「スロット2」)にも、同じようにつなぎます。UVマップの欄が「UVMap」のままだと、取っ手も正しく表示されません。
放射につないだのは、ベイクした画像をそのままの明るさで見せるためです。プリンシプルBSDFにつなぐと、焼き付けた明暗の上から、もう一度ライトが当たります。詳しくは「ベイクした画像は、ライトの影響を受けないマテリアルで書き出す」で見ていきます。
ライトを消す
表示を「レンダー」にして、アウトライナーの目のアイコンでライトを2つとも消します。
テーブルと壁は真っ暗になりましたが、カップにはライトを当てたときの明るさが残っています。ライトによる明暗が画像に焼き付いているためです。ソーサーが明るく見えるのは、ベイクした画像を放射につないだカップが、周りを照らしているためです。
焼き付けた明暗は、ライトを消しても変わりません。視点を回しても、カップの明るい側と暗い側は同じままです。ライトの位置や強さを変えた場合は、ベイクし直す必要があります。
確認が終わったら、目のアイコンでライトを元に戻します。
色だけをベイクする
Webやゲームエンジンでライティングし直す場合は、カップの色だけをベイクします。「統合」でベイクした画像には、すでにライトによる明暗が入っています。その画像に別のライトを当てると、意図した見た目にならないことがあるためです。
ベイクの準備をする
ベイクする前に、カップ本体と取っ手のマテリアル出力の「サーフェス」を、プリンシプルBSDFにつなぎ直します。放射につないだままだと、プリンシプルBSDFに設定したカップの色がベイクに反映されないためです。
「ベイクタイプ」を「ディフューズ」にすると、「影響」の項目が3つに変わります。そのうち「直接照明」と「間接照明」のチェックを外し、「カラー」だけを残します。
この設定でベイクすると、先ほど「統合」でベイクした画像が上書きされます。元の画像を残したい場合は、先に新しい画像を作り、本体と取っ手の画像テクスチャを両方とも新しい画像に切り替えてからベイクします。
「ディフューズ」でベイクする
カップを選んで「ベイク」を押します。ベイクした画像には、ライトの明暗が入っていません。カップの色がそのまま焼き付けられています。
ただ、取っ手の部分は真っ黒になりました。取っ手のマテリアルで、「メタリック」が1に設定されているためです。金属の部分が真っ黒になる理由と直し方は、次で見ていきます。
ベイクした画像が真っ黒になるとき
ベイクした画像が真っ黒になる原因は、主に3つです。
金属のマテリアルを、「ディフューズ」でベイクした
「メタリック」が1のマテリアルを、「ディフューズ」(Diffuse)でベイクすると真っ黒になります。
ディフューズは、金属ではない物の色を焼き付ける方式です。金属の場合、表面で反射する光によって色が見えるため、ディフューズではその色を焼き付けられません。カップの取っ手が真っ黒になったのは、このためです。
「メタリック」を0にすれば色は焼き付けられますが、マテリアルが金属でなくなります。マテリアルを変えずに色を取り出すには、「放射」(Emit)でベイクします。
- Shift + A→「シェーダー」→「放射」を追加し、マテリアル出力の「サーフェス」につなぐ
- プリンシプルBSDFの「ベースカラー」につながっているノードの出力を、放射の「カラー」にもつなぐ。何もつながっていない場合は、放射の「カラー」をベースカラーと同じ色にする
- 「ベイクタイプ」を「放射」にしてベイクする
放射でベイクすると、「メタリック」が0でも1でも色が焼き付けられます。ベイクが終わったら、マテリアル出力の「サーフェス」をプリンシプルBSDFにつなぎ直します。
アイランドの外が黒いのは、何も焼き付けていないためです。色だけをベイクした画像を使う場合、金属の質感は、書き出し先で「メタリック」を設定し直します。
直接照明と間接照明を外したまま、「統合」でベイクした
「ディフューズ」で「直接照明」と「間接照明」を外したあと、「ベイクタイプ」だけを「統合」(Combined)に戻すと、画像は真っ黒になります。この2つのチェックは、「ベイクタイプ」を切り替えても外れたままです。
このとき、「統合」の「寄与」に並ぶ4つの項目がグレーになります。「直接照明」と「間接照明」にチェックを入れ直してからベイクします。
ライトの光が届いていない
「統合」は、ライトの光を焼き付ける方式です。ライトが消えていると、焼き付ける光がないので、画像は真っ黒になります。この記事のシーンは、ワールドの「強さ」を0にしているため、ライトのほかに光がありません。ライトが目のアイコンで消えていないか、カップのほうを向いているかを確認します。
画像が真っ黒にならず、ベイクしても画像が変わらない場合は、原因が違います。「うまくいかないときのチェックリスト」を見てください。
ベイクした画像は、ライトの影響を受けないマテリアルで書き出す
ベイクした画像を「ベースカラー」につなぐと、Webやゲームエンジンでもライトの影響を受けます。ライトの影響を受けずに表示するには、マテリアルの組み方を変える必要があります。
ビューアーの照明を消して比べる
ビューアーの照明を消すと、ベースカラーにつないだカップは真っ黒になります。これは、ベースカラーにつないだ画像が、ビューアーの照明の影響を受けるためです。
一方、ライトの影響を受けないマテリアル(Unlit)として書き出したカップは、照明を消しても明るいまま残っています。ビューアーの照明に左右されず、画像に入っている明暗をそのまま表示できます。
放射だけにつないだ状態で書き出すと、Unlitではなく、自分で光るマテリアルとして書き出されます。正式なUnlitではないため、書き出し先によって見え方が変わることがあります。
Unlitとして書き出せるように、マテリアルを組む
glTFの書き出し画面には、Unlitにする項目はありません。マテリアルのノードを次のようにつなぐと、Unlitとして書き出せます。
- Shift + Aから、次の3つを追加する:「入力」→「ライトパス」/「シェーダー」→「シェーダーミックス」/「シェーダー」→「透過BSDF」
- ライトパスの「カメラレイ」を、シェーダーミックスの「係数」につなぐ
- 透過BSDFを、シェーダーミックスの上の「シェーダー」につなぐ
- ベイクした画像をつないだ放射を、シェーダーミックスの下の「シェーダー」につなぐ
- シェーダーミックスの「シェーダー」を、マテリアル出力の「サーフェス」につなぐ
カメラから見える部分には放射を、それ以外には透過BSDFを使う組み方です。取っ手のマテリアルも同じように組みます。
「ファイル」→「エクスポート」→「glTF 2.0」で書き出します。設定は初期値のままで問題ありません。
うまくいかないときのチェックリスト
ベイクがうまくいかないときは、次の5つを上から確認してみてください。
- ベイクしても画像が変わらない画像テクスチャのノードが選択されているか(白い枠が付いているか)確認します。選択が外れていると、画面下に「No active and selected image texture node found」と表示されます
- 一部だけベイクされないそのマテリアルに、ベイク用の画像テクスチャがあるか確認します
- ベイクした画像を貼ると、正しく表示されないUVマップのノードで、ベイクしたときと同じ
bake_uvを選んでいるか確認します - カップがピンク一色になる保存した画像ファイルを、別のフォルダに移動したり、名前を変えたりしていないか確認します
- ベイクした画像がざらつくレンダープロパティの「サンプリング」→「レンダー」で、「デノイズ」にチェックが入っているか確認します
画像が真っ黒になるときは、「ベイクした画像が真っ黒になるとき」へ
まとめ
ライトでついたカップの明暗を画像に焼き付け、ライトを消しても明るさが残ることを確かめました。さらに、色だけをベイクする方法、画像が真っ黒になる原因と対処法、glTFで書き出すためのマテリアルの組み方も見てきました。
覚えることが多いと感じたら、次の5つを押さえておけばベイクはできます。
- ベイク用のUVマップを追加し、アイランドを枠の中に重ならずに並べる
- ベイク用の画像テクスチャは、どこにもつながずに選択しておく
- 本体と取っ手のようにマテリアルが分かれていたら、それぞれに画像テクスチャを置いて同じ画像を選ぶ
- ベイクした画像は、すぐに保存する
- ベイクした画像を貼るときは、UVマップのノードでベイク用のUVマップを選ぶ
ここまでの記事で、Blenderの基礎をひと通り学んできました。コーヒーカップを作り、質感を設定してロゴを入れ、ライティングとレンダリングを行いました。最後に、ライトによる明暗を画像に焼き付け、Webやゲームエンジンでも再現できるようにしました。これまでの記事は「Blenderの基礎」にまとめています。
よくある質問
Q. ベイクとは何ですか?レンダリングとは何が違いますか?
A. レンダリングは、カメラから見た1枚の画像を作る処理です。一方、ベイクはライトによる明暗や素材の色を、テクスチャ(画像)に焼き付ける処理です。ベイクした画像をモデルに貼り、ライトの影響を受けないマテリアル(Unlit)として書き出せば、Webやゲームエンジンでも、焼き付けた明暗をそのまま再現できます。
Q. glTFでライトも書き出せますか?
A. 書き出し画面の「Punctualライト」にチェックを入れると、ポイント・スポット・サンの3種類を書き出せます。エリアライトは書き出せません。
Q. EEVEEでベイクできますか?
A. できません。レンダーエンジンをEEVEEにすると、レンダープロパティに「ベイク」の項目が表示されなくなります。Cyclesに切り替えてからベイクします。
Q. ベイクした画像が消えました。
A. ベイクした直後の画像は、Blenderの中にしかありません。画像エディターの「☰」→「画像」→「名前を付けて保存」で保存します。保存しないまま閉じようとすると、確認の画面に「1 個の変更済み画像を保存」が表示されます。このチェックを外して閉じると、ベイクした画像は消えます。
Q. メタリックを0にすれば、真っ黒は直りますか?
A. 「メタリック」を0にすれば真っ黒は直りますが、金属の質感はなくなります。金属の質感を保ったまま色を焼き付けるには、ベースカラーの色を放射につなぎ、「ベイクタイプ」を「放射」にしてベイクします。
Q. UVが重なっていると、どうなりますか?
A. エラーは出ませんが、重なった部分には、あとから焼き付けた面の色だけが残ります。その画像をモデルに貼ると、重なっていた面すべてに同じ色が表示されます。ベイクする前に、アイランドが重なっていないか確認します。
Q. ライトを動かすと、ベイクした画像の明暗も変わりますか?
A. 変わりません。明暗は画像に焼き付いているため、あとからライトを動かしても変わりません。ライトの位置や強さを変えた場合は、ベイクし直す必要があります。
Q. Blenderで見た色と、書き出したあとの色が違います。
A. Blenderの画面は、カラーマネジメントの「ビュー」が初期値の「AgX」になっていて、書き出し先より少し暗く表示されます。この記事のコーヒーカップでは、白い部分の画素の値(0〜255)が、Blenderでは約195、Webのビューアーでは約254でした。「ビュー」を「標準」にすると、今回のような色の違いを抑えられます。
補足コラム
書き出したglTFを、Webのビューアーで見る
書き出したglTFは、ブラウザ上のビューアーで確認できます。この記事では、Three.jsで作られたglTF Viewerを使いました。書き出したファイルをドラッグ&ドロップするだけで、3Dモデルを表示できます。
書き出し時の「フォーマット」で「glTF セパレート」を選んだ場合は、.gltf、.bin、画像ファイルをまとめてドラッグ&ドロップします。
この記事のコーヒーカップは、Blenderで見たときよりも、ビューアーのほうが明るく表示されます。これは、Blenderのカラーマネジメントで「ビュー」が「AgX」になっているためです。「標準」にすると、ビューアーでの見え方に近づきます。
また、bake_uvでベイクした画像は、glTFでは2つ目のUVマップを使う設定で書き出されます。ゲームエンジンで使用する場合は、2つ目のUVマップが正しく読み込まれているか確認してください。
つやのある面は、ベイクすると見え方が変わる
つやのある面では、光が反射して明るく見える場所が、視点によって変わります。ただ、ベイクした画像では、視点を変えても明暗は変わりません。そのため、つやのある素材では、元の見た目を再現しきれないことがあります。
このカップはつやが少ないため、見た目の違いはわずかでした。つやのある素材ほど、その違いが目立ちやすくなります。
「統合」には、光沢も入っている
「統合」の「影響」にある「寄与」には、「ディフューズ」・「光沢」・「伝播」・「放射」の4つがあり、初期値ではすべてにチェックが入っています。「光沢」は、表面で反射する光による明るさです。
「光沢」のチェックを外してベイクすると、その反射による明るさが入らなくなります。このカップでは、ロゴの黒い部分が暗くなり、画素の値(0〜255)が83から26に下がりました。黒い部分も、光の反射によって明るく見えていたためです。
ベイクタイプは12種類ある
「ベイクタイプ」には、次の12種類があります。
統合/アンビエントオクルージョン/影/位置/ノーマル/UV/粗さ/放射/環境/ディフューズ/光沢/伝播
この記事で使ったのは、「統合」・「ディフューズ」・「放射」の3つです。Webやゲームエンジンでも素材の質感を再現したい場合は、色だけでなく、「粗さ」や「ノーマル」などもベイクします。
また、「選択物→アクティブ」は、細かく作り込んだモデルの凹凸を、面の少ないモデルに焼き付けるときなどに使う設定です。この記事では扱いません。