見出し画像

MaterialXのすゝめ ツールに依存しない共有マテリアル 2026年1月最新版

ご無沙汰しております。
MaterialXを社内に布教したい委員会、会員のTD髙橋です。

前回に引き続き、各DCCツールにおけるMaterialXのレンダリング結果について記事を書かせていただきます。
今回は、比較対象となるツールにKarmaとOmniverseを追加し、かつ、なるべく見た目が一致するような対応を行ってみましたので、そちらを共有できればと思います。
(あくまで2026年1月時点での対応であるため、今後変更がある可能性があります。ご了承ください)

過去記事はこちら

前回確認できた問題点

MaterialXは「対応しているツール間で見た目を合わせられる」という大きなメリットを持ちますが、レンダラの仕様によって見た目がズレてしまうこともあります。特に透過やSSS(Subsurface Scattering)の表現はレンダラの特性が現れやすく、見た目に差が生じやすい部分です。
「背景作業で作ったマテリアルが同一数値でもショット作業で見た目が変わってしまう…」というのはなるべく避けたいため、今回、各セクションのワークフローをなるべく煩雑にせず、見た目を近づけるための設定を検討しました。

共通化における障害

Autodesk Standard Surfaceには、透過や光の散乱における「距離に関する単位が定義されていない」という問題があります。
パラメータとしては、transmission_depth, subsurface_scaleがそれに該当するのですが、双方具体的な単位 (cm, m等)については明記されていません。

図:transmission_depthの定義記述
(出典:Autodesk Standard Surface specification)
図:subsurface_scaleの定義記述
(出典:Autodesk Standard Surface specification)

結果として、ツールごとに各パラメータの意味合いが異なってしまう状況が生じています。

transmission_depthを持つ同一のMaterialXのレンダリング結果
subsurface_scaleを持つ同一のMaterialXのレンダリング結果

上記の画像の通り、同一のMaterialXを利用していたとしても、
DCCツールの受け取り方によって結果が大きく変わってしまうことがあり、
Material共通化による作業工程短縮の妨げとなってしまいます。

対処法

レンダラ固有のWorking Unit及び各パラメータの意味合いに合わせた係数を与えることで、結果を近づけることができます。
全体的に見た目が近いレンダラを基準として目標値を定め、各レンダラごとの係数を算出し、必要に応じてサンプルマテリアルの数値を書き換えることで見た目の一致を目指しました。
自分が算出した各レンダラごとの係数は、以下の表の通りとなりました。

レンダラの内部係数表

※各DCCのWorking Unitに合わせて、オブジェクトをリアルサイズにしてレンダリングした結果になります。

上記の設定を元に、レンダリングしてみました
今回は、Autodesk Standard SurfaceのMaterialXファイルを作って、レンダラーごとに見た目がどう変わるか比べてみました。

検証と考察

環境設定

  • 比較したレンダラ

    • MaterialXView

    • Unreal Engine (PathTracing, Substrate)

    • Arnold

    • V-Ray

    • Karma (Houdini)

    • Omniverse

  • 実行環境、及び各ツールのバージョン

    • MaterialXView:1.38.8

    • Unreal Engine:5.6.0

    • Maya:2026

      • mtoa:5.5.3

      • V-Ray for Maya:7.10.02

      • mayaUSD: 0.32.0

    • Houdini:21.0.440

    • Omniverse:108.0.0

  • アセットデータ

  • その他

レンダリング結果

MaterialX Examples
以下、MaterialXのGitHubで公開されているサンプルデータに対して、
レンダラ固有係数を適用した数値を設定したものをレンダリングしました。

standard_surface_brass_tiled
standard_surface_brick_procedural
(vrayの柄が合わない: プロシージャル関連のNodeが対応していない)
standard_surface_carpaint
standard_surface_chrome
standard_surface_copper
standard_surface_default
standard_surface_glass
standard_surface_glass_tinted
standard_surface_gold
standard_surface_greysphere
standard_surface_greysphere_calibration
standard_surface_jade (subsurface_scaleを持つ)
standard_surface_marble_solid (subsurface_scaleを持つ)
(UEのノイズがおかしい: 3Dノイズの大きさが他と異なる)
standard_surface_metal_brushed
standard_surface_plastic
standard_surface_thin_film
standard_surface_velvet
standard_surface_wood_tiled

AMD MaterialX Library
以下は、AMDが公開しているMaterialX Libraryで特徴的なものを幾つかに対して、レンダラ固有係数を適用した数値を設定したものをレンダリングしました。

Acryl_Plastic (subsurface_scale,transmission_depthを持つ)
Motley_Patchwork_Rug
TH_Fabric_Leather
TH_Moss_Cobblestone_Floor
Sage_Houndstooth_Fabric
Skin_30_percent_melanin (subsurface_scaleを持つ)
Dark_Glass (transmission_depthを持つ)

自主作成
前回のサンプルにはEmissionの要素が含まれていなかったため、検証用に独自のマテリアルを作成しレンダリングしました

df_standard_surface_emission

考察

今回の対応によって、透過・SSS系のマテリアルに関しても一定程度の見た目の共通化を行うことができました。

しかしSSSに関しては、KarmaとArnoldでアルゴリズム(Random Walk)の違いがあることや、OmniverseのMaterialX Autodesk Standard SurfaceはSSSに未対応であることなどにより、どうしてもレンダラごとの性質が出やすく、数値調整だけでは見た目の完全一致には至らないことも分かりました。

3DノイズやTransmissionとSSSの複合などでは見た目の差が大きくなりますが、原因がはっきりしているため、そこはワークフローなどで対応可能であると考えています。

社内対応

比較用画像における対応は参考のマテリアルに対してパラメータを直打ちしたものであり、実際の作業において使える方法ではありません。
本来は、transmission_depthやsubsurface_scaleにおける係数の違いを意識することなく、デザイナーがLook作成に集中できる環境が必要です。
そこで、社内で用意する標準的なマテリアルに、上記パラメータに対する係数をレンダラによって切り替える仕組みを用意しました。

使用するレンダラごとに renderer_idと係数を定義しておき、geompropvalueで取得できる変数を用いて renderer_idを設定することで、現在のレンダラに合わせた係数を与えられるようにしています。

まとめ

今回はAutodesk Standard Surfaceを様々なDCCツール共通で同じ見た目を維持しつつ使用するためにどうすればよいかについてお話しさせていただきました。

結果として、現状では係数などを用いて対応することになりましたが、近年リリースされたOpenPBRは、マテリアルのアルゴリズムを明確に規定することによってそうした垣根を取り払おうとしていますので、安定してきたときに改めてこちらで報告させていただければと思います。

引用

※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。

テクニカルスタッフ募集

デジタル・フロンティアでは、テクニカルスタッフを随時募集しています。
まずは気軽に門戸を叩いてみて下さい。
一緒に日本のコンテンツ産業を盛り上げていきましょう!