[Omniverse] マテリアルの割り当て その1

  • by

Omniverseでマテリアルを割り当てる方法はいくつか存在します。
MDLの知識は自分自身まだ入り口ですがある程度見えてきましたので、改めてまとめることにしました。
Omniverse Create 2021.3.8を使用しました。

マテリアルの種類

Omniverseでは、マテリアルのShaderの表現はMDLが使用されています。
USD標準のUsdPreviewSurface(これはShaderの種類)も使用できます。
大きく分けて、以下のようなShaderがあります。

Shaderの種類 説明
UsdPreviewSurface USD標準のShader
OmniPBR/OmniGlass OmniPBR.mdl/omniGlass.mdlをShaderとして使用
OmniSurface OmniSurface.mdlをShaderとして使用
MDL MDLを独自に記載して使用

MDLとは ?

MDL(Material Definition Language : マテリアル定義言語)はNVIDIA社が提供している、マテリアルをC言語に近い記述で定義する言語です。
MDLをツールに組み込むための機能も含まれます。
MDLのファイルは拡張子「mdl」のテキストで記載されます。
他の3DCGツールでのShaderの位置づけ、と言うと分かりやすいかもしれません。

https://www.nvidia.com/ja-jp/design-visualization/technologies/material-definition-language/

MDL対応のツール(レンダラ)で使用することで共通したマテリアルを与えることができるようになります。

以下のMDL SDKから様々な情報を見ることができます。

https://developer.nvidia.com/mdl-sdk

mdlファイルを書くのは難易度があるため、Substance Designerでノードベースで組み合わせてMDLファイルを作成し、
他ツール(Omniverse含む)に持って行くというのが手っ取り早い手段になりそうです。

UsdPreviewSurface

UsdPreviewSurfaceはUSD標準のマテリアルのShaderです。

仕様はUSDのドキュメントの以下で確認できます。
https://graphics.pixar.com/usd/release/wp_usdpreviewsurface.html

基本的に「USD対応」としてUSDファイルを出力した場合は、多くのツールはこのShaderを使用します。
iOS/iPadOSのAR Quick Look/Reality ComposerもこのUsdPreviewSurfaceでマテリアルを使用します。
ただし、構造は複雑です。
この複雑さについては、作例を入れて後述します。

OmniPBR/OmniGlass

ここでは「OmniPBR」と「OmniGlass」の2つを上げていますが、これ以外もあります。
透明+屈折を使用しない表現(Opaque)は「OmniPBR」を使用します。
ガラス表現は「OmniGlass」を使用します。
これらは「OmniPBR.mdl」「OmniGlass.mdl」というMDLファイルでShaderが定義されています。
この場合は「NVIDIA Omniverse専用」となる点にご注意ください。

以下、OmniPBRについてのドキュメントです。
https://docs.omniverse.nvidia.com/app_create/prod_materials-and-rendering/materials.html#omnipbr

OmniSurface

OmniPBR/OmniGlassは、不透明/半透明表現でShaderが分かれていました。
「OmniSurface」はこれらより後に公開されたもので、不透明/半透明表現を1つのShaderで指定することができます。
また、ClearcoatやTransmission、Subsurfaceが使用できるなどさらに表現力が増しています。
「OmniSurface.mdl」というMDLファイルでShaderが定義されています。
OmniPBR/OmniGlassとはパラメータも異なっています。
OmniSurfaceも「NVIDIA Omniverse専用」となる点にご注意ください。

以下、OmniSurfaceについてのドキュメントです。
https://docs.omniverse.nvidia.com/app_create/prod_materials-and-rendering/materials.html#omnisurfacebase-and-omnisurfacelitebase

Omniverse Createでマテリアルを使用

Omniverse Createで3Dモデルに対してマテリアルを割り当てていきます。
湯呑茶碗の3Dモデルは、1つのマテリアル「YunomiCyawan」を与えています。

この3DモデルはUSD形式でインポートしてきました。
これはマテリアルのShaderとしてUSD標準の「UsdPreviewSurface」を使用しました。

UsdPreviewSurface

YunomiCyawan
  PBRShader
  stReader
  diffuseTexture
  normalTexture
  occlusionTexture

マテリアル"YunomiCyawan"のPropertyは以下のようになっています。

"Diffuse Color"の右端で緑色の「=」のアイコンが見えます。
この場合は、Diffuse Colorのテクスチャが割り当てられていることになります。
同様に、NormalとOcclusionでテクスチャが割り当てられています。
これはUSDでは複数のShader要素を「connect」として接続している構造になります。
USDとしては以下のような構造になっています。

これらの接続はusdaファイルを見ると確認できます。

UsdPreviewSurfaceを割り当てたShader名を"PBRShader"としました。
この中に、PBRマテリアルとしての以下のマテリアルが列挙されています。

要素名 説明
diffuseColor 拡散反射色
ior 屈折率
metallic メタリック
normal 法線マップ
occlusion Occlusionマップ
opacity 不透明度
roughness ラフネス

これらは一般的なPBRマテリアルのパラメータです。
テクスチャがある要素の場合は、「UsdUVTexture」にconnectします。
このUsdUVTexture内でテクスチャファイル名を指定しています。
さらにMeshに対してUVマップされるため、UVについては「UsdPrimvarReader_float2」にconnectします。
UV要素なので(float, float)の配列に接続されることになります。
ただ、UV情報はマテリアルではなくジオメトリ(ここではMesh)にあります。
Meshでは"st"の名前でUVの情報が格納されています。

という一連の流れが上記の図のようになります。
複雑になっている、というのが分かりますでしょうか。

また、UsdPreviewSurfaceはClearcoatの情報も持つことができます。
なお、opacity(不透明度)はありますがtransparency(透明度)はありません。
opacityはアルファブレンド相当になり、これは屈折の影響を受けたガラス表現はできません。
テクスチャのタイリングの繰り返し数を指定したい場合(Transform2d)は、さらにconnectが増えて複雑になります。

マテリアルを新たに割り当てる

次に、このUsdPreviewSurfaceのマテリアルは置いておいて、OmniPBRを割り当てていきます。
Omniverse上では、UI上で指定の形状(ジオメトリでなくてもよい)に対して新たにマテリアルを割り当てることができます。
Stageウィンドウで対象形状を右クリックしてポップアップメニューを表示します。
「Create」-「Materials」-「OmniPBR」を選択します。

これは、対象形状に対して「OmniPBR」としてのマテリアルが割り当てられます。
"/World/Looks/OmniPBR"が追加されました。

また、茶碗はデフォルトの灰色となりました。

OmniPBR

OmniPBRは、子として「OmniPBR.mdl」を割り当てたShaderのみを持ちます。
テクスチャファイルはここにフラットな形で指定します。

UsdPreviewSurfaceのような複数のconnectによる関連付けは存在しません。
スマートな構成です。
かつ、一般的なPBRマテリアルの指定を行うことができます。

「Albedo」の「Albedo Map」にUsdPrevewSurfaceのときのDiffuse Color Mapを指定。
色を乗算する場合は「Color Tint」を使用します。

「Reflectivity」にラフネスとメタリックの指定を行います。
「Roughness Amount」にラフネス値を指定、
「Metallic Amount」にメタリック値を指定。

テクスチャを割り当てる場合は、
「Roughness Map」にラフネスのテクスチャを指定、
「Metallic Map」にメタリックのテクスチャを指定します。

「AO」にAmbient Occlusionの指定を行います。
「Ambient Occlusion Map」にOcclusionのテクスチャを指定します。

「Normal」に法線マップの指定を行います。
「Normal Map」に法線マップのテクスチャを指定します。

別途「Normal Map Strength」で法線マップの強さを指定できます。
これはUsdPreviewSurfaceにはない要素です。
注意点として「Normal Map Color Space」は「raw」としてください。
rawにしないと、法線マップが作る凸凹が変になります。

最終的にOmniPBRを割り当てた湯呑茶碗は以下のようになりました。

UsdPreviewSurfaceでの法線マップ

UsdPreviewSurfaceでも、OmniPBRで「Normal Map Color Space」を「sRGB」としていたときと同じ現象が起こっています。
仕様上は「inputs:sourceColorSpace」の指定もでき、"raw"を割り当てできるのですが、法線マップは「sRGB」のままです。

この挙動はUSDに付属の「usdview」でも同じであり、USD自身の問題となりそうです。

つまり、Omniverse上で形状に割り当てるマテリアルで法線マップを使う場合は、UsdPreviewSurfaceを使うのではなく、
OmniPBRやOmniSurfaceを使うほうがよいです。

作成済みのマテリアルに入れ替える

各形状でマテリアルを変更する場合は、Stageウィンドウで対象形状を選択。
Propertyの「Materials on selected models」でドロップダウンを出すとマテリアルが一覧されるため選択します。

長くなったため、いったんここで区切ります。