確認した日 : 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よりも簡単なので学習はしやすいかなと思います。