シャーロちゃんをblenderでいじる-マテリアル統合編-

関連記事

* [シャーロちゃんをblenderでいじる時の注意点][pre-link]

## まえおき

以前書いた [シャーロちゃんをblenderでいじる時の注意点][pre-link] 記事の続き、マテリアル統合についての記事になります。
[Cats Blender Plugin][cats] と [Material Combiner][mat-combine] をインストールしている前提です。

[Performance Ranking System][ranking] [^1]に対応するため、使用するマテリアル数を少なくしてアバターの最適化・軽量化をしていきます。
また、メッシュオブジェクトについてもまとめていきます[^2]。

実施環境：

|Soft |Version |
|---|---|
|Blender |2.79b |
|Cats Blender Plugin |0.13.3 |
|Unity |2017.4.28f1 |
|VRChat SDK |2019.07.31 |
|Shaclo |1.2.2 (shoesモデル) |

以下の作業に入る前に、統合前のデータについてバックアップを残しておく、もしくは `git` などバージョン管理ツールを使うことを推奨します。
「ぎゃー！？やっちまった！？」率高いので……（個人調べ）

[^1]: PC版が対象。今回の記事ではOculus Questは対象外
[^2]: ボーンについても少なくするべきですが、今回は扱いません
[^3]: おそらくマテリアルが適用される範囲が複数メッシュオブジェクトに分散しているせいかなぁ

## マテリアルの仮統合（手作業）

マテリアル統合には `Cats Blender Plugin` の `Texture Atlas` の機能が便利です。
ただしこの機能を直接シャーロちゃんに適用するとおかしくなる[^3]ので、まずは下準備として手作業でマテリアルをまとめておきます。

一度手作業で以下の6つのマテリアルを新規作成してまとめていきます。
このときにテクスチャの割り当ても行います。

|部位 |新規マテリアル |適用するテクスチャ
|---|---|---|
|身体（含む包帯） | **Mat_Body** | `Tex_Schalo_Body`
|顔 | **Mat_Face** | `Tex_Schalo_Face`
|髪の毛 | **Mat_HairFront** , **Mat_HairBack** | `Tex_Schalo_Hair`
|瞳、眉 | **Mat_Stensil** | `Tex_Schalo_Puppli`
|服、靴、腕輪、ヘアピン | **Mat_Costume** | `Tex_Schalo_Costume`

* 瞳や眉をシェーダーのステンシル機能で前髪の上に描画できるよう、前髪用と後ろ髪用のマテリアル（ `Mat_HairFront` と `Mat_HairBack` ）に分けています。
* テクスチャについては同梱の `.psd` ファイルそのままだとファイルサイズが大きすぎるので、
  `.png` ファイルに変換したものを割り当てるようにしたほうがいいです。

### マテリアルの仮統合の手順

1. オブジェクトを選択
2. `編集モード` に変更
3. 頂点の選択状態を解除（何も選択していない状態にする）
4. 統合元マテリアルを選択
5.  `選択` をクリック
6. 統合先のマテリアル（ *Mat_Body* など ）を選択
7.  `割り当て` をクリック  
  このとき選択状態の頂点が、選択中のマテリアルだけの適用範囲になる（排他的）  
  つまり元のマテリアルの割り当て範囲が統合先に移譲される
8. `選択解除` をクリックして選択状態が解除されることを確認
9. 割り当て範囲がなくなった元マテリアルを `削除` （ `オブジェクトモード` でする必要あり）  
  ![material-combine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/4683efe3-4666-af52-1966-e90cc6ddc119.png "マテリアルの統合")

具体的な対応表：

|オブジェクト|元マテリアル|統合先マテリアル|
|-----|:---:|:---:
|Body |M_C_face_01 |Mat_Face
||M_C_pupilL, M_C_pupilR, M_C_kutu |Mat_Stensil
||M_C_hair |Mat_HairFront
|shaclo_body |すべて |Mat_Body
|shaclo_boots |すべて |Mat_Costume
|shaclo_costume |すべて |Mat_Costume
|shaclo_hair |M_C_hair_01 |Mat_HairFornt
||M_C_hair_02 |Mat_HairBack
|shaclo_hairpin |すべて |Mat_Costume
|shaclo_udewa |すべて |Mat_Costume

また、作成済みのマテリアルをオブジェクトに追加したい場合は

1. マテリアルスロットを追加
2. 左マテリアルアイコンをクリック
3. リンクするマテリアルを選択
  ![material-apply.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/a6639640-b509-568e-f7d2-9f4c06368757.png)

### マテリアルにテクスチャを割り当て

上記でまとめられたマテリアルにテクスチャを割り当てておきます。

1. 対象のマテリアルを選択
2. `テクスチャ` タブを開く
3. テクスチャを `新規` で作成
4. 任意の分かりやすい名前をつける
5. このテクスチャに割り当てる画像を `開く` から設定  
   ![material-texture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/d8a7fae7-0c93-8c5b-be94-6321401c7bea.png "マテリアルにテクスチャを設定")

## マテリアルのディフューズを白色に設定

`Texture Atlas` 機能で生成される画像はマテリアルのディフューズに影響されるみたいなので、白色にして影響を受けないようにしておきます。

1. `マテリアル` タブを開く
2. 新規作成した *Mat_~* マテリアルを選択
2. `ディフューズ` 項目の色選択部分をクリック
3. `16進数` で `FFFFFF` と入力して白色に設定  
   ![material-defuse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/1c0820c2-741b-fcfe-2070-4fbdca5dc6a2.png "マテリアルのディフューズを白色に設定")

## メッシュ統合

マテリアル統合する前にメッシュを統合しておきます[^5]。
すべて1つにまとめるとおかしくなったので、 **`Body` メッシュ（顔）以外** をまとめます。

1. `Body` 以外のメッシュオブジェクトを選択（ `Shift` キー押しながらクリック ）
1. 左 `ツール` シェルフ -> `CATS` タブ
1. `Model Options` を開く
1. `Join Meshes` の `Selected` を実行して選択中のメッシュオブジェクトを統合  
    ![mesh-join.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/26a5477f-6356-50d7-fa25-553a54bd3d00.png)

[^5]: マテリアル統合後にメッシュを統合したらおかしくなったので

## マテリアルの統合（最終）

`Cats Blender Plugin` の `Texture Atlas` を使って統合します。

左 `ツール` シェルフ -> `CATS` タブ から

1. `Optimization` 項目を開く
2. `Atlas` タブを開く
2. `Generate Material List`
3. 統合するマテリアルにチェック  
   今回は *Mat_Body* 、 *Mat_Face* 、 *Mat_HairBack* にチェックしてまとめる
4. `Save Atlas to..` でAtlasを保存
5. *combined_material_xxx* というようなマテリアルに統合される  
    ![material-atlas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/2aaa3e61-0809-0296-0f3c-d5b14e44fab7.png "マテリアルの統合")

* マテリアル数を増減したい場合は手順 *3.* においてチェックを入れるマテリアルを調整してください。
* マテリアル数は4以下が推奨されています[^6]。

[^6]: `Cats Blender Plugin` で *ExportModel* 時に警告される

### `Save Atlas to..` でエラー

`Save Atlas to..` でエラーが発生してAtlasが保存できずマテリアル統合もできない場合があります。

この場合、シャーロちゃんの適当なオブジェクト（例えば `Body` ）を選択してから実行すれば大丈夫かもしれません。

## Unityでのマテリアル設定

マテリアルを統合した場合は元々のシャーロちゃんのマテリアルをそのまま流用はできません。
よって自分でマテリアルを調整する必要があります。
オリジナルのシャーロちゃんの設定を参考にしながら調整してみてください。

*Unity 2017* における `FBX` のマテリアル設定は次のようになります。

1. FBXファイルと同階層に *Materials* フォルダと *Textures* フォルダを作成
1. *Textures* フォルダにテクスチャをコピー（上記で生成された *combined_material_xxx.png* ファイルも含む）
1. FBXファイルを選択
2. `Inspector` から `Materials` タブを開く
3. `Extract Materials` を実行し、マテリアルを *Materials* フォルダに展開する  
4. 展開されたマテリアルを、オリジナルを参考にしながら調整する  
    ![unity-material.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/02281933-932a-73fe-ecc6-47cbe4eb8754.png "Unityでのマテリアル展開")

### ユニティちゃんトゥーンシェーダー2.0

ユニティちゃんトゥーンシェーダー2.0（© UTJ/UCL）を使う場合、アウトラインが目の周りや唇にかからないようマスク画像[^4]を作成します。
マスク画像の作成では、*combined_material_xxx.png* の顔部分をオリジナルの *Tex_Shaclo_Face_Outline.png* で上書き加工するのが簡単だと思います（顔以外は白で塗りつぶし）。

作成したマスク画像はマテリアルの `Outline_Sampler` に設定します。

[^4]: 白色でライン幅100％、黒色でライン幅0％＝ラインなし

## あとがき

マテリアル統合むずかしい。
あまりに長文になるので新しい記事にしました。それでも読みにくいのはゆるして。

アバターの軽量化ができたら `VRM` 形式への変換やVRChat以外のプラットフォームへの導入がしやすくなるので、この記事が役に立てば幸いです。

## 参考

* [Cats Blender Plugin][cats]
* [Avatar Performance Ranking System][ranking]
* [VRChatのアバターのマテリアルを解説【統合して１つにします】 | ShinrinMusic.com][cats-atlas]

[pre-link]:https://qiita.com/akiakishitai/items/26d27588ea10d30d7100
[ranking]:https://docs.vrchat.com/docs/avatar-performance-ranking-system
[cats]:https://github.com/michaeldegroot/cats-blender-plugin
[mat-combine]:https://vrcat.club/threads/material-combiner-blender-addon-2-0-3-2.2255/
[cats-atlas]:https://shinrinmusic.com/vrchat-avatar-material/