Substance Painter2 → Blender のワークフロー
- 2017年05月09日
- 3DCG, Blender, Substance Painter, Tips
- No Comment
作品がひとつできる目処が立ったので,備忘録を兼ねてやったことをメモ.Substance Painter関係のワークフローはとにかく動画の形で提供される情報が多いので,文字情報として残すことには意味があるはず.今回はリトポロジーまではやっていないので,ゲーム用モデルの作成フロートしては不適切なところがあると思う.おそらく,リトポロジーのことを考えるなら対応するオブジェクトの名前を_highと_lowで分けておく等の事前準備が必要になる.
- Blenderでの作業
- アドオンの有効化
- UV展開
- Emitを使ったIDマスクの作成
- fbx形式でのエクスポート
- Substance Painter2(以下SP)での作業
- プロジェクト作成とモデルの読み込み
- fillレイヤによる大まかな材質決定
- 傷やモールドの追加
- エクスポートの設定
- Blenderでの作業
- テクスチャノードの作成
大体の流れは上に書いたとおりである.
非常に長いので,続きは格納.
Blenderでの作業
アドオンの有効化
今回は,複数オブジェクトをそのまま結合せずに用いたので,TextureAtlasが役立った.このアドオンは元からBlenderに同梱されているので,有効化するだけで良い.
他には,Material Utilsを有効化しておくと,IDマスク作成時に役に立つかもしれない.
有効化すると,Renderタブに新しいUIが追加される.
できることは画像に書いたとおり.Auto Unwrapは使わなくて良いと思う(Manual Unwrapで,Smart UV Projectしたほうが細かく調整できる).忘れやすいのは4のRemoveOtherUVsで,これを押さないと使っていないUVmapが残って,SPに持っていったときに間違ったUVマップが読み込まれるときがあるので,押しておいたほうが良い.このボタンの影響範囲は選択オブジェクトのみなので,選択していないオブジェクトのUVが勝手に削除されることはない.
UV展開
今回のUVマップはひどいもので,完全に自動で展開している.どうせテクスチャはSPを使って3D上でしか編集しないので,特に問題はなかった.UVの島同士の間隔は大きさに合わせて微調整が必要だが,完全自動展開なら何度でも試行できるので,深く考える必要はない.
Emitを使ったIDマスクの作成
UVが展開できたら,SPへの作業へ以降する前にIDマスクを作っておいたほうが良い.今回はBlender上のベイク機能を使ってマスクを作成した.
Emissionのみを設定したマテリアルを準備して,Emitチャンネルのベイクを行って色分けしたテクスチャを作成する.
上図の状態にして……
生成物がこれ.このとき,全てのオブジェクトに同じマテリアルを設定して,いま出力したIDマップを適用したときに見た目がおなじになっているかどうかを確認したほうが良い.UVマップ上での島同士のマージンが近すぎると,別の部分の色がはみ出してしまうことがある.問題があった場合は,UV展開をやり直せば良い.スマート展開を利用しているのなら,やり直すことは苦にならないはず.マージンを多少調整してやれば問題なくなることが多い.
問題なければ,このIDマップを画像ファイルとして保存する.
fbx形式でのエクスポート
以上の作業が終わったら,fbx形式でモデルを書き出す.TextureAtlasを使用していれば,TextureAtlasによって作成されたGroupをSelectGroupして,そのグループに対してSelectedObjectでエクスポートすれば良い.
細かい設定は下図の通り.
Substance Painterでの作業
ver2.6.0現在,ノーマルマップは「通常」マップと誤訳されているので注意.
プロジェクト作成とモデルの読み込み
プロジェクトを新規作成する.Blenderの法線マップはOpenGLなので,エクスポート時には注意する必要がある.
赤丸部は初期設定ではDirectXとなっているので,変える必要がある(実際はエクスポート時に変更できるので,そのままでも致命的ではない).
これができたら,まずすべきことはテクスチャのベイクである.というのも,SP上でのテクスチャベイクとは,読み込んだmeshデータから曲率やAOなどの各情報を計算して出力することなので,これを先にやっておくことが,各種フィルタやジェネレータを使用する下準備となる.やっていることは下記のブログ記事と同じだが,中略すると流れがわからなくなるので,簡単に記載する.
TextureSetの中にあるBake Texturesボタンを押す.
すると下図のウィンドウが表示される.
IDマップは先ほど作成したものを読み込むので,ここで計算する必要はない.チェックを外しておく.ベイクしたあと,IDマップを読み込む.
File > Import resouces を押すと,下図のウィンドウが表示される.ドラッグアンドドロップでIDマップを放り込むと,下の状態になる.
右側にUndefinedと表示されているのは,この画像を何として扱うかを決める必要があるということである.ここではTextureで良いと思う.下の赤丸部は,インポートしたリソースをどこに保存するかを決めるものである.例えば,よく使うモールド等はシェルフに登録しても良いが,今回のようにこのプロジェクトのみで使用するファイルの場合は,プロジェクトと対応させておけば良い.
参考:hildsoft開発日誌 Substance Painterのチュートリアルでお勉強その3 テクスチャのインポート
fillレイヤによる大まかな材質決定
バケツマークの塗りつぶしレイヤを追加して,大体の材質を決めていく.このままでは全体に材質が適用されるが,マスクによって適用対象を指定できる.
マスクを追加した後,Pick colorのボタンを押すと,適用対象の色を指定できる.この色指定は何度も行うことができるので,IDマップ作成時は別材質にするつもりだったが,結局同じ材質にしたくなった場合等に使える.
傷やモールドの追加
やり方は色々とあると思う.単にレイヤを追加して塗る場合に困ることはないと思うので,ここではフィルタやジェネレータを使用した際に困ったことを記載する.
ウェザリングを追加するために,塗装が禿げたテクスチャを追加することを考える.塗りつぶしレイヤを追加して,これに禿げた塗装色を設定する.次に,この塗りつぶしレイヤに対してマスクを設定する.マスクの作成は泡のようなアイコンからジェネレータを追加するか,シェルフのSmart masksからドラッグアンドドロップするかで追加することが多いと思う.
これでウェザリングが追加されるが,これと先程のIDマスクを両立させようとすると,問題が起こる.先程と同じようにAdd MaskからColor selectionを追加すると,マスク設定が全て上書きされてウェザリング用のマスクが消えてしまう.なので,今回は黄色丸のアイコンではなく赤丸のアイコンからColor selectionを追加する.
Color selectionフィルタが追加されると,レイヤの一番上に追加されるので,これを右クリックメニューから一番下へ移動する.先程同様に色指定を行ったら,ジェネレータ側を通常マップから乗算マップへ変更する.
これで問題が解決する.
エクスポートの設定
テクスチャ作成が終わったら,エクスポートする.ファイル > Export Textures からエクスポート画面を表示する.今回は,UE4用のテクスチャプリセットを改変して使用する.
ここの設定はプロジェクト固有ではなく,プロジェクト間にまたがって保存される.このため,プリセット改変はしないほうが良い.エクスポートのプリセットは右クリックメニューからコピーできるので,コピーしておく.この画面では,どのマップの情報を,どういう形で出力するかを決定できる.例えば,この画面ではオクルージョン・粗さ・金属のパラメータが,それぞれRGBと対応した一枚のテクスチャへと合成されて出力されることが示されている.今回変更するのはノーマルマップの部分で,RGB(DirectX)を右クリックメニューからクリアして,代わりに右のConverted MapsからNormal OpenGLをドラッグアンドドロップして追加する.
これができたら,マップをエクスポートする.
参考:
https://www.youtube.com/watch?v=hHH4ivnbpBA&t
Blenderでの作業
テクスチャノードの作成
参考:Json’s Blog Importing Substance Painter texture to Cycles
参考URLをほぼそのまま使ったが,UE4マップを元にしているので,多少違いがある.
グループを作成して使いまわせるようにしているが,幾つか注意点がある.ノーマルマップは手動でUVマップ名を入れる必要があるので,ここはノードグループにしてはいけない(はじめはグループ内に入れていたが,どうしてもおかしくなってしまうので外に出した経緯がある).
粗さ・金属マップは今回はcolorデータとして読み込んでいる.このことが,2枚目の画像におけるPowerノードへの入力1.0となっていることと関係している.色々と調べてみると,粗さマップの値は2.2乗しろ,と言う情報がでてくることがある.また,これらのマップはNon-colorで読み込めと書いて有る場合もある.この値は色のリニアワークフローと関係しておりややこしいことになっている.色データとして読み込まれる場合はリニアライズが行われるので,その後の2.2乗は必要なく,逆に非色データ=値データとして読み込まれる場合はBlender内で2.2乗する必要があるのだと思う.
まとめると,
1. Colorとして読み込み,そのまま用いる
1. Non-colorとして読み込み,2.2乗する
の2種類の方法がある.このふたつを比較すると,出力はほぼ同じになることを確認した.
「非色データとして読み込むと2.2乗が必要となる」ということ自体,これらのデータが色データとして扱われていることを示しているように思われる.仕様として良いかどうかは置いておいて,今回はColorデータとして読み込んでいる.
他の注意点としては,元の参考と異なりフレネル再現にはAshikhmin-Shirleyを用いていることがあげられる.ここをGGXやMultiscatter GGXにすると,カメラの視線方向と面の法線方向が直交に近づいたときに,見た目が真っ白になってしまうためである.
参考までに.