PlayCanvasの標準マテリアルの各設定を見てみよう/BlenderのプリンシプルBSDFの設定も見てみよう

#始めに
PlayCanvasには、高品質なPhysical ShaderとレガシーなPhon Shaderが標準で備わっています。
複雑なShadingNetworkはGLSLでカスタムシェーダーを作成するとして、今回は標準のシェーダーを使ってどの程度の事が出来るか見ていきます。また、3DモデルをBlenderで作成し、PlayCanvasへインポートするという前提で、Blender2.8側の標準マテリアル"プリンシプルBSDF"の設定も簡単に見ていきたいと思います。

**BlenderとPlayCanvas上での見え方の違い**
**BlenderのプリンシプルBSDFの設定を簡単に見てみる**
**PlayCanvasのPhysicalMaterialの各設定を説明**
**シーン全体の環境マップ/オブジェクト単位での環境マップ設定**

今回は特にPlayCanvasでのマテリアルの各スロットルの内容、どんなテクスチャマップをアタッチするとどう3Dモデルに影響を与えるかを説明していきたいと思います。
#BlenderとPlayCanvas上での見え方の違い
設定されている環境マップとライト設定が違うので色味やシャドウの濃さが違ってますが、大きく違うのはSpecularとGlossinessの感じですね。Blender側のマテリアルはテクスチャをアタッチしていない項目に関しては全て0.000にしてあります。PlayCanvas側も同じくテクスチャがアタッチされている項目以外はデフォルトの状態です。大きな差異ではないですが、100%同じ質感をPlayCanvas側に持って行くのは難しいです。
![ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/eac86cad-707d-02ff-839d-02a6c8f16290.png)

#BlenderのプリンシプルBSDFの設定を簡単に見てみる
![blenderm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/8f073bbe-c684-a1ce-b734-282d8ed59fd3.png)

ベースカラー/スペキュラ―/スペキュラ―の粗さ/放射(エミッシブ)/アルファ(透過)/ノーマル(法線マップ)
このへんの基本的なテクスチャをアタッチしてあります。
異方性やクリアコートなんかの設定はPlayCanvas側のマテリアルにはないので、今回は使用してません。
この設定のまま、**".fbx"**にエクスポートして、PlayCanvasのビジュアルエディターにドラッグ＆ドロップしてみると…
![date-import1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/16fefab6-fd08-20ea-63ad-5d02e91222df.png)
![date-import2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/eb500395-b502-bca0-fc77-8025a66c2ce9.png)
.fbxの設定が問題なく行われていると、オブジェクト個数分のマテリアルスロットと使用されているテクスチャがPlayCanvasのASSETE欄に展開されます。
しかし！！Blender上で設定していたエミッシブやアルファテクスチャが反映されてません。どうやらPlayCanvas側に継承できるマテリアルの内容はDiffuse、Specular(Glossiness)、normalmap(法線マップ)だけのようです。Emissiveとアルファに関してはソフト間の処理の違いや設定項目の差異で持って行けない？ようです。
なので、手動でアタッチしていきます。
#PlayCanvasのPhysicalMaterialの各設定

![pcm1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/11773e56-8896-0322-55ed-5db16f76ccb6.png)
上記の画像がPlayCanvaのPhysicalMaterialの項目一覧です。
Diffuse/pecular/Opacity/Normal等、基本的な項目の他に、Ambient(アンビエントオクルージョン)やParallax(視差マッピング)、マテリアル個別に設定可能なEnvironment(環境マッピング)、静的なオブジェクトの場合に使用できるLightmapなんかもあります。
では、今インポートしたモデルのマテリアル設定を一旦剥がして、個々にどんな効果が得られるか見ていきましょう。
![nomaterial.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/5644bdf6-ddfe-1487-52b3-ee304622a1a6.png)
シーン全体の環境マップも取り除いてみるとこんな感じ。ちなみに、左下の歯車マークからセッティングに行き、RENDERINGタブ内に環境マップの設定があります。ここではキューブマップをアタッチ出来ます。
![seane_environment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/17ec94ba-f60f-d771-cc6b-0096bd11c070.png)
環境マップに関しては最後らへんで解説します。

##Diffuse(カラー)
まずはキャラクターと乗り物の部分のカラーをアタッチしていってみます。
シーンビュー上で対象のオブジェクトをダブルクリックすると対応しているマテリアルが選択されます。
![setup1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/a5e1ced3-d681-eb83-0ed4-16c4eccaf304.png)
右側の球マークをクリックするとマテリアルの各設定スロットルへ行きます。DIFFUSEをクリックし、画像をアタッチしてみると
![setup2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/c573e66e-d1d0-4dc5-d270-fffcf8fbe276.png)
キャラクターの髪とその他ボディと乗り物のマテリアルにDiffuseだけ設定しました。
見えにくいんで、一旦環境マップを設定します。
![setup3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/bdd1a6ee-5c9c-152e-4771-3588563dbd20.png)
##Ambient(アンビエントオクルージョン)
アンビエントオクルージョンとは、シーン内の環境光（ambient）がどの程度さえぎられている（occlusion）かを計算するレンダリング方法のことです。blender上で生成出来ます。
![blender_Ao.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/9d6a8988-7aea-3a8a-ba8e-68a32c81004f.png)
こんな感じの陰影情報です。blender アドオンの["TexTools"](https://github.com/SavMartin/TexTools-Blender/releases)を使うとワンクリックで生成できます。
マテリアルのスロットル欄にドラッグ＆ドロップすると下図のような効果が得られます。
![blender_Ao_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/fe01c0bd-1702-c683-e0af-d6ecfb46154e.png)
これにより、オブジェクトの凹凸の端々や、キャラクターに遮られた椅子部分などに影効果が追加され立体感と深みが増しました。
##SPECULAR(鏡面)
**"Speclar＆Glossiness"**もしくは**"Metalness＆Glossiness"**
金属を表現する際に使用します。まず、Glossinessの値をMAXに上げてみます。
![blender_Grossiness_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/7c76c161-cabf-722e-1628-19319a8fae10.png)
環境マップの画像をガッツリ反射してますね。ただし、椅子にもメタル感が出ちゃってます。ここにSpeclar用に作成した白黒テクスチャをアタッチしてみます。黒い部分はメタル感が消えます。
![Galvanized_steel_01_2K_Roughness.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/58b8eeea-ba75-07eb-44e0-6544c5046bfa.png)
![blender_Grossiness_tex_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/af21bdd9-98f0-94e5-6973-a55fee0eb09c.png)
椅子部分のメタル感が消え、乗り物のボディ部分の強すぎるメタル感が緩和されました。ただ、まだ椅子部分や砲身部分の光が気になるので、Specularにテクスチャを入れてみます。
![blender_specular_tex2_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/5058b88d-594a-e4fd-6092-0361d5d2cb87.png)
椅子の光沢感が消え、砲身のディテールが見えるようになりました。"Tint"にチェックを入れカラーを入れると、金属の光沢(反射)部分に色味が入ります。
##EMISSIVE(放射)
自己発光している部分です。このオブジェクトの場合は光のライン部分を発行させてみます。
![body_emmisive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/52e7b345-cdf4-1174-a881-b668204685fb.png)
ライン部分のカラーを抽出し、その他は黒で。
![blender_emissive_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/55acffda-2828-b913-e278-ef99c6070287.png)
intencityの数値をMAXにすると上図のように強く発行しているような状態になります。
##Opacity(透過)
黒部分を透過します。今回は窓部分を半透明にしたいので、下図のような簡単な白黒テクスチャをアタッチします。
![body_alpha.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/39bb26f5-a603-6cbf-8e41-2a8194ab399e.png)
![blender_opacity_tex_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/1526e89c-0590-ded5-6c67-ee161876b735.png)
Blend TypeをAlphaにすると黒部分が透過されます。また、透過のタイプも複数あるので、用途によって使い分けることができます。
![blender_opacity_type.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/4c247499-4cbf-dec8-1037-13b5f69a66cd.png)
"intensity"の数値を0に近づけると前面部分が全て透過され、オブジェクトのシルエットのみとなります。
また、"Alpha To Coverage"にチェックを入れると、チラつき防止効果がでます。
![blender_opacity_tex_set2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/46be945f-4924-649c-831d-3dff136d8850.png)
##Normal(法線マップ)
オブジェクトの表面に疑似的な凹凸を発生させます。
![body_normal_base.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/c1f81388-447b-1a07-03df-0632985d7ea2.png)
NormalMapはBlenderのベイク機能やアドオン、Photoshopなどで生成可能です。生成方法はまた別の機会に書きたいと思います。
![blender_normal_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/9f8a8191-5c2b-9938-cff5-e63047fdb85c.png)
滑らかな金属表面に凹凸が入ることで光の反射が複雑になり、"年期の入った感じ"になりました。
##Parallax(視差マッピング)
白黒の画像から高低差を疑似的につくるマッピング方法です。ハイトマップをアタッチします。
今のオブジェクトでは分かり辛いので、地面のひび割れオブジェクトで効果の差異を見てみます。
![landscape1_parallax.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/bb68dad5-9660-b0f8-9971-fbfba8d40861.png)
![blender_parallax_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/77542ba3-6b20-a693-2b52-f86db26fb1eb.png)
"Strength"の値を上げ過ぎると高低差を維持出来なくなります。
![blender_parallax_set2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/4cf0cf72-580e-7661-00d6-b841590309a9.png)
##Environment(環境マッピング)
オブジェクト個々に設定できる環境マッピングで、CubeMapをアタッチします。シーン全体は、左下の歯車マークからセッティングに行き、RENDERINGタブ内から設定しますが、ここで設定した環境マッピングはシーン全体の効果よりも優先的に描画されます。"Sphere Map"と"Cube Map"を使用することができます。![blender_environment_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/24c44e69-edb2-4bc3-49ae-17ea48496efb.png)
##Other
Cull Modeで描画の順番を手前からか、後ろから優先するかを選べます。ライトの効果を切ったり等々。

##おまけ　CubeMapの作り方
ここに.pngの画像をドラッグ＆ドロップすると生成してくれます！便利！
[Cubemap and TOAST map Generator](https://jonaszeitler.se/cubemap-toastmap-generator/)
![blender_cubemap3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/311ff13d-d062-a4ce-7bb1-9e760eb50c43.png)
ASSETSで作成したフォルダを選択状態にし、ASSETS右横の"+"をクリック、CubeMapを選択すると、空の"New Cubemap"が生成されます。
FACES欄の中に、Cubemap and TOAST map Generatorで生成した各画像をドラッグ＆ドロップして全てのマスを埋めます。
![blender_cubemap1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/da0ddbf5-c769-87da-1554-8013cc0b3925.png)
画像を全て配置すると、下部に"PREFILTERING"という欄がでますので、"Prefilter"ボタンを押してください。これで、環境マップに適した状態に変換してくれます。
![blender_cubemap2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341892/ad186f41-cbd7-3c38-1e81-031693b69e78.png)
これでCubeMapの完成です。

まだ、解説しきれてない部分が多々ありますが、PlayCanvasの基本的なマテリアルの設定方法は以上となります。