[Omniverse] RTX-Real-Timeのガラス表現で疑似的にRoughnessを与える

  • by

Omniverse Create 2022.3.1(Kit.104.1)で動作確認しました。

"RTX-Interactive(Path Tracing)"では、OmniGlassやOmniSurfaceを使うことでガラス表現を行うことができます。
Roughnessで表面のざらつきを与えて、すりガラス状にすることができます。

"RTX-Real-Time"では、Glass表現+Roughnessを行った場合、Roughnessは反映されなくなります。

これをなんとかできないだろうか、というのが今回のテーマです。

Roughnessとは?

"Roughness"とはなんだろう?というのを先にさらっと書いておきます。
以下はざくっとした考え方の図になります。

レイが物体の表面に入ってきたときにRoughnessが小さい場合、反射での分散が起きにくく映り込みもボケることが少なくなります。
Metallic 1.0+Roughness 0.0の場合は正反射することになり、鏡のような表現になります。
Roughnessが大きい場合、表面がざらついたような表現となります。
このときはランダムに拡散されて反射されることになります(微小の目に見えない凸凹をモデル化したものとなる)。
結果として、Roughnessが大きいと表面への映り込みはボケることになります。

透過と屈折があるガラスの場合も同じで、すりガラスのような表現を行いたい場合はRoughnessを大きくすることで透過先がボケる表現になります。
では、法線マップで凸凹を与えたらRoughnessいけるのでは?というのが今回のアイデアになります。

"RTX-Real-Time"でGlass + Roughness表現を行う

Material Graphを使ってマテリアルを作成することにしました。
Stageウィンドウでマテリアルを割り当てたい形状を選択して右クリック。
「Create」-「Material」-「Create MDL Graph」を選択します。

Material Graphウィンドウが表示されました。

Material Graphについては「[Omniverse] マテリアルの割り当て その5 (Material Graph基礎編)」にも使用方法を記載してますのでご参照くださいませ。

「OmniSurfaceBase」をつなげる

「OmniSurfaceBase」を「Material(output)」の「mdl:surface」と「surface」につなぎました。

"RTX-Real-Time"時は「OmniSurfaceBase」を使わないとGlass表現に法線マップを割り当てられない点に注意してください("OmniGlass"や"OmniPBR"ではこの方法は使えません)。

ガラス表現にする

「OmniSurfaceBase」のパラメータで"Enable Transmission"をOn、"Weight"を1.0としました。

これでガラス表現になりました。
下画像の右側の球と直方体を薄くしたものに対して、Material Graphのマテリアルを割り当てています。

「Perlin_noise_bump texture」を「Geometry Normal」につなげる

Material Graphの「Texturing, high level」から「Perlin_noise_bump_texture」を配置。
「OmniSurfaceBase」の「Geometry Normal」につなぎます。

これでガラス表現にざらつきが加わりました。

これはどのような表現を行っているのか?

「perlin_noise_bump_texture」のパラメータの「Placement」の「Tiling」は10.0が入っています。

このTilingを0.5としてみました。

これで正体が見えましたね。
Perlinノイズによる凸凹を与えているわけですね。
Tilingを10.0に戻します。

また、このGlass+Roughnessマテリアルを割り当てた形状に接近すると凸凹が確認できます。

より細かくしたい場合はTilingを10.0より大きくすることでざらつきを細かくできます。
ただ、カメラを引いていくとあまり差は見分けにくいかもしれません。

ノイズパラメータを調整

「perlin_noise_bump_texture」の「Noise parameters」でノイズパラメータを調整します。

Levels

「Levels」の値を大きくすると(整数値)、より凸凹が複雑になります。
Perlin NoiseのOctaveに相当するパラメータになります。

Bump Strength

「Bump Strength」の値を小さくすると、Roughnessが弱くなります。
Bump Strengthを0.0~0.5に変化させて並べてみました。

このような感じで、"RTX-Real-Time"でも疑似的にGlass+Roughnessは表現できるようになりました。
ただ、ジャリジャリ感はぬぐえないため、ガラス窓の表現以外では扱うのは難しいのかもしれません。

今回はここまでです。