[Omniverse] MaterialXとOpenPBR

確認した日 : 2024/10/14
Omniverse Kit : 106.1.0

Windows 11で確認しました。

MaterialX

OmniverseではMaterialX( https://materialx.org/ )を使用したマテリアルを扱うことができます。
MaterialXについては「[Omniverse] MaterialXを使う」でも解説していました。
今回はMaterialXのOpenPBRを使ってみます。

OpenPBRとは?

https://github.com/AcademySoftwareFoundation/OpenPBR

OpenPBR は3DCGの標準的なマテリアルのパラメータを持つMaterialXのサーフェースシェーダです。
MaterialXではベースとなるShaderをコアにして拡張していきます。
サーフェースシェーダは以下のようなものがあります。

  • disney_principled
  • GltfPbr
  • OpenPbr ← これがOpenPBR
  • SimpleHair
  • StandardSurface
  • UsdPreviewSurface

参考 : https://github.com/AcademySoftwareFoundation/MaterialX/tree/main/resources/Materials/Examples

たとえば以下のようにmtlxファイルを記載しています。

<?xml version="1.0"?>
<materialx version="1.39" colorspace="lin_rec709">
  <surfacematerial name="surfacematerial" type="material">
    <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
  </surfacematerial>
  <open_pbr_surface name="open_pbr_surface_surfaceshader" type="surfaceshader">
    <input name="base_color" type="color3" value="0.8, 0.8, 0.8" />
    <input name="base_metalness" type="float" nodename="metallic_constant_float" />
    <input name="specular_roughness" type="float" nodename="roughness_constant_float" />
  </open_pbr_surface>
  <constant name="metallic_constant_float" type="float">
    <input name="value" type="float" value="1" />
  </constant>
  <constant name="roughness_constant_float" type="float">
    <input name="value" type="float" value="0.3" />
  </constant>
</materialx>

このときの"open_pbr_surface"タグがサーフェースシェーダの指定です。

OpenPBRを使うことで、標準的なMetallic-RoughnessモデルのPBR、発光(Emission)、屈折率を持つガラスのような表現(Transmission)、肌のような光が表面上で内部散乱する表現(Subsurface)、クリアコート、などオールマイティに表現できます。

Omniverseを使っている方は「OmniSurface」に近いな、と思うかと。
OpenPBRの仕様は以下になります。
https://academysoftwarefoundation.github.io/OpenPBR/

なお、OpenPBRはMaterialX v.1.39からサポートされました。
また、OmniverseでMaterialXのOpenPBRを使用するにはKit 106以降が必要になります。

ちなみにOmniverseのKit 106では、メニューからOmniSurfaceが追加できなくなっていました。
これはMaterialXのOpenPBRに置き換えてね、ということかもしれません。
また、Kit 106のMaterialXインポートではStandard Surfaceを使うと意図した挙動をしない箇所がありました。
OmniverseでMaterialXを使う場合、サーフェースシェーダはOpenPBR一択でいいかもしれません。

OpenPBR使ったマテリアルを作成

MaterialXの"MaterialX Graph Editor"を使うとノードベースでマテリアルを構築できます。
MaterialXのファイルはXMLのテキスト形式で拡張子は"mtlx"です。
慣れるとVS Codeで直接MaterialXのテキストを書いていくことも可能ですが、今回はMaterialX Graph Editorを使います。

GitHubのMaterialXより、ReleaseでOSに合わせたバイナリをダウンロードします。
https://github.com/AcademySoftwareFoundation/MaterialX/releases
今回はWindows環境ですのでMaterialX v.1.39.1の"MaterialX_Windows_VS2022_x64_Python312.zip"をダウンロードしました。
解凍後に"bin/MaterialXGraphEditor.exe"をダブルクリックして起動します。

はじめにStandard Surfaceを使ったサンプルが表示されていますが今回はOpenPBRが対象なので、
メインメニューからFile-Newを選択してクリアします。

操作方法

TABキーを押すとノードリストが表示されます。

マウス操作 説明
マウス左ドラッグ 範囲選択
マウス右ドラッグ パン
マウスホイール ズーム
キーボード操作 説明
TAB ノードリストを表示
F 選択ノードに画面をフィット
Ctrl+C 選択ノードをコピー
Ctrl+V 選択ノードをペースト
Delete 選択ノードを削除

はじめのノード配置

TABキーを押してノードリストを表示し、material – surfacematerial を選択します。
次に、pbr – open_pbr_surface – open_pbr_surface_surfaceshader を選択します。

surfacematerialはMaterialXのマテリアルの最終ノードになります。
ここに、SurfaceShaderである"open_pbr_surface"をつなぎます。
なお、ノードを選択すると黄色で囲まれてそのパラメータが左下の"Node Property Editor"に表示されます。

さて、ノードをつなごうにもopen_pbr_surfaceノードが縦長すぎます。

Node Property Editor右にスクロール-バーがあるので下にドラッグします。
"Show all inputs"チェックボックスをOffにします。

次のようになりました。

"open_pbr_surface_surfaceshader"のoutから"surfacematerial"の"surfaceshader"と"back
surfaceshader"につなぎます。

これで一番小さいOpenPBRのマテリアルが作成できました。
メインメニューの"File" – "Save"でファイルに保存します。ファイル名を"OpenPBR_first.mtlx"としました。

Omniverse(USD Composer)でMaterialXのマテリアルをインポート

Kit 106が必須なのでkit-app-templateからUSD Composerを使用するようにします。
[Omniverse] Omniverse Appのビルド (2024.8)」もご参照くださいませ。

OmniverseでMaterialXを使用するにはXformを作成し、Referenceとしてmtlxファイルを指定します。

Xformを選択し、右クリックメニューより、Add – Referenceを選択します。

Select Referenceウィンドウで拡張子を選択できます。ここでmtlxを探して指定。

MaterialXのファイルだけ一覧されました。
"OpenPBR_first.mtlx"を選択してSelectボタンを押します。

これでXformは参照型になりました。
Propertyウィンドウを見ると、ReferencesのPrim Pathが赤色になっています。

ここで"/MaterialX"と入力してEnterキーを押して確定します。

これで、以下のようにMaterialXがOmniverseのステージに読み込まれました。

Kit 106ではKit 105.x時のMaterialXインポートと大きく変わったところがあるので、それを書いていきます。

Kit 105 → Kit 106のMaterialXで変わったこと

まず、OpenPBRに対応しました。
また、Standard Surfaceでは一部動かない箇所も発見。
OmniverseのMaterialXを使ったマテリアルはOpenPBR一択でいいかもしれません。

Kit 105では動いていなかったtimeノードが動くのを確認できました。

Kit 105のMaterialXは「MaterialXからMDLへのコンバート」が行われていた感じで、MaterialXを読み込んだ後のパラメータの編集はほぼ不可能でした。
Kit 106では、ベースとなるサーフェースシェーダのパラメータ、個々のノードのパラメータはMaterialXと1対1で対応しており、ノードごとのパラメータの変更もマテリアルに即座に反応されるようになっていました。

整合性が取れた感じですね。

OpenPBRで表現を確認する

ここで作成した"OpenPBR_first.mtlx"だけでもOmniverse上でOpenPBRで表現できる機能を確認できます。
ただ、半透明のガラス表現は少し調整が必要な個所がありました。

RTX-Real-Time

左から
通常のPBR (sprcular_roughness 0, base_metalness 0)、
通常のPBR (sprcular_roughness 0.5, base_metalness 0)、
鏡のような鏡面反射 (sprcular_roughness 0.0, base_metalness 1.0)、
ガラス表現 (tramission_weight 1.0)、
発光 (emission_color, emission_luminance 300.0)、

RTX-Interactive(Path-Tracing)

  • ガラスの屈折率(IOR)はパラメータを1.5とそれ以外で変えてみたのですが変化しませんでした。
  • たまに初期値がUIの数値とは別の表現になっていることがありました。再度パラメータをキーボード入力すると更新されました。
  • RTX-Real-Timeのガラス表現で、"specular_roughness"を0.0にすると白飛びする。

    0.02あたりにわずかにroughnessを与えると白飛びは緩和されるが、黒い個所が出てくる。
  • RTX-Real-Timeのガラス表現で、不正な影が出る(上記のRTX-Real-TimeとPath-Tracingを比較するとわかりやすいです)?

    Meshのパラメータで"Cast Shadows"をOffにすれば緩和できました。

ということで、ガラス表現はOmniverseのMaterialX(OpenPBR)では少し安定しないようでした。

OpenPBRでのテクスチャ指定

MaterialX Graph Editorに戻り、TABキーで表示されたノードリストより texture2d – tiledimage – tiledimage_color3 を選択します。

tiledimageノードのoutはcolor3ですので、open_pbr_surface_surfaceshaderノードの"base_color"などに接続できます。

SaveしてこのMaterialXファイルをOmniverseのUSD Composer側にインポートしました。

"Materials/NodeGraphs"内にUSDのShaderとしてMaterialXのノードが配置されているのを確認できます。
このノードのパラメータを変更すると、マテリアルも更新されます。

今回はここまでです。
MaterialXでOpenPBRを使い、それをOmniverse環境に持っていきました。
MaterialX Graph Editorでノードを組み合わせていくことでよりリッチな表現が可能になります。
UsdPreviewSurfaceでは手の届かなかったところを調整できるようになりました。
また、MaterialX(OpenPBR)はMDLよりも簡単なので学習はしやすいかなと思います。