【UNREAL FEST 2016 OSAKA】 VR×ロボ×美少女! UE4におけるVR向けの絵作りと最適化 メモ

  • 3
    Like
  • 0
    Comment
More than 1 year has passed since last update.

前回の続きです。
VR×ロボ×美少女! UE4におけるVR向けの絵作りと最適化は諸事情により写真撮影NGのため、メモを共有します。

最初に

mokoさんが「VR×ロボ×美少女! UE4におけるVR向けの絵作りと最適化」レポートで非常に分かりやすくまとめていただいたので、詳細はリンク先を見てください。

前回のメモでも書きましたが、mokoさんのを見て頂ければ私のは見なくていいですw
それでもよければ読んで頂けると幸いです。

togetterもあります。

こなべさん、ありがとうございます! 

メモ

VR×ロボ×美少女! UE4におけるVR向けの絵作りと最適化

株式会社ヒストリア 
エンジニア / TechResearch 原 龍様
テクニカルアーティスト 原 伸吾様

アーガイルシフトの開発体制

・バンダイナムコ
クオリティコントロール
アウトゲーム
実機の揺れやサウンドアセットの作成

・SOLA DIGITAL ARTS
マチネを使った全体的な演出を作成
キャラクター、背景などのアセット作成

・ヒストリア
UE4のシェーダー、ライティング、ポストプロセス、エフェクト作成

開発内容

・ワークフローの中心はマチネ

VRでの没入感を高めるために演出強化
背景はPBRで描画しつつ、キャラクターはアニメ的なシェーディングで描画したい!

擬似ライティングなしと擬似ライティングあり

高原の角度と法線から擬似的に光の影響を表現
カーブアセットを用いいて光原の角度や光の色を時間経過により変動させる

肌と髪は標準のを使っていない

キャラクターがそこに存在している感じを高めたい

・頭を動かしてもキャラクターが目線追従をしたい

常時こちらを見るのではなく、演出に合わせてブレンド率を切り替えることにより自然な目線を実現

・Two Bone IK
・Look at Target

・画面中央のレティクルに動きがなく視認性が悪くて機能していない
レティクルの追従にわずかなディレイを入れる

・自機の前進速度が速すぎて、打った弾がまっすぐ飛んでいかない
・うまく的に当てることができない

自機の前進速度に合わせてたまに軌道修正

・頭を左右に動かすというミサイル操作が難しい
単純にミサイルの速度を下げると危機感がない

ミサイルが近づいた際にスローモーション
視界全体の色も変えて危険を知らせ、回避を促す

・Set Global Time Dilation

UE4では簡単にゲーム全体の時間経過速度を変更可能

良い演出を余すことなく伝えるために!

最適化

紆余曲折を得て、ついに演出が完成
この時点で全体的に40FPS程度

VRでは90FPSが理想
最適化して改善を目指す

可能な限り、最適化前の演出や描画品質を落とさない
最適化はあくまでコンテンツの良さを余すことなくツアえるためのもの
最適化のためにコンテンツとしてのクオリテsぃを落とすこと本末転倒

最高のVR体験のために90fpsは厳守
90fpsを下回ると、途端に没入感が削がれる

すべてのシーン、カメラ位置からでも絶対に90fpsを下回ら似ことを目指す

stat unitでボトルネックを調査
GameスレッドCPUがボトルネック

C++、ブループリントともに細かく処理時間を確認することが可能

A 純粋じゃないMakeArray 戻り値をForeEachLoop
B 純粋のMakeArray 戻り値をForeEachLoop

・純粋関数とは
関数を純粋にすると直接呼べる

A MakeArray 300ms
B MakeArrayPure 430ms

同じ処理のも関わらず大きな差が

・二つの要因

要因:ForEachLoopの入力Arrayについて

ループ関数判定のための評価 実行
ループ実行の引数のための評価 実行

ForEachLoopは入力に渡された配列をキャッシュせず、ループするたびに最新のArrayを取得する
ループ実行中に配列の中身やサイズを変更すると思わぬバグにつながる

MakeArrayが一度しか実行されない
これは純粋じゃない関数はもう一度実行便を通過するまで結果をキャッシュするため

純粋関数はgetterなどの単純な処理に限定すべき
なんども実行されると問題があるような処理は避ける

エディタ上でGGameThreadが11ms安定
Standalone時は7msほどなので

・ほとんど効果がなかった負荷対策

・ベクトル長の比較時にLengthSquaredを使用する
Lengthとの100000回計算速度比較をしてもほぼ変わらず
内部的にはWindows標準のsqrtを使用している

・引数を参照することによりコピーコストを減らす
値渡しとの10000回実行速度比較をしてもほぼ変わらず

この時点で50fpsまで上昇
ボトルネックがGPU側に移動

・GPUプロファイラ
瞬間的なGPU処理時間を出力
Shader Complexity シェーダーの複雑ど
各ピクセルの計算に使用しているシェーダー命令数を視覚化

・距離とカメラが向いている方向を利用した自前の軽量カリング

範囲外のアクターは表示や、アニメーションの計算などを着る

・プリレンダ向けメッシュのリダクション

・スケルタルメッシュの頂点数
輸送機 80万越え×6
味方機 35万個げ×11
敵機 20万越え×たくさん
とてもヘビー

頂点数は35万から15万:6割減

見た目上で問題ないアクターはビルボードに変更

・アニメーション計算負荷を抑える
アニメーションが必要ないメッシュはstaticmeshに変更
アニメーションするメッシュも必要部分のみ
skeletalMeshにしてstaticmeshと併用
演出上、絶対に見えない部分のメッシュを削除

・マテリアルのブレンドモード最適化

半透明オブジェクトは描画コストが高い

UE4は半透明オブジェクトとは描画パスの都合上相性が悪い
木は重なりが多く、Maskでも重い
Maskは使わずポリゴンで形状を表現

・ダイナミックシャドウの調整
CastShadowのキル

・ぶっちゃけ作ってみないとわからない
演出の確認をする場合はHMDで確認を行っている
視差による相性の悪さから、使えなかった表現もある
演出も最適化も妥協すると途端に没入感を失う

強めのブルームを使用すると片目しか映らなかった時がある

Instanced Stereo Rendering
両目を同時にレンダリングする

感想

VRに関するすばらしい技術と情報を共有して頂き、ありがとうございます!
非常に参考になりました!