「AOベイク」で3Dモデルのクオリティを上げよう!

こんにちは!クライアント開発のおぐらです。
今回はVCIやGLBなどの3DモデルをBlender上の操作でクオリティをちょっと上げるテクニックを紹介します。

この記事は

  • VCIや背景モデルを作っている、これから作る人
  • 「UV展開」が分かる程度のスキルレベルの人

に向けた内容となっております。
「ベイク」というと人によってはUnityのライトマップの方を思い浮かべるかもしれませんが、今回はBlenderでのベイクです。Unityは使いません。

「AO」の「ベイク」とは?

AO(エーオー)とは「アンビエント オクルージョン」の略称です。必殺技みたいでかっこいいですね。
「環境遮蔽」と訳されますが、正直何のことやら分からない人がほとんどだと思いますので、
ここでは「いい感じに立体感が出る影のこと」だと思ってください。

「ベイク」は、「焼く」という意味です。パンを焼くパン屋さんは「ベーカリー」といいますね。
CGでいうベイクは、3Dモデルの色や影、形状などの情報を画像に焼き込む(画像ファイルを生成する)ことを指します。

つまり、AOのベイクとは「いい感じに立体感が出る影 の 画像ファイルを生成する」という意味です。
百聞は一見にしかず!まずは例を見ていきましょう。

AO画像をテクスチャに合成すると・・・

AOの効果を分かりやすく表現できるよう、門松のような形状の3Dモデルを用意しました。
まずはAOがない状態のテクスチャ。

テクスチャのおかげで立体感は感じられますが、まだ「安っぽいCG感」が出ていますね。のっぺりしていて竹の空洞感もうまく表現できていません。

このテクスチャに、BlenderでベイクしたAO画像を合成するとこうなります。

並べてみるとこんな感じです。

一気に存在感が出ますね。AOの影はポリゴンが交差していたり、ポリゴン同士が近い位置関係にあったりすると濃く出てきます。

Blenderのベイクで出力できるのは下の画像中央の、白黒な画像です。
これを画像編集ソフトで元のテクスチャに乗算することで最終形のテクスチャにしています。

最終的に使うテクスチャは1枚のままなので、3Dモデルの容量や負荷を増やすことなくクオリティアップできます!

それでは、ここからは実際にAO画像をベイクする手順を解説していきます。

1.TexToolsを導入する

今回はBlenderの便利なアドオン、TexToolsを使います。
Blenderには標準でベイク機能がありますが、こちらはやや癖があるので今回はアドオンを使った簡単な方法でやっていきます。

今回使うBlenderのバージョンは2.82です。TexToolsはBlender2.79までしか対応していませんが、
GitHubでBlender2.80以降に対応したバージョンが公開されていますので、こちらを使います。

https://github.com/SavMartin/TexTools-Blender/releases

上記のReleasesから、textools.zipをダウンロードします。
このzipファイルを展開する必要はありません。圧縮ファイルのままでインストールできます。

Blenderを開き、編集 → プリファレンス をクリックします。(以降は日本語UIでの解説となります)

先程ダウンロードしたアドオンをインストールします。
プリファレンスウインドウの中にある「アドオン」を選択し、右上に出る「インストール」を押します。

するとインストールファイルを選ぶウインドウが出るので、ダウンロードしたzipファイルを選択して「アドオンをインストール」を押します。

インストールしたら、アドオンを有効化します。
プリファレンスウインドウのインストールボタンの下にある検索窓に「textools」と入力すると今インストールしたTexToolsが出てきます。
このアドオンにチェックを入れたら導入完了です。

2.TexToolsでベイクする

Blenderで3Dモデルを開き、UVエディターも開きます。
3Dビューの角をドラッグするとビューが増えるので、そのうち片方を「UVエディター」にします。

UVエディターの右端に「ツール」「画像」「ビュー」「スコープ」「TexTools」とタブが縦に並んでいるので、「TexTools」をクリックしてください。
タブが出ていない場合は右上の虫眼鏡の隣にある「<」をクリックするか、UVエディター上にマウスカーソルがある状態で「N」キーを押してください。
すると、隣にTexToolsのメニューが開きます。出てきたメニューの中に「Baking」という項目があるので、クリックして展開してください。

2-1.何をベイクするかを設定する

「Tangent Normal」と書かれている謎の物体の画像をクリックすると、モデルの何をベイクするかを選択するメニューが出てきます。
左上にある「AO」をクリックしてください。

2-2.ベイクする画像の解像度を設定する

TexToolsの一番上に、「サイズ」という項目があります。
ここを3Dモデルで使用しているテクスチャと同じサイズに設定してください。

2-3.ベイク対象のオブジェクトを選択する

3Dビューで、ベイク画像を書き出したいオブジェクトをすべて選択してください。

2-4.サンプル数を設定する

サンプル数が多いほどベイク結果の精度が上がりますが、ベイクにかかる時間が長くなります。
サンプル数が少ないと処理はすぐに終わりますが、ノイズが多くなってしまいます。

最初は低い値(初期値は8)に設定してベイクを実行し、大体の出来に問題がないことを確認してから大きな値(128~256)に設定してもう一度書き出す、という流れがおすすめです。

2-5.テクスチャをまとめるかどうかの設定をする

TexToolsのBakingの下の方に、「Single Texture」というチェックボックスがあります。
これにチェックを入れると、選択した全てのオブジェクトのベイク結果が1つの画像にまとめられます。

2-6.ベイクする

炎のアイコンがついている「Bake 4x」のボタンをクリックすると、ベイクが始まります。
この「4x」はベイクで生成する画像の数です。選択しているオブジェクト数に応じて変わります。
今回の例では4つのオブジェクトを選択しているのでベイクされるのは4枚の画像、ということで「4x」です。
2-5でSingle Textureにチェックを入れた場合は1xになります。

この処理は2-3で設定したサンプル数や、オブジェクトの形状によってはかなり長い時間がかかります。
PCは熱を出して唸り、Blenderは固まったかのように見えますが、ちゃんと処理は進んでいます。ただ待ちましょう。

3.ベイク後

複数オブジェクトのベイクをした場合、その数だけ画像が生成されるというのは先程説明しました。
UVエディター上に表示されているベイク画像を切り替えるには、Bakingメニューにある [オブジェクト名]_ao というボタンを押します。

保存したい画像をUVエディターに表示し、「画像」→「名前をつけて保存」でpngファイルを保存できます。
ノイズなどでベイク結果に納得がいかない場合は2-4に戻って再度ベイクしてみるのがいいでしょう。

ちなみに2-5でSingle Textureを設定しておくと下のような1枚画像が生成されます。

合成する手間が省けるので、今回はこちらの1枚を使います。

4.元のテクスチャにAOを合成する

画像編集ソフトを使って、先程保存したAO画像を元の3Dモデルのテクスチャに合成します。
元テクスチャの上に配置したAO画像を乗算レイヤーに設定し、不透明度を調整してください。
下の画像はPhotoshopですが、GIMPなどの無料ソフトでも同じことができます。

改めて書き出せば、AOが入ったテクスチャの完成です!

バーチャルキャスト上で差し替え前後のモデルの見た目を確認してみましょう。

この通り、バッチリ影が焼き込まれていますね。

どちらも無料のVCIにして公開していますので、よかったら見てみてください。

AOなしモデル

AOありモデル

ベイクの弱点

このように、モデルのクオリティを一段階上げることができるAOですが、弱点もあります。

動くものにAOベイクは向かない

影を焼き込んでしまうわけですから、アニメーションがついていたり、持ち運びできたりするオブジェクトに影が焼き込まれていると動いたときに不自然な見た目になってしまいます。例えば、今回の例の門松モデルで竹の部分が外れるようなギミックを入れてしまうと・・・

影が土台や竹に残って違和感がありますよね。

うまくベイクできないオブジェクトもある

今回紹介した手順でベイクができるのは、

  • UV展開がされている
  • UVの配置が重なっていない
  • UVの配置がテクスチャ画像の範囲からはみ出していない

これらの条件を満たすオブジェクトだけです。この条件を満たしていない場合、ベイク結果がおかしくなる可能性があります。

今回の例の3Dモデルのように、1つのオブジェクトのUVがどこも重ならず、テクスチャ画像の範囲内に収まっていることが重要です。

Blender標準のベイク機能について

Blenderにはもともとベイク機能があるというのは先に述べました。
AOやノーマルマップなどのベイクができるのはTexToolsと変わりませんが、Blender標準のベイクの中にはライト等を配置したシーンの最終レンダリング結果、つまり「完成状態」をそのままテクスチャに書き出すことができる「レンダリング結果のベイク」があります。
ライティング結果をテクスチャに焼き込んでしまうので、Unityなどでリアルタイムにライティングする必要がなくなります。高品質でありながら描画コストを抑えることができるのです!
そのレンダリング結果のベイクを使って作ったVCIが「謝罪会見場」だったり、「Vケット4おぐらブース」だったりします。動かない背景モデルならばベイクは大活躍できます。

ただ、設定方法が分かりにくかったり、落とし穴も多かったり、ベイクに尋常じゃない時間がかかったりするので今回はラクなTexToolsを使ったAOベイクのみ紹介しました。
興味がある方はぜひレンダリング結果のベイクも試してみてくださいね!