【UE4】1億画素以上のパノラマ画像出力に挑戦する (Panoramic Movie Capture)
ご縁もありネットVR写真館のパノラマがVRプレゼンテーションのサンプルとして使用していただけることになりました。活動レポート等がネットに載るとかの確認が私の方で取れたら改めてご紹介しようと思います。ヨーロッパでですが。
私も含めVRプレゼンテーションを手がけている多くの方は、業界的にまだまだ発展段階でありアイディアに苦戦しています。実例は双方にとって今後の非常に良い材料となりえるでしょう。
どこまで高解像度で出力できるのか
さて本題。できるだけ高画素を要求されたのでUE4のPluginsにあるPanoramic Movie Captureはどこまで行けるのかやってみました。
私のPCのグラボはNVidia GeForce GTX650, VRAM 2GB。実はモニタリングしているとデフォルトの4,096ピクセルで2GB振り切っちゃっているのでこれ以上無理なのかなと思っていました。
実はブループリント設定に順序があるっぽい
とりあえず2048pxの3倍じゃ。シャア専用じゃ。と思い、今のレベルブループリントに対して単純に「SP.StepCaptureWidth = 6144」に変更。
しかし出力された画像サイズは変わらない。どうして? と思いログを見ると「SP.PanoramicMovie」引数を認識させた時点で設定が確定するらしいです。私のブループリントは「SP.PanoramicMovie」の方を先に呼んでいたから変わらなかった、ということらしい。
NGパターン。「SP.PanoramicMovie」の次に「SP.StepCaptureWidth」がある。
OKパターン。「SP.PanoramicMovie」の前に「SP.StepCaptureWidth」がある。
以下が修正後のレベルブループリント。OKパターンの通りになっています。
どこまで行けるか
SP.StepCaptureWidth = 8192 の場合
とりあえず2倍の8,192ピクセルでやってみました。なんと普通に作れました。やっぴ~(ジャンケンマン風)。
SP.StepCaptureWidth = 12288 の場合
じゃあ3倍の12,288ピクセルでやってみたところ、落ちました。しかもPlay直後にストーンッッッと落ちる。「10,000ピクセルとかでリミッターがかかっているのか?」と思ったがメモリ不足で落ちている感じでもないし、どうも腑に落ちない。ソース見てみるかな。
ソースから原因を追う
UE4のソース見ればいいかと思い、ソースを見つつアテを付けてからデバッグしてみました。
調査の結果check()でコケていました。
結論を言うと「StepCaptureWidth値を上げるに従い、CaptureSlicePixelWidth値もそれなりに上げる必要がある」ことが判明。
StripHeight = CaptureHeight * slicePlaneDim.Y / capturePlaneDim.Y;
//↓コレ。バージョン4.15だったら212行目
//TODO: ikrimae: Come back and check for the actual right sampling rate
check(StripWidth >= (SphericalAtlasWidth / NumberOfHorizontalSteps) &&
StripHeight >= (SphericalAtlasHeight / NumberOfVerticalSteps));
//Ensure Width/Height is always even
StripWidth += StripWidth & 1;
StripHeight += StripHeight & 1;
このcheck()の条件を満たすように設定を変えてみました。「SP.StepCaptureWidth = 12288」と「SP.CaptureSlicePixelWidth = 1440」です。さあどうかな?
無事に出ました! グーだね。しかも、PCの動作だけ見ているとまだまだ余力がありそうです。
何億画素まで出せるか。限界への挑戦
ここからがいつもの悪い癖です。漢なら限界を突破したいじゃないですか。ロマンです。そこで、私のPCでどこまで出せるのかトライしてみました。
2,048、4,096、8,192、10,240、・・・、そして20,480ピクセル(2億0971万画素)の出力に成功。ファイルサイズは156MB。左目、右目用の画像2枚が出るまでに46分もかかりましたw
で、ここから先がだめでした。30,720ピクセル(4億7185万画素)がもうちょっとで出そうだったんですが、40分くらい処理し続けて落ちました。GPU Monitorを見ていたらいつもは30℃を示している温度が53℃にまで上昇していました。ごめんね。。。
これが2億画素(200メガピクセル)の威力
等倍で見てみると違いがよくわかります。ぜ~んぜん違う! これをkrpanoで変換してVRで見たら面白いかな。ということでコレを使ってkrpanoにかけてみようと思います。
左:4,096ピクセル(838万画素) / 右:20,480ピクセル(2億0971万画素)