先日、GoogleのモバイルVR向けのレンダリング技術であるSeuratがオープンソースになりました
が、使い方が全くわからずもやもやしていたところ、コメント欄で使いかたがまとめられていたので試してみました
必要なもの
seurat-unity-plugin (Cloneしてください) github.com
seurat-compiled-msvc2017-x64.zip github.com
Seuratの流れ
Step1はUnity、Step2はビルド済みのPipelineを使ってそれぞれ生成します
Pipeline用の入力生成
CloneしたUnityProjectを開くと、Scene内にCaptureHeadBoxというスクリプトがアタッチされたSeurat Headbox Captureというオブジェクトがあります。
このCaptureHeadBoxはカメラが動く範囲のことで、その範囲内で見ることができるViewをキャプチャしていきます。
- Output Folder: Choose Output Folderから入力画像を吐き出したい場所を指定
- Headbox Size: カメラが動きまわる範囲です
- Sample Count: 上下左右前後の方向からそれぞれキャプチャする際に、それぞれ何枚ずつキャプチャするか
- Center Capture Resolution: 上下左右前後のそれぞれの面の中心となる位置の解像度です
- Default Resolution: Center以外の解像度です
- Dynamic Range: SDR/HDR16/HDRを指定できます
設定ができたら、Captureボタンを押しましょう。今回はサンプルのシーンをそのまま使います。しばらくすると画像が生成されます。
RGBの画像に加えて、Depth情報も出力されます。
Manifest.jsonには、Pipeline処理のために必要な情報が記載されています。詳しくは本家のpluginのページを参照してください。
Pipelineでジオメトリとアトラスを生成する
zipファイルを展開して、「seurat-pipeline-msvc2017-x64.exe」を使います。
コマンドプロンプトを開いて、
seurat-pipeline-msvc2017-x64.exe -input_path manifest.json -output_path 任意のパス
のように実行してください。すると処理がはじまり、だいたい10-15分程度でOBJファイルとPNGファイルが生成されます。
Unityへ取り込む
生成したOBJとPNGをUnityへ取り込みます。今回はCaptureに使ったプロジェクトと同じプロジェクトを利用します。
PNGは、
- mipmapを無効にする
- repeatをclamp
- 解像度を2046から4096に変更(重要)
してください。
Seurat_Resultをシーンに配置しましょう。
このような真っ白なCubeが現れると思いますが、慌てないでください。
default下のオブジェクトのShaderをGoogleVR/Seurat/AplhaBlendedに変更してください。今回プロジェクトを流用した理由がこれです(めんどくさい)
そしてTextureに先程のPNGを指定してやると、
このCubeの中を見渡してみると、先程Captureしたオブジェクトを確認することができます。
分かりづらいので、Cubeで生成してみたときの画像です。カメラから見えない部分はこのようになっています。
バッチ数比較
で、肝心のパフォーマンスについてですがバッチ数を比較してみると、
- Default: 16
- Seurat; 5
でした。単純なQuadでもここまで差がでるようです。
まとめ
というわけでSeuratを触ってみたでした。
今回他にもHoloLensでも動くのか?と試したところバッチリ動きました。インタラクティブなコンテンツには向きませんが、見るだけ系コンテンツや、賑やかしに使うにはいいかもしれません。
また、今回はそこまで調べられませんでしたが、Pipelineには色々引数がありカスタマイズ性は高そうでまだまだ遊べる余地がありそうです。