V-Ray と ZBrush、 Substance 3D Painter ワークフロー 「マテリアルID」編

※この記事を書いた時点で筆者はSubstance 3D Painter歴が短い為(1年未満)、間違いがあるかもしれませんご指摘いただけると助かります m(_ _)m

数年前から、多くのユーザーがAdobe社の Substance 3D ツール(特にSubstance 3D Painter)を使用して、プロジェクトのテクスチャやマテリアルを作成してる事が知られています。サブスタンスツールは素晴らしい質感表現テクスチャを作成できる非常に優秀なツールで、もはや3D業界のスタンダードアプリケーションと言っても過言では無いでしょう。

Substance 3D Painterでは、ユーザーがPBR環境でリアルタイムにアセットに直接ペイントして見た目(Look)確認できます。PBRで質感を設定できる事から、多くのPBRをサポートしたレンダラーに対しても同じ質感を出力できる点は非常に大きいでしょう。Substance 3D Painterで作った質感は、V-RayでもUnityでも、Unreal Engineでも、ARNOLDでもRedShiftでも、Cyclesでも、RenderManでも同じ質感になります。これはコンテンツを作る側としては非常に魅力的ですね。

Substance Painter内のV-RayシェーダーとV-Rayテンプレート

Substance Painter 2020.1 (6.1.0)にて、Adobe社はSubstance Painter内にV-RayMtlビューポートシェーダー(GLSLベース)を実装し、Substance Painterの結果がVRayでのレンダリングとほぼ一致させる事がより簡単になっています。

Substance Painterのビューポート表示用シェーダーとして利用できる “vtaymtl-metalic” と “vratmtl-specular”のシェーダー。こちらはV-Ray用のプロジェクトテンプレートで自動的にセットされます

また、新規プロジェクトのテンプレートとして”VRay Next (Metalic Roughness)” と “VRay Next (Specular Glossness)”もデフォルトでサポートされています。ユーザーはSubstance Painter からこのテンプレートで出力されたマップを適切なV-RayMtlのスロットに追加するだけでよいのです。

Substance 3D Painter のデフォルト V-Ray用テンプレート

なおこのSubstance 3D PainterのV-RayMtlシェーダー(GLSLベース)はCHAOS社でコーディングされ、Substance Painter内に統合できるようにAdobe社に提供されました。VRayMtl(GLSLバージョン)では、Substance内でVRayMtlパラメーターを可能な限り厳密に表すことができるため、ラスタライズ・レンダリングでも可能な限り一致させることができます。(VRayMtl GLSLバージョンはオープンソースで公開されています)

Metallic Roughness か、Specular Glossiness か

過去の記事「V-RayのMetalness ワークフロー」を読んだ方は覚えているかもしれませんが、多くの3D CGユーザーがPBR用マテリアルをどのように使用するかを説明しました。PBRマテリアルを採用している多くのリアルタイム系エンジンはラフネス(roughness)マップを基準としており、現在のV-Ray (Next以降)は ラフネス(roughness)をサポートしています。(V-Ray 3まではラフネスマップの逆の意味であるグロス(Glossiness)マップを基準としています)。なお、Substance 3D Painterに実装されているV-Ray用テンプレートは「ラフネス(roughness)」と「グロス(Glossiness)」の両方に対応しています。

簡単に言うと、V-Ray 現在のバージョン(Next以降 V-Ray 5, V-Ray 6)では ラフネス(roughness)テンプレートを使用してください。
V-Ray 3 以前のバージョンを使う場合のみ グロス(Glossiness)テンプレート使って作成してください。

このチュートリアルでは「ラフネス(roughness)テンプレート」を中心に解説します。

※V-Ray 3以前のグロス(Glossiness)テンプレートでは反射率をコントロールするIORチャンネルのペイントがSubstance 3D Painterのビューポートシェーダーに反映されない為、Substance 3D Painter上で部分的にメタルの質感を表現する事ができません。

BPRマテリアルの利点

PBRマテリアルの大きな利点の1つに「殆どのレンダラーで共通して使える」点があります。
PBRベースで作っておけば、V-Ray, Corona Render, ARNOLD RENDER, RedShift, Cycles 等のオフラインレイトレーシングレンダラーから、Unity, Unreal Engine, Eevee 等のリアルタイムのラスタライズ系エンジンまで共通して利用できる点です。これはアセットの資産価値として非常に意味があります。

もう1つ、PBRマテリアルでは1つのマテリアルで「非金属(木材・プラスチック・ゴム)」「金属」「ガラス(アクリル)」を表現できるという点があります。簡単にいうとパラメーター(マッピング)を部分的に変えるだけで「金属」「非金属」「ガラス」切り替えできるという事です。

その為、1つのマテリアル内でもテクスチャーを使ってパラメーターを変えてあげれば部分的に「金属」「非金属」「ガラス」を表現できる事になります。わざわざ「金属」「プラスチック」「ガラス」など、異なる質感別に複数のマテリアルを作成して割り当てる必要がありません。
つまり1つのBPRマテリアルを作成し、マップ(マスク)でオブジェクトの部分(パート)を「金属」「非金属」「ガラス」に塗り分ける事ができるという事です。

しかし、この方法には短所もあります。最終的なレンダリングソフト側で部分(パート)の調整が難しい事です。例えば、ある部分のプラスチック部分の色調だけ変更したり、ある部分にだけプロシージャルテクスチャを追加適用したい等です。

この問題はいくつか解決方法があります。
・マテリアルのチューニングはSubstance 3D Painter側で行うと割り切る
・パートを別オブジェクトに分割し、複製したマテリアルを割り当てて、複製したマテリアルだけにチューニングを適用する
・IDマスクを使って3Dアプリケーション側のシェーディングツリーをマスクする

Substance 3D Painter V-Ray テンプレートとVRayMtlの対応チャンネル

Substance 3D PainterではVrayMtl Metalic Rougnessテンプレートを選択してプロジェクトを開始した場合、前提として Substance 3D Painter上でのVRayMtlのデフォルト設定は、以下の様になっています。

・Diffuseカラーは白 (1.0,1.0,1.0)
・Reflectionカラーが白 (1.0,1.0,1.0)
・BRDFが”Use roghness”にスイッチされ、Roghness 値は 0.3
・フレネル反射有効

注意すべき点は、VRayMtlの Reflection(反射)カラーが「白」(SPのシェーダー設定で”反射量”が1.0)でBRDFが”Use rophness”モードにスイッチされ、Roghness 値が 0.3 という事です。

3dsMaxでSubstance 3D Painterの”VrayMtl Metalic Rougnessテンプレート”デフォルトマテリアルを再現した物です。
(右のレンダリング画像はV-RayDomeライトにSPのデフォルトHDRIセットし、Cast Shadow無効、GI OFFにしてビューポートIPRしています)

対応するチャンネルは以下の図の様になっています。
Reflection Colorは「白」、BRDFのモードが roughnessモードになっている事が前提です。
極端に違う単語として「Height」 がVRayで言う「Bump Map」、「Transmissive」 がVRayで言う「Refraction Color」です。

Substance 3D PainterのV-RayテンプレートとVRayMtlの対応図

これを把握している事で、Substance 3D Painterで塗っているチャンネルがクリアになると思います。

ZBrush, Substance 3D Painter のワークフロー

Substance Painter では、大きく分けて「マテリアルIDベース」と「UVタイルベース」の2つのワークフロースタイルがあります。

マテリアルIDベースのワークフロー

マテリアルIDベースのワークフローでは、「マテリアルID」(実際には頂点カラー)単位で、オブジェクトやUVテクスチャーを管理する方法です。いわゆる「1オブジェクトにつき1テクスチャーセット」になる最もシンプルな考え方のワークフローですね。

このワークフローの欠点は「複数のオブジェクトにまたがってペイントできない」があります。複数のオブジェクトにまたがってペイントする場合はUVタイルベースのワークフローを取ってください。

まずはモデルの準備です。以下の様にZBrushでロココ調の椅子を作成してみました。この時点ではトポロジー、ポリゴン数は気にしていません。

 

モデリングが終わったら、ZRemeshder等を使い、綺麗なトポロジのローポリゴンモデルを作成します。必ずハイポリゴンモデルと同じ位置にローポリゴンモデルを作成してください。
ローポリゴンモデルにUV Master等でUVを作成しておきます。(もちろん3dsMax等他のソフトでUV展開しても構いません。GoZが便利です。)
(ZBrush内でローポリオブジェクトをDiviteして、オリジナルのディテールをプロジェクションしておく必要はありません。)

ローポリゴンオブジェクトを FBX形式でエクスポート(low.fbx)します。ローポリゴンモデルはUVを持っている事が非常に重要です。
なおローポリゴンモデルのサブツールがSubstance 3D Painterでのテクスチャーセットになります。今回のモデルは以下の様な構成になっています。

 

次に、ハイポリゴンモデルを DecimationMasterを使って、ディテールが崩れない程度にポリゴン数を削減します。
ポリゴンを削減したハイポリゴンモデルを、同じく FBX形式でエクスポート(high.fbx)します。

Substance 3D Painterを起動し、新規プロジェクトで「VrayMtl – Metalic Roughness (starter_assets)」を選択します。ドキュメント解像度を好みの解像度(2048以上推奨)にセットし、ファイルから ローポリゴンモデルのFBXファイル(low.fbx)を読み込みます。

Substance 3D Painterにローポリゴンモデルが展開されます。テクスチャセットがZBrushのサブツール名で構成されている点に注目してください。

 

テクスチャセットの設定ウィンドウから「メッシュマップのベイク」を実行します。
ハイポリに ハイポリ用に出力したFBXファイル(High.fbx)をセットします。出力サイズは希望するサイズ(2048以上推奨)をセットします。ベイクするメッシュマップチャンネルはデフォルトです。(ハイポリとローポリゴンモデルはZBrush上で同じ位置に存在していた事が重要です。)

 

ベイクが完了すると、ローポリゴンモデルにハイポリモデルのディテールが法線マップ等として転写(プロジェクション)された詳細なモデルが表示されます。
これでペイントの準備が整いました。

ここではSubstance 3D Painterのペイント作業の詳細については触れませんが、以下の様にペイントを完了させます。

なお、椅子の座面についている金属パーツと背もたれ上部に付いている宝石パーツは同一オブジェクト(同一のテクスチャセット内)でマスクによって質感を塗り分けています。
いわゆる Metalic が 1.0 のレイヤーと、Transmissive が白のレイヤーをレイヤーマスクで指定のUV範囲にのみ適用しています。

 

ペイントが完了しましたらテクスチャを書き出します。出力テンプレートとして「V-Ray Next (Metalic Roughness)」をベースに使用します。
なお殆どのケースで必須のチャンネルはBaseColor, Roughness, Metallic, Height, Normalです。

透明マテリアルをペイントしている場合はTransmissiveチャンネル、自己発光マテリアルを使っている場合はEmissiveチャンネルを使います。
AnisotropyAngle, AnisotropyLevel は異方性ハイライトを持つマテリアルを作る場合に使用しますが、使用頻度は低いかもしれません。

デフォルトのVRayテンプレートを複製して、不要なチャンネルを削除したテンプレートを作成します。
なお、メッシュマップをベイクでambient occlusionが計算されている場合、Substance 3D PainterのビューポートにはAOが初期設定では0.75の強度で適用されています。


なので、カスタムのテンプレートに「グレー」のチャンネルを新規に作成し、Ambient occlusionの出力を追加します。チャンネル名はAOとします。
ファイル名は  「$textureSet_チャンネル名」の様にセットします。(プロジェクト名等は好みで追加してください。)
今回作成したカスタムテンプレートでは、BaseColor, Roughness, Metallic, Normal, ID, AO, Transmissive の7つのチャンネルを出力します。

カスタムしたテンプレートを使ってテクスチャーを書き出します。ビットマップのデプスは 16bitでも構いませんが、リアルタイム用途でも使う場合8bitでも十分かもしれません。

 

オブジェクト(Subtool)毎に7つのテクスチャーのセットが出力されます。「オブジェクト名(SubTool名)_チャンネル名.拡張子」になっている事に注目してください。

ローポリゴンモデルのFBXを3dsMaxに読み込みます。オブジェクト名がZBrushのサブツール名で読み込まれている点に注目してください。

早速テクスチャーをセットしていくのですが、3dsMaxには標準で「PBR マテリアルを読み込み」ユーティリティがあります。V-Rayでもこの機能で読み込んでもレンダリングできます。しかしながらこのユーティリティで設定される「BPRマテリアル」は V-Ray GPU ではレンダリングできない為、V-Rayネイティブの読み込みを使用する事をオススメします。

まず、スレートマテリアルエディタで VRayMtl と5つの VRayBitmap (BaseColor, Metallic, Normal, Roughness, Transmissiveのチャンネル用)を作成し、とりあえず1つの任意のオブジェクト用のBaseColor, Metallic, Normal, Roughness, Transmissiveマップを読み込みます。
※3dsMax標準のビットマップ読み込みはここでは使用しません、必ずVRayBitmap経由でテクスチャを読み込んでください!

また VRayNormalMapも作成し、以下の図の様にNormalを接続してください。
VRayMtl の Reflectionカラーを「」、BRDFのモードを“Use rouphness”モードにセットし、VRayNormalMapを接続したBumpの量を初期値の30から100に変更する点に注意してください。

作成したVRayMtl をローポリゴンモデル全てのオブジェクトに割り当てます。つまりローポリゴンモデル全てで同じ1つのマテリアルを使います。
適当な照明を作成してレンダリングすると、当然ながらまだ1つのマッピングセットしか読み込んでいないので全てのパーツが同じマップ(質感)になります。

ここでVRayBitmapの便利機能「ユーザー定義プロパティでパスを置き換える」を使用します。

VRayBitmap にセットしてあるテクスチャの オブジェクト名部分を <name> と入力して置き換えます。
そして、例えばクッション部分のオブジェクトのオブジェクトプロパティウィンドウを開き、「ユーザー定義」タブで name = オブジェクト名 を入力します。
ここではオブジェクト名が down_ch なので name = down_ch を入力してOKします。

これで、VRayBitampで読み込まれるテクスチャの <name>部分が、ユーザ定義プロパティの name = から引用されます。(このnameという単語は、ユーザー定義プロパティと同じタグであれば単語は好きな文字で構いません。)

 

全てのVRayBitmapのパスのオブジェクト名部分を <name>に置き換えます。

レンダリングしてみると、3dsmaxのユーザー定義プロパティに name = のタグがセットしてあるオブジェクトにだけ、そのテクスチャーが割り当てられているのが確認できると思います。

それでは、全てのローポリオブジェクトのユーザー定義プロパティに「name = オブジェクト名」を追加して・・・・とても面倒ですね。
特にパーツオブジェクトが沢山ある場合は大変です。そこで MAXScript の出番です。

ローポリゴンオブジェクトを全て選択して、以下のスクリプトを3dsMax左下にあるミニMaxScriptリスナーにペーストしてEnterキーを入力してください。
OKが帰ってこればOKです。このスクリプトは選択しているオブジェクトのユーザー定義プロパティに “name” としてオブジェクト名をセットする意味を持っています。

for obj in selection do (setUserProp obj “name” obj.name)

以上で全てのセッティングは完了です。照明を設定してレンダリングしてみましょう。見事にSubstance 3D Painterのペイントがそのまま再現されています。
1つのマテリアルだけですが、金属質感も透明質感も表現されています。
(VRayDomeライトを作成し、Substance 3D Painterと同じHDRIを使うと同じLookを再現できます。Chaos CosmosからHDRIライトを読み込むのもオススメ)

なお、V-Rayではガラス等の透明オブジェクトの色付けはFog Colorで行います。
DiffuseマップをFog Colorに接続すると、透明物体のカラーリングが反映されます。

 

物理的に正しくは無いのですが、Substance 3D PainterのビューポートではAOが当たっていて、ディテールが強調されています。
これを再現するには、まずAO用のVRayBitmap を追加 (<name>タグも忘れずに)し、BaseColor > Diffuse の間に VRayCompTex を作成し、AO をSource B に入力して Multiply (乗算)でAOをBaseColorにかけ合わせます。

AO 有りとなしの違いは微妙ですが、比較すると分かりやすいかもしれません。

こちらの記事で使用したモデルデータを以下で配布致します。ぜひ手元のV-Rayで簡単にPBR用テクスチャセットできる事をご確認ください。収録内容は椅子のローポリゴンFBXと、Substance 3D Painterで出力した2Kテクスチャーセット、Zip圧縮でおよそ88MBです。なおデータは商用で無償でご利用いただけます。(3Dデータの再配布はご遠慮ください。)

株式会社オークでは Adobe社リセラーとして 法人向けAdobe Creative Cloudグループ版、Substance 3D Collection (Substance 3D Painter含む) グループ版の販売も行っています。Adobe Substance 3D Collection の導入をご検討されている法人様はぜひお問合せいただけますと幸いです。

Mayaで同じワークフローを行う場合の補足

上記は 3dsMax 用のV-Rayですが、V-Ray for Mayaでも全く同じ事ができます。

3dsMaxのVRayBitmapで使用できるユーザーアトリビュートによるパスの置き換えは、MayaのFileノードでも利用できます。

 

オブジェクトの追加アトリビュートから VRay > User attributes を追加します。

選択している全てのオブジェクトに、V-Rayの User attribute を追加し、「name = オブジェクト名」 をセットするには以下のMELを使用できます。

$usrAttr = “name”;
for($o in `ls -sl`){
vray addAttributesFromGroup $o “vray_user_attributes” 1;
setAttr ($o+”.vrayUserAttributes”) -type “string” ($usrAttr+”=”+$o);
};

なお、Mayaのカラーマネージメントを使用している場合、Substance 3D Painterからのビットマップがリニアフォーマットの場合、Diffuseカラー以外のTextureを RAWモード(リニア)にする事を忘れないでください。

 

MayaのV-Rayでも同じ方法でBPRテクスチャセットが読み込みできます。

 

UVタイルベースのワークフローへ続く

長くなりましたので「UVタイルベースのワークフロー」に関しては、こちらの別記事を参照してください。

The following two tabs change content below.
株式会社オークでV-Rayをサポートしています。