夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

HoloLens 2でブルームがしたい。 XRMTG 22年1月 LT登壇

本日はイベント登壇枠です。

〇XRMTG 22年1月

XRミーティング(XRMTG)は毎月一回第三水曜日に行われているxRイベントです。

今月は22年1月19日に行われました。

redhologerbera.hatenablog.com

今回はこのイベントで発表した内容を紹介します。

〇ブルームとは?

ブルームはグラフィックの表現技法のひとつで光の空間表現を行います。

f:id:Holomoto-Sumire:20220121204936p:plain
ブルームなし

f:id:Holomoto-Sumire:20220121204809p:plain
ブルームあり

ブルームの表現があることで光がオブジェクトから空間へ伝わっていることがわかると思います。

Unityでは[ポストプロセス(Postprocess)]と呼ばれる機能を用いてこれを実装しています。

f:id:Holomoto-Sumire:20220121205132p:plain

Unityの[SRP(スクリプタブルレンダーパイプライン)]では[Volume]コンポーネントによって[ポストプロセス(Postprocess)]は実現しています。

[ポストプロセス(Postprocess)]は後処理とも呼ばれる処理で、画面に画像を描画するときに行われる画像加工処理を指します。

イメージとして目に届く画像を眼鏡(ポストプロセス)によって加工しているようなものです。

f:id:Holomoto-Sumire:20220121205642p:plain

ブルームの処理はある一定以上明るいピクセルを抽出し、ぼかしてもともとの画像に合成するという処理をしています。

f:id:Holomoto-Sumire:20220121210353p:plain
もともとの画像

f:id:Holomoto-Sumire:20220121204809p:plain
合成後

〇HoloLens 2でのブルームの欠点

HoloLens 2でもブルームを使用することができます。

redhologerbera.hatenablog.com

この際問題となるものが2種類あります。

〇処理が重い

前述のとおりブルームを表現するためには一度計算し描画した画像をさらに加工するということが行われています。

HoloLensなど双眼のHMDの場合、右目、左目と2回描画しているため(※)単純にスマートフォンやスマートフォンなどと比べより負荷が増えます。

※厳密には2倍の計算をしているわけではなく、ある程度の処理を共通化している。

〇暗い

youtu.be

 もう一点の問題がHoloLens でブルーム…正確にはポストプロセスを使用する場合キャプチャ時に背景が暗くなってしまう点があります。

 これは、前述のとおりポストプロセスが既に描画した映像を再加工する際にα値(透明度)の情報を保持していないためと考えています。

 通常のVRやスマホゲームではグラフィックで作られた背景のためα値が存在しないことによる計算量が少ないなどメリットはあるもののデメリットはありません。

 HoloLens の場合透明なディスプレイに描画するため黒は実機上で透明と同義で見られますが、キャプチャ時には黒く描画されてしまうため映像が暗くなってしまいます。

〇FakeBloomShader

今回はBoothで公開されていた[FakeBloomShader]を改造してHoloLens 2に最適化しシェーダーでブルームを表現しました。

booth.pm

youtu.be

この利点としては映像の通り背景が暗くなることがありません。

またシェーダーのため、オブジェクトを描画していないタイミングでは処理が行われることはありません。(ポストプロセスの場合、眼鏡のイメージ同様常に処理が走っている)

オリジナルからの改造点としては次のようになります。

・URPに対応させた

・シングルパスインスタンシングレンダリングに対応

・オリジナルでは2つのパスで行われていた処理を一つにした

・その他if文を削除するなど処理の最適化

このうちシングルパスインスタンシングとは、xRの双眼ディスプレイ特有の右目、左目の画面描画に対する最適化です。

オリジナルのシェーダーではこれに対応していないことにより、片目が描画されない問題がありました。

このシェーダーの改造に関してはもう少し筆者のオリジナルの要素を作成したのち、記事にします。

〇まとめ

ポストプロセスを用いらず、シェーダーでブルーム表現することで多くの問題が解決しました。半面ブルーム処理が重いという点は変わらないためより軽量な手法を編み出す必要があります。