[Omniverse] [Unity] Unity Omniverse Connector : USDのエクスポートと調整

  • by

前回はUnity Omniverse ConnectorのインストールとUnityのURPのサンプルシーンを用いてUSDエクスポートを確認しました。
今回は、UnityからOmniverseにシーンを渡す際に、以下を確認していきます。

  • Unity : Unityでのマテリアル
  • Unity : UnityでのLightMapの設定
  • Omniverse : OmniPBRのマテリアル
  • Omniverse : Omniverse Createでの調整

Unity 2021.3.18f1(URP)とOmniverse Create 2022.3.3を使用しました。

Unity上のシーン

以下のような木造の建物をUnityに配置しました。

LightMapは割り当て済みです。室内は以下のようになっています。


このシーンをUnity Omniverse ConnectorでUSDにエクスポートします。

Unity : Unityでのマテリアル

Omniverse Connectorに渡す際の注意点として、マテリアルのパラメータを確認していきます。

参考 : https://docs.omniverse.nvidia.com/con_connect/con_connect/unity/manual.html#materials-handling

マテリアルはBuilt-In/URP/HDRPのそれぞれのStandardなマテリアルに対応しています。

Render Pipeline Shader
Built-In Standard
URP Universal Render Pipeline/Lit
HDRP HDRP/Lit

今回はURPを使用しているため、Shaderとして"Universal Render Pipeline/Lit"を指定しています。

半透明は"Surface Type"で"Transparent"を選択し、"Base Map"のアルファ値を0.0に近づけました。
以下は、振り子時計のガラス部分で半透明を使用しています。

Unityの"Transparent"の指定は、USDにエクスポートされるときに"Opacity"が使われます。
これは単純なアルファ合成が使用されます。屈折の効果は表現されません。
なお、USDでOpacityを0.0にすると完全な透明となり、表示自体がされない状態になります。
そのため、アルファ値は0.0とはせずにわずかに値を入れてほうがよいと思います。

Unity : UnityでのLightMapなどの設定

UnityでLightMapの設定を行います。
間接照明が回り込むリアルな空間をLightMapを使って表現することになります。
この際に考慮が必要な要素としては以下があります。

  • Staticにする形状を選定
  • ライティング
  • Reflection Probe
  • Light Probe
  • LightMapのベイク
  • Post Processing (Global Volume)
  • SSAO

Staticにする形状を選定

この建物全体は複数のMeshで構成される1つのPrefabになっています。
InspectorでStataicを割り当て、ライトマップのベイクに参加するようにしています。

この建物と地面をStaticとしました。

なお、LightMapのベイク対象になる形状(Asset)は、
Assetの"Generate Lightmap UVs"チェックボックスをOnにしておく必要があります。

これにより、面が重ならないUVが作成されます。このUVを使ってLightMapがベイクされることになります。

ライティング

太陽となるDirectional Lightのほか、
室内に弱めのArea Lightを配置。

廊下に弱めのPoint Lightを配置しました。

Area LightはLightMapでベイクされる光源となります。

Reflection Probe

金属や鏡などへの映り込みは、Reflection Probeを使用します。
以下のように配置しました。
白い円のアイコンがReflection Probeです。

大雑把に一定間隔で配置しています。
鏡への映り込みや光沢(SmoothnessもしくはMetallic)の反射などで、このReflection Probeが使用されます。

Light Probe

StaticではないGameObjectについては、Light Probeでキャッシュされた光を使用して
あたかもリアルタイムに形状が動いても周囲の間接光が反映されるような挙動を行うことができます。
Light Probeは以下のように配置しました。

LightMapのベイク

以上のStatic形状、ライティング、Reflection Probe、Light Probeを指定した後にLightMapのベイクを実行します。
Lightingウィンドウで指定しベイクを開始します。
以下の赤い箇所を変更しました。

Lightingウィンドウの右下の"Genetate Lighting"ボタンを押してベイクを開始します。
これは時間がかかる処理になります。
この木造の建物のシーンでは、ベイクが完了するまでに5分くらいかかりました。

Post Processing (Global Volume)

URPの場合は"Global Volume"のコンポーネントとしてPost Processingの指定を行います。
これは、レンダリング後の「後処理」をスクリーンスペースで行います。

初回はProfileを"New"ボタンを押して追加。
"Add Override"ボタンを押してPost Processingの効果を追加してパラメータを編集します。

TonemappingやColor Adjustmentsはよく調整することになると思います。
このPost Processingで「盛る」処理は非常に大事です。

以下はPost ProcessingでTonemapping以外を無効にした場合。

全体的に室内は暗くなっています。主に露出(Exposure)が弱いのが原因です。

Post Processingとして、Bloom/Vignette/Color Adjustments/White Balanceを追加して調整した場合。

よりドラマチックになりました。

SSAO (Screen Space Ambient Occlusion)

SSAOはPost Processingとしての効果ですが、URPではSettingsのほうで指定します。

メインメニューの[Edit]-[Project Settings]を選択。
Project SettingsでGraphicsを選択。
Scriptable Render Pipeline Assetの"URP-HighFidelity"を選択。
Projectウィンドウ内でハイライトされた"URP-HighFidelity"を選択。
InspectorウィンドウのRender Listの0番目を選択。

ここでは"URP-HighFidelity-Renderer"を選択し、Projectウィンドウ内でハイライトされた"URP-HighFidelity-Renderer"を選択します。

この一番下にSSAOのパラメータがあります。
なければ"Add Render Feature"ボタンを押して追加してください。

SSAOのなしとありの比較は以下のようになりました。

壁と木の机の間の影(影というと少し違うのですが遮蔽)が薄っすら出ていたり、接地部分の脚が少し黒くなっており、接地感がアップしています。

このSSAOもリアルな表現では必須と言えそうです。

USDエクスポート

以上でUnity側のLightMapを中心として設定ができました。
Unity Omniverse Connectorを使ってUSDファイルとしてエクスポートし、Omniverse Createに持って行きます。

メインメニューの[Omniverse]-[Settings]を選択。
"Export Material Type"は"MDL"を選択しました。
これにより、マテリアルはOmniPBRが使用されます。

メインメニューの[Omniverse]-[Export]を選択。
エクスポート用のウィンドウが表示されるため、ファイル名を指定して右下の"Export Scene"ボタンを押します。

以上で、Unityでの作業は完了です。
次にOmniverse Createで出力したUSDファイルを開きます。

Omniverse : USDを読み込み

Omniverse Create 2022.3.3を使用しました。
USDを読み込んだ直後は以下の感じ。

このとき、以下の情報はUSDには渡りません。

  • GameObjectのStatic情報
  • Reflection Probe
  • Light Probe
  • LightMap情報
  • Post Processing情報
  • SSAO

さて、1つ前でUnityでの設定として長々と説明したLightMap関連の情報はすべて渡っていないのが分かりますでしょうか?
これはレイトレーシング(RTX)では不要なため渡らない、というのと、Post Processingは互換性がないため渡せない、というのがありそうです。
そのため、もし、Omniverse Createに渡して調整するというワークフローを取る場合は、
Unity側でLightMapに関する指定はしなくてもよい、ということになります。

ということで、次にOmniverse Create上の調整を行います。
"RTX-Real-Time"を使用しています。

Omniverse : 背景の変更

Environmentsウィンドウで背景を選んで変更。

Omniverse : レンダリングの調整

[Render Settings]-[Ray Tracing]で
"Indirect Diffuse Lighting"の"Indirect Diffuse GI"をOnにします。

これで"RTX-Real-Time"でも間接照明が有効になります。

"Reflections"の"Max Reflection Bounces"を1から5に変更しました。

これはMetallicやRoughnessでの反射回数の最大を指定します。

"Translucency"の"Enable Fractional Cutout Opacity"がOnになっているのを確認します。

これがOnでない場合は、Opacityが1.0以外は全透明になって見えなくなります。
"RTX-Real-Time"ではOnにすることをお勧めします。

これでレンダリングの設定は完了しました。

ただし、室内はまだ暗いです。

Omniverse : Post Processing

Post Processingを調整していきます。

Tone Mapping

Tone Mappingはデフォルトでは"Aces"になっています。
"Iray"に変更し、"Crush Blacks"を0.5から0.05に変更しました。

Auto Exposure

"Auto Exposure"をOnにします。

これでおそらくグッと綺麗になったと思います。
"White Point Scale"を10.0から小さくしていくと、全体が明るくなります。
好みに合わせて調整します。

FFT Bloom

まぶしい感じを出すために、"FFT Bloom"をOnにします。
"Scale"を1.0から0.2に変更しました。

Omniverse : 結果

結果として以下のようになりました。
適宜、Post Processingの"Auto Exposure"の"White Point Scale"を調整しています。



LightMapやAOの処理はカットしつつ、リアルタイムで間接照明が充満している室内シーンも表現できるのを確認できました。
また、Unityで苦労していた「光漏れ」も発生しないのが分かるかと思います(というよりも、Reflection ProbeやLight Probe自身がいらないため、その心配も不要になる)。
レイトレーシングだと調整は楽ですね。