[Omniverse] マテリアルの割り当て その4 (OmniSurfaceと厚み)

前回は湯呑茶碗のお茶の表現でOmniSurfaceの「Transmission」と「Subsrface」を使用しました。

今回は透明度のある形状の場合にかかせない「厚み」について書いていきます。
ここでは、Omniverse Create 2021.3.8を使用しました。

Max Bouncesの調整

ガラスのような透明体を扱うため、レイの透過回数がデフォルトでは足りない場合があります。
Render Settingsの「Path Tracing」で「Path-Tracing」の「Max Bounces」をデフォルトの4から8に変更しました。

屈折と厚み

「屈折」はどのような表現ができるでしょうか?
以下は左から、1枚の正方形(Plane)、立方体をZ軸方向に縮小したもの(Cube)、立方体(Cube)を配置しました。
それぞれ同じOmniSurfaceを与えています。

マテリアルのOmniSurfaceでは、以下の変更を行いました。
SpecularのRoughnessを0.0。

Transmissionの「Enable Transmission」をOn、Wehghtを1.0。

デフォルトでは屈折率(IOR)は1.5になっています。
ここまでのOmniSurfaceでのガラスは、OmniGlassと同じ表現になります。

画像左のような厚みのない形状は、現実世界では表現できません。
現実世界の透過のある形状は必ず厚みが存在します。

1枚板のMeshを複製し、少し距離を離して厚みをつけるとどうなるか?

では、レイトレーシングレンダラでよくする「1枚板のMeshを複製し、少し距離を離して厚みを設ける」という配置でガラス表現を行うとどうなるでしょうか?

レイが空気からガラス内部に入って再び空気に出ることにより、レイの向きが元に戻るという動きです。
これにより、より厚みが薄いほど屈折はキャンセルされる状態となります。
OmniverseのRTXではこれはうまくいきません。
上記のオレンジ色のアウトラインが表示されている正方形は、2つのMeshが配置されています。
法線もそれぞれで反転させています。

BlenderのCyclesの場合は、面の向き(法線)を逆転させて配置することで
2つのMeshによるガラス表現は意図した厚みを表現できています。

向きを逆転した面を1つのMeshに結合して配置

そこで、DCCツール側で「2枚のポリゴンを面の向きを逆転して距離を離して配置し、1つのMeshに結合」してみます。
Blenderで見ると以下の配置です。

1つのMeshに対して2つの面が距離を離して配置されており、法線が逆転しています。

これをOmniverse Createにインポートしました。
左から、Omniverse上で1枚板のMeshを複製して2つ距離を離して配置、
Blenderで2枚板の法線を逆転させて1つのMeshに結合、
Omniverse上でCubeをZ軸方向に縮小、
としたものです。

2つめのものが意図したとおりになりました。

これより、OmniverseのRTXレンダリングでは「1つのMeshに対して厚みを与える」と屈折が正しく表現されることが分かりました。

電球でのガラス表現

上記を踏まえたうえで、電球を表現しました。

ガラス部は、1つのMeshで薄い厚みがある二重の構成になっています。

赤い矢印が法線方向です。
外側のガラスは外向きの法線、内側のガラスは内向きの法線になっています。
ガラス部のマテリアルはOmniSurfaceを与え、Transmissionを有効(Weight=1.0)にしています。

もし、この電球のガラスに厚みがなかった場合は、以下のように中身が詰まった状態でガラス表現が行われることになります。

ガラスを白く濁らせる

現在はガラスは透明ですが、Roughnessを調整して濁らせていくことができます。
OmniSurfaceのSpecular-Roughnessを調整します。

Roughnessを0.0/0.2/0.4/0.6/0.8/1.0にそれぞれ変化させました。

透明体の影

Transmissionを使用してもしなくても、影については同じように落ちるようです。
影の濃さの変化もありませんでした。

影を薄くするにはOpacityの値を小さくする手段がありますが、そうすると全体的に薄くなってしまいます。
以下は左からOpacityを1.0/0.5/0.2と変化させてみました。

この影は、透明体の場合は落とさないようにしたいです。
その場合は、ジオメトリ(Mesh)のほうの「Cast Shadows」「Shadow Terminator Fix」チェックボックスをOffにすることで、
対象形状の影を落とさないようにできます。

以下のようになりました。

マテリアルが完全に透明な場合(今回の電球やガラス窓など)は
「Cast Shadows」をOffにしておく、など用途によって調整するほうがよさそうです。

薄膜のガラス表現

「詰まったガラス」表現の場合、レンダリング(マテリアル)として薄膜指定できます。
OmniSurfaceの場合は「Geometry」-「Thin Walled」チェックボックスをOnにすることで、
対象形状は薄膜を持つ形状として扱われます。

球にOmniSurfaceを割り当ててTransmission(Weight=1.0)を与えています。
左は「Thin Walled」の指定なし(デフォルト)。
右は「Thin Walled」を指定しました。

この表現は、限りなく厚みが薄い形状で使えそうです。
ただ、ガラスのコップや前述の電球など、大部分はモデリング段階で厚みを与えておくことが多いかもしれません。

今回はここまでです。
OmniSurfaceはこれ以外でもClearcoatやSheen、Thin Filmなどいろいろな表現が可能です。
次回はOmniPBRやOmniSurfaceで表現できないマテリアルを
「MDL」を使って対応する流れについて書く予定です。