Substance DesignerでAO Mapを作成

Substance DesignerでのAO Mapの作成方法について記載します。
Substance Designerは、ノードを組み合わせることで最終的にテクスチャを生成するツールになります。

## 必要なデータ

3Dの形状データを用意します。Substance Designerはobjやfbx読み込みに対応しています。
fbxを個人的にはよく使ってます。その際に、以下の点に注意してください。

* UVが割り当ててあること。AO Mapを計算する場合は、UV上の面は他と重なりがないようにします。
* 面ごとの頂点法線を出力する。法線もAO計算では参照される要素になります。
* 複数UV層があってもOK。Substance Designerで参照するUVを選択できます。
* 複数形状があってもOK。Substance Designerで、単一のメッシュに対して複数メッシュの遮蔽計算することもできます。

## AO Mapを作るまでの流れ

AO Mapを作成するまでの流れを書いていきます。
1つのポリゴンメッシュ/1つのマテリアルを持つ形状をfbxで用意しました。
以下、Shade 3Dの画面ですが、モデリングはポリゴンメッシュであれば何で作ってもOKです。

![sd_01_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/957c1947-3bd6-d91e-9925-abd3f459359e.png)
2つのUV層を用意し、2つめのUVに対してAO Map用の重ならない面の割り当てを行っています。1つのUVだけでももちろんOKです。

Substance Designerを起動し、メインメニューの「File」-「New Substance」で新しいプロジェクト（Substanceと呼ぶ）を作っておきます。

### 形状を読み込み

Substance Designerでは、3Dビューに任意の形状を表示することになります。
Explorerビューの「xxx.sbs」を右クリックしてポップアップメニューを表示。
「Link」-「3D Mesh」を選択します。
ファイルダイアログで3D形状のファイル(fbx/objなど)を選択してください。

![sd_02_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/2baed15d-d882-e6f3-6336-2b204e396bec.png)

3D形状については、Substance Designer上ではリンク（参照）扱いになるようですね。

ExplorerビューのResourcesに読み込まれた3D形状がリストアップされますので、これをダブルクリックまたは3Dビューにドラッグします。
すると、3Dビューに3D形状が反映されました。

![sd_03_20150219.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/bd4be0e1-7a59-8a19-23be-37dc1d423faa.jpeg)

### UVを確認してみる

この作業は、AO Mapを作成する際にはいらないですが、念のためにUVを確認してみましょう。
3Dビューで形状が表示されていることを確認し、3Dビュー上のメニューの「Geometry」-「Display UVs in 2D View」を選択します。
すると、2DビューにUVが表示されます。このメニューはトグルになっており、もう一度選択するとUVは非表示になるようでした。

複数UVがある場合は、2Dビュー上のメニューの「UV」の右の矢印を選択し（「UV」のところはUV表示/非表示のトグルのようです）、リストから「UV set 1」を選択すると，2つめのUVが表示されます。
リスト左のチェックを選択すると、それぞれのUVを表示/非表示します。
ちょっとクセがありますね。
![sd_04_20150219.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/303d674a-63ee-359d-f3b0-8c5d9cbe1375.jpeg)

### AO Mapのベイクを行う

Explorerビューの3D形状を右クリックしたメニューより、「Bake model Information」を選択。
![sd_05_20150219.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/5fa484e9-26ae-4584-8e56-2f7027af26fa.jpeg)
ベイク用のダイアログボックスが表示されます。

Scene部では、形状が複数要素を持つ場合にツリーで表示されます。
それぞれの形状に対してベイクするか、を選べます。
この例では、1メッシュしかないためすべてチェックした状態です。
![sd_06_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/3af15733-77eb-045a-e2fe-59befcabb2ea.png)

Bakers部では、ベイクを行う種類を選択します。
ここでは、Ambient Occlusionが表示されているのを確認します。
存在しない場合は「＋」を選択すると新しく追加できます。
行を選択して「X」ボタンを押すと、その要素を削除できます。

![sd_07_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/fc9390c4-e9bf-01e7-bc6f-99d61a2874c2.png)

Baker Parameters部は、AOの設定を行います。
形状によってよく変えると思われるのはおそらくここになります。

![sd_08_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/dd121bbd-41d3-bcfb-e7e2-ad3b2ae45e99.png)

「Invert Normals」をチェックすると、面を反転して計算します。
「Use unselected Mesh Parts」をチェックすると、複数メッシュを持つ場合に他の形状とも遮蔽計算します。1つのMeshしかない場合は、これはOn/Offどちらでも同じ。
「Quality」はAOの品質です。これはいくつか試して確認するのがよいかと思います。もちろん、高品質にした場合は計算時間がかかることになります。
「Precision Bias」はAO計算時に面から浮かせるバイアス値です。この値が小さすぎると細かいノイズ（artefactsと呼ぶ）が乗る場合があります。
あまり大きくしすぎると影が出るべきなのに出ないこともありますので注意です。
「Distance Fade」は、AOの広がりを指定します（役割がいまいちわからない、、、）。

その他のパラメータは説明を省いて、Output SizeとUV Setについて。
![sd_09_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/a5786def-8646-df0f-0014-c8c716508604.png)

「Output Size」はAO Mapとして出力されるテクスチャサイズ。
「UV Set」は参照するUV層番号を指定します。

ダイアログボックスの「Override existing resource」チェックボックスがOnになっているときは、複数回ベイクするとテクスチャは上書き更新されます（デフォルト）。

これでOKボタンを押すと、Explorerビュー内のResources内にAO Mapのテクスチャがリストされました。
![sd_10_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/031f4a06-7d36-840b-b37e-d3c6ec77d069.png)

さて、ここで今までの作業を保存します。
Explorerで「xxxx.sbs」を選択して右クリックで「Save」を選択。
この段階で、保存した場所の「xxxx.resources」というフォルダができています。
この中に、出力されたAO Mapの実態（pngファイル）が存在します。
これを他ツールに持っていって活用することになります。

![sd_11_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/4849722b-0f95-d8d7-1369-d359c8514cd6.png)

> 保存した場所にできる「xxxx.resources」フォルダを手動で削除しないようにしてください。
> 削除するとSubstance Designerで警告が出て、以降正しくベイクのテクスチャが出力されないようになってしまいました。

### Substance Designer上でAOのベイクを確認

3DビューではUV0固定なのか、UV1を使ったマッピングを見ることができなかったので、fbxファイルで1つのUVだけ出力するようにして、再度形状を読み込みました。
これでAOをベイク。

1. ベイクしたAOのテクスチャを今のカレントのGraphにドラッグして配置。
2. Graphビューで、AO MapのテクスチャをOutputのDiffuseにドラッグして結びつけ（とりあえず）。
3. ExplorerビューのカレントのGraphを3D Viewにドラッグ。

![sd_12_20150219.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/5f6d8711-1b7a-fe95-d9ba-dff1f8993916.jpeg)

これで「UV0」に対してAO Mapのテクスチャが反映されました。
> 3Dビューでは、UV1や任意のUVに切り替えはできない？
> これについてはマテリアル表現がShaderを使ってるので、対応するとなるとShaderを書かないといけないかも。

手順2つめのAOの割り当ては、実際は最終的な出力に対してAO Mapのテクスチャを乗算合成する手順になるほうがいいかもしれません。

## 複数メッシュでベイクする

今までは単一のメッシュのベイクでしたが、複数メッシュの場合もやってみましょう。
以下のように構成しました。

* 10個のポリゴンメッシュを用意
* それぞれのポリゴンメッシュの面に対して、ポリゴンメッシュ名と同じマテリアルを割り当て（Shade 3Dでは、1ポリゴンメッシュの面にフェイスグループとしてマスターサーフェスを割り当て）
* それぞれのポリゴンメッシュに1つのUVを用意。UV上の面は重ならないように配置しています。

Substance Designer上のテクスチャはマテリアルごとに割り当てられるため、メッシュ形状ごとに別のマテリアルを割り当てておく必要があります。
AO Map計算を行うだけなら、マテリアルの割り当ては不要ではあります。

![sd_21_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/1081bf56-71ac-4ce5-c316-0dd925e5f65d.png)

これをfbxでエクスポートし、Substance Designerに読み込みます。
Explorerビューの「xxx.sbs」を右クリックしてポップアップメニューを表示。
「Link」-「3D Mesh」を選択してfbxを指定。
Resourcesに読み込まれた3D形状を3Dビューにドラッグして反映します。
また、3Dビュー左下の「Scene Browser」ボタンをクリックして、Mesh名とマテリアル名が個別に割り当てられるのを確認します。

![sd_22_20150219.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/9ad3bd50-fdef-4739-7762-235f07fa62d0.jpeg)

### AO Mapのベイクを行う

1つのポリゴンメッシュでのベイクと同様に、ExplorerビューのResources内の3D形状を右クリックし、メニューより「Bake model Information」を選択。

Scene部はこんな感じになってます。
![sd_23_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/127b7cd0-4849-a0dd-455c-82f70a72b480.png)
ここのRootNode以外のチェックボックスは、「どのMesh上のUVを参照してベイクするか」となります。
全部チェックが付いている場合は、1枚のテクスチャに対して全部のAO計算が重なりますので今回の目的とは違います。
今回は、1つだけチェックします。まずは、centerだけチェックをOnにしてそれ以外をOffにします。

![sd_24_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/10826ae4-fa90-9465-b252-6dd75d37b0da.png)

Bakers部は、そのまま「Ambient Occlusion」だけを指定。

Baker Parameters部は「Use unselected Mesh Parts」をOn(True)とします。
これにより、Scene部で選択したメッシュだけでなく、他のメッシュも遮蔽計算の対象（衝突処理で参照）になります。

![sd_25_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/f5e52795-d962-2b7d-fc18-24cb120a8825.png)

Resource Nameのところを「\$(mesh)_\$(bakername)_center」のように、「_center」とメッシュ名を入れました。
その他、「Output Size」と「UV Set」は適切か確認。
![sd_26_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/8041ec12-2866-e419-319c-7e8ed82c69be.png)

これで、OKボタンを押してAO Mapを生成します。

ExplorerビューのResourcesフォルダ内にAO Mapのテクスチャが表示されました。
この段階でxxxx.sbsを保存すると、png形式でAO Mapが「xxxx.resources」フォルダに生成されているのを確認できます。

ExplorerビューのAO MapのテクスチャをカレントのGraphにドラッグし、Diffuseに結び付け。
このGraphを3Dビューにドラッグすると、どのマテリアルに割り当てるかのリストが表示されます。ここでは「center」を選択。
![sd_27_20150219.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/ecd986c7-ecc5-68f1-afd0-4f6da311c052.jpeg)

これで、3Dビューに「center」のマテリアルとしてAO Mapが反映されているのが確認できます。

### グラフを作成

では、その他のマテリアルも同様の処理を行います。
Explorerビューで「New_Graph」となっているのをcenterとマテリアル名と同じにしておきます。

xxxx.sbsを右クリックしたメニューで「New」-「Graph」でマテリアル名のグラフを作成しておきます。
グラフを作成すると、どのマテリアルに割り当てるかリストが表示されるので、対応するマテリアルを選択しておきます。

以下のようにグラフだけ先に作りました。
![sd_28_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/12b63eb7-2d9f-7042-af7c-c2dfd3438d22.png)

### AO Mapのベイクを行う その2

ExplorerビューのResources内の3D形状を右クリックし、メニューより「Bake model Information」を選択。

次にScene部で「center_box」のみをチェックし、それ以外をOffに。
![sd_29_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/f6732791-547d-d46c-0dfc-9bf56740ea92.png)

Resource Nameで「_center_box」とリネームしてOKボタンを押してAO Mapを生成します。

Explorerビューで「center_box」のグラフをダブルクリックすると、そのグラフがアクティブになるので、生成されたAO MapテクスチャをGraphビューにドラッグ。
AO MapテクスチャをDiffuseに割り当て。
すでに前の章でGraphとマテリアルは関連付けられているので、この段階で3DビューにAO Mapが反映されました。

同様に、すべてのメッシュのベイクを行います。

Explorerビューではこんな感じ。
![sd_30_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/9b3a6914-bc60-bf3a-f033-d08d976b43bd.png)

3Dビューではこんな感じで、AO確認できました。
![sd_31_20150219.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/f1fa3d1a-147e-d3dc-56db-27f621598e2e.jpeg)

最後に、保存先の実態である「xxxx.Resources」フォルダ内を確認します。
![sd_32_20150219.png](https://qiita-image-store.s3.amazonaws.com/0/62860/07b8bfa7-dbed-9aa2-a74f-49f1fb9179cf.png)
これで、他のツールに持っていくことでAO Mapとして活用することができますね。