[Omniverse] [Unity] Unity Omniverse Connector 200.0-Beta

  • by

2023年の3月末のGTC 2023で「Unity Omniverse Connector」がベータ公開されました。
今回はこの情報を記載します。

Unity Omniverse Connectorとは ?

UnityでUSDのインポートやエクスポートを行ったり、OmniverseのLive Sync(Live Session)でリアルタイム連携を取るためのアセットです。
まだベータですので、実装されていない点、今後仕様が変わるかもしれない点に注意する必要があります。

Unity Omniverse Connector 200.0-Betaで実装されている機能は以下があります。

  • USDのエクスポート (シーンの階層構造、メッシュ、マテリアル、光源、カメラ)
  • USDのインポート (シーンの階層構造、メッシュ、マテリアル)
  • Live Sync (現状は、Unity → Omniverseの一方通行のみ)

マテリアルは、USD標準のUsdPreviewSurfaceとOmniverseのOmniPBR(一部OmniGlass)に対応しています。
また、Meshのスキンやアニメーションにはまだ対応されていません。

ドキュメント

インストール方法や動作環境、現在の仕様などは、以下に記載されています。

https://docs.omniverse.nvidia.com/con_connect/con_connect/unity.html

動作環境

現在はWindows環境のみです。

Unityの対応バージョンは以下。

https://docs.omniverse.nvidia.com/con_connect/con_connect/unity/requirements.html

2021.3.x LTS、2022.1.x LTSで結構最近のバージョンが必要です。
これは、.NETの新しい機能を使っているのと、2020.3や2021.3以降に追加された機能を使っている箇所があるためです(Editor操作のコールバックやコルーチン処理)。
総合的に見て、2021.3.x LTS以降が必要となります。

インストール方法

Unity Omniverse Connectorは、一般的なUnity Asset Storeからのアセットのインストール方法と異なります。

  • Omniverse LauncherからPC環境にインストール
  • UnityのPackage Managerからインストールフォルダ内の"package.json"を指定し、インストール

の2段階の作業が必要になります。
この利点としては、Connectorがバージョンアップした場合にOmniverse Launcherからのアップデートの適用により、
PC環境の全UnityプロジェクトのUnity Omniverse Connectorを更新できる、というのが上げられそうです。
また、Unityに限らずConnectorはOmniverse Launcherを中継点にしたい、という意図もあるのかもしれません。

Omniverse LauncherからPC環境にインストール

Omniverse Launcherを起動します。
「EXCHANGE」-「CONNECTORS」より「UNITY OMNIVERSE CONECTOR」を選択。

右上の「INSTALL」ボタンを押してインストールします。
以下はインストール後のキャプチャですが、まだ未インストール時は「INSTALL」と表示されていて緑色になっています。

インストール場所はどこ?

Omniverse Launcherの右上からポップアップメニューを出し「Settings」を選択。
「LIBRARY PATH」がOmniverse関連のインストール先になります。

この場合は"K:\NVIDIA_omniverse\ov\pkg"。
このフォルダを開くと"unity-connector-200.0.0-beta.1"というのを確認できます。
ここにインストールされています。

UnityでUnity Omniverse Connectorパッケージをインストール

Unityを起動し、メインメニューから「Window」-「Package Manager」を選択します。
Package Managerウィンドウの左上の「+」ボタンを押し、「Add package from disk」を選択します。

Unity Omniverse Connectorインストールフォルダ内の"com.nvidia.omniverse.connector"内の"package.json"を選択します。
UnityへのConnectorのインストールは少し時間がかかります。
インストールが完了すると以下のように表示されました。

30分くらい経ってもインストールが完了しない場合、
いったんUnity Editorを強制終了して再度起動すると、インストールが完了してることがありました。

注意事項

Unity Omniverse Connectorで確認しておいた方がいい注意事項を列挙します。

USD Unity SDKと互換性はない

現状は「USD Unity SDK」( https://github.com/Unity-Technologies/usd-unity-sdk )とは互換性がありません。
USD Unity SDKとUnity Omniverse Connectorを同一Unityプロジェクトにインストールしても正しく動作しません。
これはUSDのDLLが衝突するから、というのが理由として上げられます。

日本語GameObject名、日本語マテリアル名には対応していない

日本語GameObject名や日本語マテリアル名、日本語ファイル名などUTF-8の箇所は"_"に置き換えられます。
が、この変換が行われた場合は正しく動作しないと考えたほうがよさそうです(これはOmniverse Createでも同じです)。
半角の英数字でGameObject名やマテリアル名を指定するのが無難です。

また、エクスポート時に表示されるファイルダイアログボックスは、
Omniverse NucleusにもアクセスできるようにするためにOmniverseのファイルダイアログボックスが表示されます。
これが日本語対応していません。
そのため、日本語フォルダ名や日本語ファイル名が正しく表示されません。

日本語フォルダ名が???に置き換えられるため、
フルパスでフォルダ、ファイル名ともに日本語が使われていないようにする必要があります。

Unity : USDエクスポートを試す

それでは、USDファイルのエクスポートを確認してみます。
Unity 2021.3.1でURPのサンプルシーンをエクスポートしてみました。
メインメニューに「Omniverse」が存在するのを確認できます。

設定を確認

メインメニューの"Omniverse"-"Settings"を選択。

調整が必要なパラメータを確認します。

「Export Material Type」でエクスポートしたUSDファイルでどのマテリアルを使うかを選択します。
「None」「MDL」「UsdPreviewSurface」から選択できます。
Omniverseで使う目的の場合は「MDL」を選択します。
これはOmniPBR/OmniGlassが使用されます。
他のUSD対応ツールで使うUSDを出力する場合は「UsdPreviewSurface」を選択します。
これは、USD標準のUsdPreviewSurfaceが使用されます。
Omniverseでは、マテリアルとしてOmniPBR/OmniGlassを使用するほうがUnityのシーンの再現性は高いです。
そのため、ここでは「MDL」を指定することをお勧めします。

「Open In App」はエクスポート後に、個々のOmniverse Appで対象のUSDファイルを開く処理を行うかの指定です。
「Omniverse Create」「Omniverse View」を指定できます。

「Export Selection Only」をOnにしてエクスポートすると、シーンで選択されたGameObjectのみをエクスポートする指定になります。
Offの場合はシーン全体がエクスポート対象となります。

エクスポート

メインメニューの"Omniverse"-"Export"を選択。

ファイルダイアログボックスが表示されます。
これはOmniverse Createで使われているファイルダイアログボックスと同じものです。
Nucleus上も選択できます。ここではNucleus上のパスを指定してみましょう。

※ ファイルダイアログボックスが出ているとき、UnityのUIとしてHold on(busy for xxx)と書かれたプログレスバーが表示されています。
これは現状は無視して問題ありません(実装上、ファイルダイアログボックスの処理がメインスレッドで占有されるために起きる問題だと思われる)。

なお、ファイルダイアログボックスで右クリックすればポップアップメニューが表示され、フォルダの作成などの操作もできます。

左下の「File name」に出力するファイル名を指定し、右下の「Export Scene」ボタンを押すとエクスポートが開始されます。
進行状況はUnity EditorのConsoleに表示されます。

これで、まずはUSDのエクスポートは完了しました。
USDファイルで使用されるテクスチャは"Materials"フォルダに出力されます。

Omniverse : Omniverse CreateでエクスポートされたUSDファイルを開く

Omniverse Create 2022.3.3で確認しました。
Omniverse CreateでエクスポートされたUSDファイルを開きます。

微調整していきましょう。
Omniverseは"RTX Real-Time"で間接照明含めて十分な品質を出せますので、
このまま詰めていくことにします。

背景を指定

背景のHDRIはまだエクスポートされていないため、Omniverse Create側で設定します。
"Environments"パネルから背景を指定しました。

"Ray Tracing"の調整

"Render Settings"-"Ray Tracing"でいくつか調整を行いました。

"Indirect Diffuse Lighting"-"Indirect Diffuse GI"をOnにします。
これにより、"RTX Real-Time"でも間接照明が反映されるようになります。

鏡面やメタリックなどで反射回数が増えるシーンの場合、相互反射が重要になるシーンの場合は、"Reflections"-"Max Reflection Bounces"の数を増やします。
ここでは5としました。

このシーンはそれほどでもないですが、間接照明が重要な室内シーンの場合は、この2つの指定により"RTX Real-Time"でもグッと品質がアップします。
結果は以下のようになりました。

UnityのシーンとOmniverse(RTX)のシーン

さて、リアルタイムエンジンであるUnityのシーンをOmniverseに渡すことができました。
Omniverseでシーンを扱う利点は以下が考えられそうです。
なお、これはUnityだけでなく従来のラスタライズベースのリアルタイムとリアルタイムレイトレーシングの比較を俯瞰的に行った内容になります。

ライトマップやシャドウマップはいらなくなる

Unityではフォトリアルな表現を行う場合は、ライトマップが必須になります。

このとき、Light ProbeやReflection Probeも使うことになります。
ライトマップの計算は、シーンにより時間がかかります。

また、影はシャドウマップが使われます。
シーンによってはシャドウマップの調整が必要となります。

このようなリアルタイム特有の処理はOmniverse(RTX)では不要になるため、これはUSDに渡されません。
RTXのレンダリングは「レイトレーシング」で行われ、影も間接照明もリアルタイムで計算が行われます。
この工程がスマートになるため、前処理(ベイク作成)の時間とリソースの削減につながりそうです。

オクルージョンマップはいらなくなる

ライトマップと同じく、ベイクが必要な「オクルージョンマップ」は、
USDのUsdPreviewSurfaceやOmniPBRで渡すことが可能です。
ですが、レイトレーシングではこれは基本的には不要になります。
これもベイクの計算時間とテクスチャリソースを削減できますね。

LODはいらなくなる

※ これはUnity Omniverse ConnectorというよりもUSDの特徴。

レイトレーシングでは空間分割でレンダリングの最適化が行われるのと、
(まだUnity Omniverse Connectorでは実装されていませんが)形状ごとに複数のUSDに分けてシーン全体を管理する構造により、
LODの概念は不要になります。
山に大量の木を生やす場合など、LODなしでリアルタイムに大規模シーンをレイトレーシング対応できます。

※ UnityのTerrainはUnity Omniverse Connectorではエクスポートしていません。
※ Omniverse Createでは、Terrainのエンジンが実装されているわけではありません。

メタリックへの映り込み

Unityでの映り込みはReflection Probe(映り込みのキャッシュのようなもの)を使って環境マップとして行われます。
RTXはレイトレーシングですので、鏡面やメタリックへの映り込みは正確に行われることになります。
Reflection Probe的な概念も不要になります。

以下はUnityの場合。
木の板はStaticにし、この時の映り込みはReflection Probeにベイクされています。

USDエクスポートして、Omniverse Createに持ってきた場合。

土台となる黒いわずかにラフネスがある部品にも、薄っすらと映り込みが出ているのを確認できます。
分かりにくいですが、球体も相互反射しています。

半透明の整合性

半透明(Transparent)は、USDに渡されるときにOpacityが使われます(単純なアルファ値による半透明合成)。
Unity Omniverse Connectorでは、HDRPのときにOmniGlassを使う設定を行うことができ、その場合は屈折ありのGlass表現を行うことができます。
この場合はOpacityではなくTranslucentが使われることになります。

https://docs.omniverse.nvidia.com/con_connect/con_connect/unity/manual.html#hdrp-exporting-omniglass

従来のリアルタイムでは、半透明の形状は不透明(Opaque)とは別のパスでレンダリングが行われます。
半透明は、形状ごともしくは三角形ごとに奥からソートされて描画されます。
これは「ラスタライズだから」という理由になります。
このとき、面によっては前後関係が正しくない表現になる場合があります。
OmniverseのRTXは「レイトレーシング」ですので、そのような面の前後関係の問題は起きません。
また、屈折もレイトレーシングに従った表現になるため正確になります。

リアルタイムレイトレーシングの欠点

欠点は、RTXの場合はGPUをぶん回しますので
それなりに高性能なGPUが必要になる、という点でしょうか。
また、ピクセル単位で真面目に計算するため、レンダリング画像サイズが大きいほど時間がかかります。
この問題はDLSSにより最適化されます。

また、Ada世代のGPUではDLSS3によりさらに最適化されているとのこと。
https://www.nvidia.com/en-us/geforce/news/dlss3-ai-powered-neural-graphics-innovations/
環境を持ってないので、DLSS3は検証してません。

今回は、まずはOmniverse Unity ConnectorでUSDエクスポートを行い、リアルタイムレイトレーシングを確認してみました。
次回は、USDインポートやLive Syncの確認なども行う予定です。