■ 説明
Substance Painterで何をExportして、mentalray for Mayaのmia_material_xにどのように適用すればよいかです。
このTipsは個人検証した結果ですので、ご了承下さい。
最初に注意していただきたのは、mia_material_xはMicrofacetの計算にGGXを採用していません。
そのため、その部分の計算を完全に一致させることはできません。ご了承ください。
Vrayだとこの計算が採用されているShaderがあるのでかなり近似できるのではないかと思います。
[V-Ray 3.0 Maya] Microfacet GTR (GGX) BRDFに関してはOAK様のサイトをご参照ください。
http://oakcorp.net/app-def/S-102/blog/archives/3881
使用したバージョンは、Maya2016 Ext1 SP3とSubstance Painter 1.6.1です。
SubstancePainterでmia_material_x用の出力プリセットを作成しましょう。
今回は最低限必要なチャンネルのみつくっていて、AOやEmissiveは計算にいれていません。
Config Settingsで新しいプリセットを作り、下記のように作成します。
Diffuseはそのまま拡散反射の色に使用します。
Specularではなく、ReflectionをExportします。
SubstancePainterにてMetallicが0の時は白を出力し、Metallicが1の時は、BaseColorに設定された金属反射の色をReflectionマップに描きだします。
Microfacetは、Glossinessとして出力します。値は、Roughnessの反対になります。
そして、F0マップを出力することで、BRDFのF0の値を出力することができます。
SubstancePainterでMetallicが0の場合、この値は0.04で出力され、Metallicが1.0の場合、この値は1.0で出力されます。
mia_material_xも、F0の値を設定することが可能です。Frenel Reflectionを使用するのではなく、F0に値を入れることによって、非金属と金属の両方を表現することができます。
必要なチャンネルをExportしたら、Mayaで設定します。
ここで重要なのは、SubstancePainterから出力したGlossinessをmia_material_xにそのまま接続しても同じ結果は得られないという点です。
非金属の場合、Rougness = 0.5(Glossiness = 0.5)
金属の場合、Rougness = 0.5(Glossiness = 0.5)
Glossinessは単一のFloatなので、RemapValueを使用して、値をマッピングしなおします。
一度この値は決めておけば、常に同じ設定を使えばいいので難しくはありません。
このような感じでマッピングしました。
これでも反射が完全にマッチするわけではないのですが、近づけることができます。
Rougness = 0
Rougness = 0.1
Roughness = 0.2
Roughness = 0.3
Roughness = 0.4
Roughness = 0.5
各チャンネルをFileノードに読み込んだときのColor Spaceを下記のように設定します。
各マップを接続するアトリビュートは以下になります。
mia_material_x及びマテリアル側で必要な設定は以下になります。
mia_material_xのReflectivityは1.0です。
Glossinessの計算を軽減かつなめらかにするために、SGにmia_envBlurを接続しました。
これは接続しなくても構いません。Glossinessの値が下がってラフになっているとその部分をなめらかにするにはサンプルを増やさなくてはいけないので、回避するために使っています。
SubstancePainterのサンプルシーンHansを使用してmia_material_xとSubstancepainterで結果を比べてみました。
HansのMeshデータはこちらからダウンロード可能です。
https://share.allegorithmic.com/libraries/113
最後の問題です。
この設定方法は、F90を全部Glossy Reflectionで計算して、Gossinessで拡散光のような状態にしています。
そのため、非金属でGlossinessを高くして、拡散光計算に見せている部分はエッジ部分が反射して白く見えてしまう場合がでてきます。
その場合、該当部分のF90部分の反射率1.0を下げるようなマップを適用するといいでしょう。
この場合は、GlossinessにRemapを追加してF90用のマップをつくっています。
表面が非常に滑らかな場所はエッジが光を反射するのでGlossinessが1.0はそのままで、表面が非常にラフな部分はリマップで反射率が下がるような設定です。
そうすると先ほどの絵のような光沢のない部分のエッジが光ってしまう現象を防ぐことができます。
SubstancePainterのリアルタイムシェーダーではこの現象が起きないので、Roughnessが高い部分のエッジが光らないような処理が行われているだと思います。