【出張ヒストリア2019】Oculus Quest フリーロームVRを実現するための技術的知見

3.2K Views

March 25, 20

スライド概要

2019年8月4日に行われた「出張ヒストリア! ゲーム開発勉強会2019」にて発表させていただいた、
「”アスレチックVR PAC–MAN CHALLENGE(パックマンチャレンジ)”制作事例 ~Oculus Questを使用した我々の挑戦~」講演の技術的なパートの内容に、
UNREAL FEST EAST 2019で行った講演内容を書き加えたものです。

マーカーキャリブレーションの解説及びサンプルプロジェクトは以下のURLからDLできます。
https://historia.co.jp/distribution/docs/PC_MarkerCalibration.zip

イベント詳細
https://historia.co.jp/archives/12449/

講演者:
小倉 裕貴(エンジニア)

以下、セッション概要より抜粋。下記のセッションの技術パートのみとなっております。

MAZARIA(池袋)にて稼働中のOculus Quest(PCが必要無く、コードが無いタイプの新VRゴーグル)を使用した
フィールドVRアクティビティ、”アスレチックVR PAC–MAN CHALLENGE(パックマンチャレンジ)”。
コードが無いというのは自由に歩き回れるというだけではなく、新たな価値を生み出していました。
前半では本タイトルを通じて得た、コードレスによりもたらされた新たなゲームデザインについてお話いたします。
また、後半ではハードウェアスペックとの戦いや、どのように複数人プレイを実現したかなどの技術的知見をシェア出来ればと思います。

profile-image

株式会社ヒストリアは、Unreal Engine専門のソフトウェア開発会社です。ゲーム事業とエンタープライズ事業、2 つの軸でソフトウェアの企画、開発を行っています。また、Unreal Engine の学習を目的とした作品制作コンテスト『UE5ぷちコン』や、『出張ヒストリア! ゲーム開発勉強会』を主催、技術ブログを毎週更新など、Unreal Engine コミュニティを盛り上げる活動も行っております。

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

Oculus Quest / フリーロームVR を 実現するための技術的知見 エンジニア 小倉 裕貴 historia Inc.

2.

スライド配布について • 一部を配布予定 • プロジェクト配布 – https://historia.co.jp/distribution/docs/PC_MarkerCalibra tion.zip – UE4.22にて動作確認済み はじめに historia Inc. 2

3.

略称について • 「Unreal Engine 4」を「UE4」 • 「Oculus Quest」を「OQ」 • 「Head Mounted Display」を「HMD」 はじめに historia Inc. 3

4.

目次 • 開発環境と実装方針 • フリーロームVRのための機能 – 移動スケール – プラットフォームごとのPawn – マーカーによるキャリブレーション • グラフィックスパフォーマンスについて – 事前のパフォーマンス検証 – 描画オプション検証 – 終盤のパフォーマンス調整 はじめに historia Inc. 4

5.

自己紹介 • 小倉 裕貴(Ogura Yuki) – エンジニア – historiaブログ管理人 – 宴会ソムリエ はじめに historia Inc. 5

6.

目次 • 開発環境と実装方針 • フリーロームVRのための機能 – 移動スケール – プラットフォームごとのPawn – マーカーによるキャリブレーション • グラフィックスパフォーマンスについて – 事前のパフォーマンス検証 – 描画オプション検証 – 終盤のパフォーマンス調整 開発環境と実装方針 historia Inc. 6

7.

開発環境について • Oculus VR配布のカスタムエンジン – 最新のOculus SDKsによる実装 – OQ動作要件を満たすために使用 • 最終バージョン UE4.21.2 – 最終的に3回エンジンを変更 時期 プロトタイプ パフォーマンス検証前 最終バージョン Version UE 4.20 UE 4.20 UE 4.21 開発環境と実装方針 historia Inc. Distribution EPIC Games Oculus VR Oculus VR 7

8.

実装方針について(1/2) • Blueprintで実装 – プロトタイプのイテレーションを重視 – エンジン変更時の修正を減らす • コードはプラグインとして実装 – Android固有機能でコードが必要 開発環境と実装方針 historia Inc. 8

9.

実装方針について(2/2) • 完全なゲームプレイには広いスペースが必要 – 常時使用はできない – 使用準備に時間がかかる スペースでの確認を最小限にする エディタで確認しやすいようにする 開発環境と実装方針 historia Inc. 9

10.

目次 • 開発環境と実装方針 • フリーロームVRのための機能 – 移動スケール – プラットフォームごとのPawn – マーカーによるキャリブレーション • グラフィックスパフォーマンスについて – 事前のパフォーマンス検証 – 描画オプション検証 – 終盤のパフォーマンス調整 フリーロームVRのための機能 historia Inc. 10

11.

移動スケール(1/2) • 自席や狭いスぺースで実機テストしたい ➢HMDの移動量を増やし、少しの移動で大きく動かす機能 Move Scale = 1.0 フリーロームVRのための機能-移動スケール- historia Inc. Move Scale = 4.0 11

12.

移動スケール(2/2) • CameraコンポーネントのLocationを変更できない ➢HMDの移動に応じて 親コンポーネントの位置をオフセット オフセットのためのSceneを追加 Locationを変更できない フリーロームVRのための機能-移動スケール- historia Inc. 12

13.

移動スケール(2/2) • CameraコンポーネントのLocationを変更できない ➢HMDの移動に応じて 親コンポーネントの位置をオフセット HMDの位置から オフセットを取得 親となるコンポーネントの 位置を調整 フリーロームVRのための機能-移動スケール- historia Inc. 13

14.

目次 • 開発環境と実装方針 • フリーロームVRのための機能 – 移動スケール – プラットフォームごとのPawn – マーカーによるキャリブレーション • グラフィックスパフォーマンスについて – 事前のパフォーマンス検証 – 描画オプション検証 – 終盤のパフォーマンス調整 フリーロームVRのための機能 historia Inc. 14

15.

プラットフォームごとのPawn (1/2) • エディタと実機で同等のゲームプレイ – VR空間のプレイヤーと同じ挙動を再現する ➢実行時にプラットフォームによってPawnを切り替える フリーロームVRのための機能-プラットフォームごとのPawn- historia Inc. 15

16.

プラットフォームごとのPawn (2/2) • OQで使われるPawn – VRプロジェクトテンプレートのPawnを改造 • Windowsで使われるPawn – Default Pawnを改造 – PIEではOQのPawnと同等の挙動を行う フリーロームVRのための機能-プラットフォームごとのPawn- historia Inc. 16

17.

プラットフォームごとに同等の挙動の実現 ➢ インターフェースにより異なる処理を同じように振る舞わせる ➢ 「手で握る」などの固有の処理は、Pawnごとにテストが必要 手で握った物に対して 「Pickup」を実行 何であっても「Pickup」されたら このフルーツを取得する コリジョンに触れた物に対して 「Pickup」を実行 フリーロームVRのための機能-プラットフォームごとのPawn- historia Inc. 17

18.

プラットフォームごとのPawnの切り替え (1/3) 1. 実行プラットフォームを確認 フリーロームVRのための機能-プラットフォームごとのPawn- historia Inc. 18

19.

プラットフォームごとのPawnの切り替え (2/3) 2. 実行プラットフォームに応じたDevice Pawn Classを取得 3. Default Pawn Classと異なる場合のみ切り替える フリーロームVRのための機能-プラットフォームごとのPawn- historia Inc. 19

20.

プラットフォームごとのPawnの切り替え (3/3) 4. Device Pawn ClassをSpawnActor 5. Possess 6. 切り替え前のPawnをDestory フリーロームVRのための機能-プラットフォームごとのPawn- historia Inc. 20

21.

目次 • 開発環境と実装方針 • フリーロームVRのための機能 – 移動スケール – プラットフォームごとのPawn – マーカーによるキャリブレーション • グラフィックスパフォーマンスについて – 事前のパフォーマンス検証 – 描画オプション検証 – 終盤のパフォーマンス調整 フリーロームVRのための機能 historia Inc. 21

22.

マーカーによるキャリブレーション • アニメーションを残すためにスライドを分割 • スライドは配布プロジェクト内に添付 https://historia.co.jp/distribution/docs/PC_MarkerC alibration.zip はじめに historia Inc. 22

23.

まとめ(フリーロームVRのための機能) • 制作のイテレーションを止めないために 移動スケールやプラットフォームごとのPawnを制作した • 広いスペースにおけるキャリブレーション問題に対し マーカーを用いた高精度で運営負担の少ない キャリブレーション機能を制作した フリーロームVRのための機能 historia Inc. 23

24.

目次 • 開発環境と実装方針 • フリーロームVRのための機能 – 移動スケール – プラットフォームごとのPawn – マーカーによるキャリブレーション • パフォーマンス検証について – 事前のパフォーマンス検証 – 描画オプション検証 – 終盤のパフォーマンス調整 パフォーマンス検証について historia Inc. 24

25.

今回目指すパフォーマンスについて OQの最大フレームレート 72FPSの維持 パフォーマンス検証について historia Inc. 25

26.

事前のパフォーマンス検証 (1/7) • OQで可能なグラフィックス表現の目安 ◼ポリゴン数 ◼テクスチャ枚数 ◼半透明 etc …… 企画の仕様に基づいたモックアップで検証 パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 26

27.

事前のパフォーマンス検証 (2/7) • ブランクプロジェクトから開始 Mobile向け Scalable 3D (Mobile HDR off) Multi Viewのみ 有効に変更 パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 27

28.

事前のパフォーマンス検証 (3/7) • 企画時点の仕様 ◼ 8 x 7[m]のスペース ◼ 50 x 50 x 50[cm]のブロックで 床や壁を作る 256個のブロックで 検証レベルを作成 一辺のブロック数 16[個] ≒ 8[m] パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 28

29.

事前のパフォーマンス検証 (4/7) • なぜ床だけ? ◼ オクルージョンカリングで 壁に隠れたブロックが消える ◼ 床が全て見えるとき 最大の描画負荷 実際には…… 壁がある方が負荷は大きくなる (オクルージョンカリングが有効でないため) パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 29

30.

事前のパフォーマンス検証 (5/7) • 計測方法 1. stat fpsの値を計測 2. 2視点の最悪値を記録 3. メッシュとマテリアル の組み合わせを変える 全ブロックが映る 真上からの視点 プレイヤーの身長ベースの 斜め俯瞰視点 複数のメッシュと マテリアルの傾向を調べ 現実的なスペックを求める パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 30

31.

事前のパフォーマンス検証 (6/7) • 使用するブロック ◼Verticesなどが異なる12種類 SM1 Triangles:12 Vertices:24 SM4 Triangles:360 Vertices:216 SM6 Triangles:620 Vertices:402 パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. SM12 Triangles:1404 Vertices:816 31

32.

事前のパフォーマンス検証 (7/7) • 使用するマテリアル ◼Instructions, Texture Lookupsなどが異なる12種類 ◼BlendModeを変えたものをそれぞれずつ用意 M_Cube01O BlendMode:Opaque M_Cube04O BlendMode:Opaque M_Cube07T BlendMode:Translucent パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. M_Cube12M BlendMode:Masked 32

33.

事前のパフォーマンス検証 (1/6) 列:使用メッシュ 緑のセル:FPS≥70 行:使用マテリアル 赤のセル:FPS<40 パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 33

34.

事前のパフォーマンス検証 (2/6) TranslucentはOpaqueよりも重い 量が多い床・壁には Opaque パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 34

35.

事前のパフォーマンス検証 (3/6) 「軽量」なマテリアルのとき FPSを維持できる妥当なスペック ブロックあたりポリゴン数 150~250 パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 35

36.

事前のパフォーマンス検証 (4/6) 「軽量」なUnlitなマテリアルは Opaqueなら負荷は低い 半透明を使うなら Unlit パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 36

37.

事前のパフォーマンス検証 (5/6) • Texture Lookup(PS)でソートした結果(昇順) パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 37

38.

事前のパフォーマンス検証 (6/6) • Texture Lookup(PS)でソートした結果(昇順) Texture Lookupが1枚以下は 2枚以上より軽い傾向 量の多い床や壁のテクスチャは 1枚 パフォーマンス検証について-事前のパフォーマンス検証- historia Inc. 38

39.

目次 • 開発環境と実装方針 • フリーロームVRのための機能 – 移動スケール – プラットフォームごとのPawn – マーカーによるキャリブレーション • グラフィックスパフォーマンスについて – 事前のパフォーマンス検証 – 描画オプション検証 – 終盤のパフォーマンス調整 パフォーマンス検証について historia Inc. 39

40.

描画オプション検証 (1/12) Mobile HDRを使用したい…… 負荷軽減する描画オプションを調査して Mobile HDRを使用する余地を探る ◼ ◼ ◼ ◼ ◼ OpenGL ES3.1 Vulkan FFR Level Mobile MSAA Mobile Multi-View etc…… パフォーマンス検証について-描画オプション検証- historia Inc. 40

41.

描画オプション検証 (2/12) • 検証方法 ◼MARZA様制作のテストレベルを使用 ◼プレイヤー想定の4アングルを用意 ◼描画オプションを変えてFPSを測定 パフォーマンス検証について-描画オプション検証- historia Inc. 41

42.

描画オプション検証 (3/12) • Support OpenGL ES3.1 ◼ハイエンドモバイル向けシェーダー機能の拡張 ◼テクスチャ枚数制限の緩和 結果 有効にすると最大6msほど悪化 Angle 1 Disable 43(23.199ms) Enable 38(26.171ms) Angle 2 40(24.141ms) 37(26.684ms) Angle 3 Angle 4 27(35.748ms) 72(14.033ms) 24(41.766ms) 71(14.153ms) パフォーマンス検証について-描画オプション検証- historia Inc. 42

43.

描画オプション検証 (4/12) • Support Vulkan ◼ オーバーヘッドを低減し、描画・電力効率を改善する ◼ Mobile HDRが必要? ◼ Mobile Multi-View / Mobile Multi-View Directと併用できない? 結果 他のオプションと競合し、 起動しない・画面がチラつくなど 安定して使えない(※検証当時の結果) パフォーマンス検証について-描画オプション検証- historia Inc. 43

44.

描画オプション検証 (5/12) • FFRLevel ◼視点中央から離れるほど解像度を下げる 結果 タイプによって最大8msほど改善 Angle 1 Angle 2 Angle 3 Angle 4 ETiled Multi Res Level Off 43(23.204ms) 41(24.390ms) 25(39.687ms) 72(13.934ms) ETiled Multi Res Level LMSLow 48(20.881ms) 44(22.727ms) 31(32.004ms) 72(13.918ms) ETiled Multi Res Level LMSMedium 50(19.993ms) 48(20.833ms) 36(27.846ms) 72(13.903ms) ETiled Multi Res Level LMSHigh 56(17.628ms) 47(21.276ms) 36(27.845ms) 72(13.924ms) パフォーマンス検証について-描画オプション検証- historia Inc. 44

45.

描画オプション検証 (6/12) • Disable Vertex Fogging in mobile shaders ◼有効にするとモバイルで大気フォグを省略する 結果 有効にすると1~2msほど改善 Angle 1 Angle 2 Angle 3 Angle 4 Enable 43(23.204ms) 41(24.141ms) 25(39.687ms) 72(13.934ms) Disable 39(25.505ms) 39(25.526ms) 24(41.774ms) 71(14.117ms) パフォーマンス検証について-描画オプション検証- historia Inc. 45

46.

描画オプション検証 (7/12) • Mobile MSAA ◼モバイルで使用できるアンチエイリアシング 結果 目立った改善は見られない 見た目も変化なし → 4x MSAA固定? Angle 1 Angle 2 Angle 3 Angle 4 No MSAA 43(23.204ms) 41(24.141ms) 25(39.687ms) 72(13.934ms) 2x MSAA 43(23.44ms) 41(24.366ms) 25(39.443ms) 72(13.925ms) 4x MSAA 41(24.137ms) 41(24.127ms) 24(40.827ms) 71(14.151ms) 8x MSAA 42(23.902ms) 41(24.592ms) 27(36.803ms) 72(13.928ms) パフォーマンス検証について-描画オプション検証- historia Inc. 46

47.

描画オプション検証 (8/12) • Mobile Multi-View / Mobile Multi-View Direct ◼ CPU負荷を下げるVR最適化用のオプション ◼ Mobile版のステレオレンダリングのようなもの ◼ Mobile HDRと併用できない 結果 有効にすると最大6msほど改善 Angle 1 Angle 2 Angle 3 Angle 4 Disable 38(26.221ms) 40(25.301ms) 21(48.734ms) 48(20.884ms) Enable 43(23.199ms) 40(24.141ms) 27(35.748ms) 72(14.033ms) パフォーマンス検証について-描画オプション検証- historia Inc. 47

48.

描画オプション検証 (9/12) • Monoscopic Far Field Rendering ◼ 両眼用に2回必要な遠景の描画を1回にまとめる ◼ Mobile HDRと併用できない ◼ Mobile Multi-View / Mobile Multi-View Directと併用できない? 結果 Oculusカスタムエンジンでのみ 該当のオプションが存在しない パフォーマンス検証について-描画オプション検証- historia Inc. 48

49.

描画オプション検証 (10/12) • Mask-based Foveated Rendering – 視点中央から離れるほど解像度を下げる ≒ FFRLevel • Anti Aliasing Method – 使用するアンチエイリアシング手法 ≒ Mobile MSAA • Instanced Stereo – 両眼用に2回必要なレンダリングを1回にする ≒ Mobile MultiView 結果 Mobileでは効果がない(Desktop向け機能) パフォーマンス検証について-描画オプション検証- historia Inc. 49

50.

描画オプション検証 (11/12) • Mobile HDR ◼ハイエンドモバイル向けの機能を使えるようにする ◼マテリアルで実現できる表現が拡張される 結果 有効にすると最大7msほど悪化 Angle 1 Angle 2 Angle 3 Angle 4 Disable 43(23.204ms) 41(24.141ms) 25(39.687ms) 72(13.934ms) Enable 34(29.721ms) 32(31.534ms) 18(54.909ms) 48(20.655ms) パフォーマンス検証について-描画オプション検証- historia Inc. 50

51.

描画オプション検証 (12/12) • Mobile HDRを使用するか? MobileHDR前提の機能は多い パフォーマンスの低下が著しい • OQのサンプルゲーム「First Steps」を参考に ◼半透明による発光表現の代替など Mobile HDRなしで可能な表現で作りこむ方針へ パフォーマンス検証について-描画オプション検証- historia Inc. 51

52.

最終設定 オプション名 設定 PixelDensity 0.95 MobileHDR False Disable vertex fogging in mobile shaders True Maximum number of CSM cascades to render 1 Support movable light CSM shader culling True Mobile Multi-View / Mobile Multi-View Direct True Support Combined Static and CSM Shadowing False Support Distance Field Shadows False Support Movable Directional Light False Max Movable Point Light 0 Support OpenGL ES3.1 False FFRLevel ETiledMultiRes Level_LMSHighTop パフォーマンス検証について-描画オプション検証- historia Inc. 52

53.

目次 • 開発環境と実装方針 • フリーロームVRのための機能 – 移動スケール – プラットフォームごとのPawn – マーカーによるキャリブレーション • グラフィックスパフォーマンスについて – 事前のパフォーマンス検証 – 描画オプション検証 – 終盤のパフォーマンス調整 パフォーマンス検証について historia Inc. 53

54.

終盤のパフォーマンス調整 • 中盤も最適化を続ける ◼頂点数の削減 ◼マテリアルの改善 etc...... しかし、部分的に負荷が大きい…… 負荷の大きい部分を調査 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. 54

55.

Merge Actor (1/2) • 複数のメッシュを1つにまとめる機能 Draw Callがまとまり、Draw負荷が下がる Cullingが効き難くなり、GPU負荷が上がる Merge Actor前 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. Merge Actor後 55

56.

Merge Actor (1/2) • 複数のメッシュを1つにまとめる機能 Draw Callがまとまり、Draw負荷が下がる Cullingが効き難くなり、GPU負荷が上がる DrawとGPUの負荷バランスが最良となる Merge Actorの組み合わせを調べる Merge Actor前 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. Merge Actor後 56

57.

Merge Actor (2/2) • ラウンドのMerge Actor ◼床・壁を小分けの 区画としてMerge Actor ◼マテリアルLODを設定 区画の大きさを変えてもDraw負荷が優勢…… ラウンドの床・壁を全て一つにMerge Actor パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. 57

58.

Software Occlusion Culling (1/2) Occlusion Cullingが動作していない • Software Occlusion Culling ◼ MobileでOcclusion Cullingを行うための代替機能 ◼ 遮蔽物となるメッシュを事前にOccluderに設定し Occluderに遮蔽されたメッシュのみCullingする機能 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. 58

59.

Software Occlusion Culling (2/2) Software Occlusion Cullingも効いていない ◼ Opaque以外のマテリアルが割り振られていたため ◼ 床・壁とネオン管のメッシュを 分離する必要がある 終盤での修正は困難…… Occlusion Cullingは断念 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. 59

60.

Use Lightmap Directionalityの無効化 Pixel Shader(マテリアル)の負荷が高い • Use Lightmap Directionality 負荷が小さくなる ライトマップからのライティングがフラットになる ライティング対象の 一部マテリアルで無効化 見た目への影響は小さかった 描画負荷は僅かに改善 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. 60

61.

Texture Sampleの削減 背景の負荷が高め ◼Texture Sampleが多い Normal MapとPanner Noiseを削除 シーン全体で1ms改善 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. 61

62.

Reflection Captureの範囲縮小 Reflection Captureの範囲が広い ◼背景全域を包むような範囲 範囲を縮小 プレイエリアの外周を覆う程度まで縮小 僅かにパフォーマンス向上 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. 62

63.

大気フォグの代替 • 大気フォグの使用 ◼遠近感を出すために必要 ◼Disable Vertex Foggingを 無効にして使用 天球への焼きこみに代替 Disable Vertex Fogging in mobile shaders の有効化により負荷軽減 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. 63

64.

Pixel Densityの変更 • Pixel Densityを0.95に変更 ゲームのどこを見ても72FPSを維持 少しボヤっとした見た目になる よりよいゲーム体験の実現のため 最後の詰めにPixel Densityを調整 パフォーマンス検証について-終盤のパフォーマンス調整- historia Inc. 64

65.

まとめ(グラフィックスパフォーマンスについて) • プロジェクト初期から検証を行い 表現可能な指標を決めてから制作し 現実的に可能な表現を模索した • 定期的なパフォーマンスチェックも行いつつ 終盤では最後の詰めとなる調整を行い より良いゲーム体験を実現した パフォーマンス検証について historia Inc. 65

66.

まとめ • ルームスケールVRという制約の多い制作において 制作の手を止めないためのデバッグ機能や 広いスペースに由来する問題に対処する機能を制作した • Oculus Questという新しいデバイスに対し 事前検証を十分に行い、出来ること・出来ないことを 明確にしてから制作を行った おわりに historia Inc. 66