これは STYLYアドベントカレンダー の2日目の記事です!
STYLY for Nrealの一人称録画機能を開発した
STYLY for Nrealの一人称録画機能を開発しました。
NrealとはARグラスの一種です。
一人称録画機能とは、NrealLightについているカメラで現実世界を撮影したものを、AR映像と合成し、動画ファイルに出力する機能です。
STYLY for Nrealにご興味のある方は、こちらをご参照ください。
NRSDKの First Person View Video Capture
を使った
NRSDKには First Person View Video Capture
という機能があります。STYLYでも内部的にはこのSDKを利用しています。
基本的に、このサンプルコード通りに実装すれば、一人称録画機能は作れるのですが、一部のオブジェクトが録画に映らないという現象に遭遇しました。
(グラス越しにはちゃんと見えています)
半透明なオブジェクトが録画に映らない
サンプルアプリを試してみたところ、一部のオブジェクトが録画に反映されていませんでした。
フレームデバッガー等で調査したところ、 Render Queue
が Transparent
だと録画に映らない ことがわかりました。
NRSDKのコードを調査したところ、 NRSDK\Resources\Record\Shaders\AlphaBlend.shader に以下の行を見つけました。
fixed3 col_tex = lerp(col_bg.rgb, col.rgb, col.a)
ここで、実写映像 col_bg.rgb
と CG映像 col.rgb
をαブレンドしているのですが、 RenderQueue
が Transparent
の場合、 col.a
が 0
になっており、CG映像が消えていることがわかりました。
Render Queue
を AlphaTest
にすると録画に映る
Render Queue
を AlphaTest
にすると、半透明な物でもNrealの録画に映ることがわかりました!
以下の映像は、 Transparent
の箱と AlphaTest
の箱を並べて、Nrealで撮影したものです。
ご覧の通り、 Transparent
の箱は映っていませんが、 AlphaTest
の箱は映っています!
(ちなみに、箱の中にある玉は Opaque
です。)
念のため、Nreal Communityにも投稿しました。
とりあえず録画に映したければ AlphaTest
にするのが手っ取り早いです。
しかし、 Render Queue
をいじることによる弊害もあります。
Render Queue
をいじると前後関係が不自然になる
Render Queue
をいじると、前後関係が不自然になります。
以下の図をご覧ください。
- 左側の箱はRenderQueueが
Transparent (3000)
- 右側の箱はRenderQueueが
AlphaTest (2450)
- 箱の中にある玉はすべて
Opaque (2000)
Transparent
の箱の奥に AlphaTest
の箱がある時は見えますが、 AlphaTest
の箱の奥に Transparent
の箱がある時は見えません。玉は常に見えます。
これは描画順が Opaque (2000)
< AlphaTest(2450)
< Transparent(3000)
だからです。
ご覧の通り、前後関係が不自然に見えるため、 AlphaTest
の多用は避けたいところです。
ただ、録画に半透明なオブジェクトを映す方法は、今のところこれしか見つけていないので、どうしても映したいときは、この方法を使わざるをえないのが現状です。
さいごに
なんともモヤっとしますが、調査は以上です。
録画時にしか再現しない現象だったため、調査・対策にかなり時間がかかってしまいました。
今後、同じ症状に遭遇した人の助けになれば幸いです。
本記事作成にあたり、以下の情報を参考にさせていただきました。ありがとうございました。