[Omniverse] パノラマカメラを使ったHDRIの作成と確認

Omniverseを使ったCloudXRのARの続きです。
[Omniverse] CloudXRのARを試す」ではOmniverse側の背景のHDRI(IBL(光源)として使用)がARのカメラからの映像と異なるため、AR上の3Dモデルは不一致で浮いた感じになっていました。
今回は、HDRIをよりそれらしく作るというテーマを説明していきます。

とはいえ、室内を360度撮影すると映ってほしくないものも映ってしまうため、
説明は野外で撮影した写真を使うことにしました。

今回は「HDRIの作成」がテーマになるため、Omniverseは確認のための手段になります。
パストレーシングができるオフラインレンダラさえあれば、Omniverseよりも速くはないですが対処できるかと思います。

撮影に使用したカメラ

撮影はInsta360 EVO( https://www.insta360.com/jp/product/insta360-evo/ )を使ってます。
このカメラは180度の立体視を撮影できるものですが、360度(単眼)にも変形できる優れものです。
360度撮影の場合、付属のミニ三脚を使っても脚が映ってしまいます。
そのため、以下はメジャーの上に乗せて撮影してます。
こうすると、脚は映りません。

市販の三脚はほぼ映り込んでしまうため、3Dプリンタで360度撮影の三脚を作ってしまってもいいかもしれません。

このInsta360 EVOでHDRで撮影しました。
編集ツールのInsta360 Studioを使うことで、HDRの場合は露出が(EV:-3 / EV:0 / EV:+3)の三段階の撮影が行われます。
なお、Insta360 EVOで「HDR合成」されたjpeg画像はこれはHDRIではありませんので使用しません。
Insta360 EVOはRAW撮影の機能はありませんので、露出を変えたLDR画像3枚から詰めていくことになります。

以下の3枚を撮影できました。

↓ EV:0

IMG_20211129_153117_00_647.insp


↓ EV:-3

IMG_20211129_153117_00_648.insp


↓ EV:+3

IMG_20211129_153117_00_649.insp

なお、オリジナルのサイズは6080 x 3040ピクセルです(5.7K)。
実際はこれを2の累乗に収まる4096 x 2048ピクセルで扱うようにしました。

Affinity Photo : Affinity PhotoでHDRI化する

Affinity Photo( https://affinity.serif.com/ja-jp/photo/ )を使用して、
3つの露出が異なるjpeg画像を結合してHDRI化しました。
Affinity Photoのメインメニューの「ファイル」-「新規HDR結合」を選択します。

「追加」ボタンを押し、EV:0 、 EV:-3 、 EV:+3 、 の3つのパノラマ画像を指定し、OKボタンを押します。
しばらく計算が行われて、HDRIとして合成されます。

左上の「適用」ボタンを押すと、RGBAがそれぞれfloat値を持つ(ダイナミックレンジを持つことができる)画像になります。
この撮影の場合は曇り空であるため、1.0を超える箇所はほとんどありません。
この状態でいったん4096×2048ピクセルのexr画像として保存しました。

3つの露出を変えたLDR画像をHDR化しただけではライティングとして使用した場合にそれらしくない結果になります。
まずはこれを確認してみます。

Omniverse : OmniverseのRTX Path-tracedでDome Lightとして割り当て

exrファイルをOmniverseのDome Lightとして割り当てます。
また、検証用の地面用のPlaneとアセットより「SolFigurine」を配置しました。

RTX Path-tracedを指定しました。
少し暗いです。
Render Settingの「Tone Mapping」ではデフォルトの「Aces」を指定しています。
パラメータは変更していません。
HDRIとして指定した背景はそれなりの色合いですので(まだホワイトバランス調整などしていないですが)、
純粋にHDRIで光源としての明るさが弱いようです。

Affinity Photo : EV-3のパノラマ画像を加工し、明るい箇所を増幅させる

Affinity Photoに戻り、パノラマ画像の明るい箇所を抜き出し増幅させて光源化します。
EV-3のパノラマ画像は以下のようになっていました。

この画像をいったん4096x2048ピクセルでexr形式で出力します。

「調整」で「レベル」の黒レベルを上げ、白レベルを下げていくと
大雑把に光源として強調したい部分が明確になります。
「レベル」で「結合」しました。

この段階で、黒い箇所は完全なRGB(0, 0, 0)ではなくマイナス値が入ってます。
カラーピッカーでチェックしました。

そのため、メインメニューの「フィルター」-「カラー」-「黒マットを削除」を選択します。
これで黒い箇所はRGB(0, 0, 0)となりました。
若干周囲に青い箇所が残っているため、ブラシで黒で塗りつぶし周囲にぼかしをかけました。

この画像をexrとして保存しておきます。

元のexr画像に対して光源部を強調した画像をレイヤとして重ね、加算合成します。

この加算合成した部分は元々白色のため、より明るくしたとしても画像としてはほぼ変化はありません。
カラーピッカーで明るくした箇所の値を確認します。

元画像は、最大でも1.5あたりだった部分が2.0を超えました。

もう少し効率化します。

Affinity Photo : 明るい箇所を増幅させる処理を効率化

もう少し調整しやすくするため、順番を入れ替えました。
一番下のレイヤに明るい箇所だけのパノラマ画像、その上に元のパノラマ画像を配置しました。
元のパノラマ画像は「加算」にしています。

レイヤタブで一番下のレイヤを選択、「調整」タブを選択。
「露出」を選択して、露出ウィンドウ右上の「×」を選択します。

この操作により、2つのレイヤの間に「露出調整」が入りました。
この露出調整のサムネイルをダブルクリックすると「露出」ウィンドウが開き、
「露出調整」のレイヤより下のレイヤ全体に対して露出がかかります。

これで、明るい箇所を自由な明るさで飛ばすことができます。
挙動として、明るさは「2^露出値」となる感じでした。

露出を変化させて、エクスポートでexr形式で出力します。
露出0から6まで変化させるようにしました。

Omniverse : Dome Lightの画像を上書きして確認

ここからはOmniverseの作業になります。
Omniverseでは、Dome LightのTexture Fileのパスはそのままにした状態で、
元のexrファイルを上書きすることで自動で変更が反映されます。
比較してみました。

ここでの「最大の明るさ」はexr画像をAffinity PhotoのカラーピッカーでピックしたときのRGBの最大値です。
目視では明るさが30あたりで、それなりなライティングになった気がします。

判断材料として、「影の付き方」「色」の比較を行いました。
すごく目視ですが、、、現実世界の影と色(両方ともライティングの影響を強く受ける)と、
3Dモデルに対しての影と色が近づくようにチェックしていきました。
曇り空のパノラマであるため、影はそれほどくっきりとは落ちません。

さりげなくカラーチェッカーを入れていますが、これも判断材料にしています。
なお、現段階ではホワイトバランスを含むPost Processingでの調整は行っていません。
OmniverseはPost Processingも機能が豊富にあります。
これは次回に書く予定です。

晴天の日も試す

もう1つサンプルとして、晴天でのHDRIも調整してみます。
360度パノラマは以下。

同じ場所、同じ時刻でのリファレンス用の写真です。

同様に、3つの露出があるパノラマ画像をAffnity PhotoでHDR結合、
別途、EV-3の画像を「調整」の「レベル」と「黒マットを削除」を使って明るい場所を取り出しました。

↓ 以下は、HDR結合後の画像です(exr)。

↓ 以下は、EV-3の画像から明るい箇所だけを抜き出した画像です(exr)。

太陽だけが残ったことになります。

レイヤとして「明るいところだけ」「露出調整」「HDR結合後の画像」と並ぶようにして、「HDR結合後の画像」は「加算」合成にしました。

これを露出を変えながらexr形式でエクスポートし、Omniverseに読み込んで確認していきます。

撮影場所/時間/天候にもよりそうですが、晴天の場合は最大の明るさが1000.0以上は必要そうでした。
太陽の中心の明るさが1027あたりのときは、以下のようにそれっぽくなりました。

晴天の場合は、影の付き具合(影の輪郭なども含めて)と
照らされたときの光による飛び具合が判断材料になりそうです。

今回はここまでです。
パノラマカメラの撮影からレンダラにも使えるHDRIを作成しました。
ここで作成したHDRIはOmniverseだけでなくオフラインレンダラでも使用できるものになります。
まだPost Processingの調整は考慮していないため、このあたりも次回解説入れていく予定です。