Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ダイナミックな変更を可能にするCyllista Game Engineのオープンワールド向けプ...

Cygames
December 17, 2021

ダイナミックな変更を可能にするCyllista Game Engineのオープンワールド向けプロシージャル背景制作ツールと描画機能

2021/11/14 Cygames Tech Conference

Cygames

December 17, 2021
Tweet

More Decks by Cygames

Other Decks in Technology

Transcript

  1. 本発表の内容 3/82 • Cyllista Game Engine の機能紹介 – オープンワールドに対応したゲームエンジンの事例として •

    テレイン関連のツールと描画機能 • フォリッジ関連のツールと描画機能 • アジェンダ 1. Cyllista Game Engine 2. オープンワールドゲーム制作における要求 3. テレインシステム 4. フォリッジシステム
  2. Cyllista Game Engine 5/82 • Cygames 内製で開発しているゲームエンジン – PC, ハイエンドコンソール向けに開発中

    – Project Awakeningで利用 • エンジン目標 – 制作者が最大のパフォーマンスを発揮できる – ハードウェアが最大のパフォーマンスを発揮できる • 過去のCEDEC講演 – Cygamesにおける次世代ハイエンドコンソール向けゲームエンジンの開発 [TAG17] – Python による大規模ゲーム開発環境 [OKI20]
  3. オープンワールドゲーム制作における要求 7/82 • 制作効率 – 広大なレベルをカバーするテレインの効率的な編集 • 昨今はタイトルにより 4km ~

    32km もの広さ – 一度に大量のフォリッジ配置 • レベルのほとんどの地域で植生が必要 – 高速イテレーション • レベル作成の試行錯誤 • リアルタイム反映 – 非破壊ワークフロー • 変更を要素ごとに元に戻すことができる • ある要素の更新が別の要素の自動更新を促す
  4. オープンワールドゲーム制作における要求 8/82 • 描画効率 – 広大な地形を効率よく描画 • 近景/遠景ともに – 大量のフォリッジを効率よく描画

    • 近景/遠景ともに • ゲーム中の高速な動的更新 – インゲームでのテレイン形状の変更 – インゲームでのフォリッジ配置や状態の変更
  5. セクター分割 12/82 • 編集とストリーミングの単位 – セクター毎に地形等の情報を保持 • ハイトマップ • マテリアルIDマップ

    • フォリッジ密度マップ etc. – ストリーミング • カメラ中心 • 11x11の範囲 128m 128m
  6. セクター選択ツール 13/82 他ユーザーが 編集中 自分が編集中 • セクターを選択して編集を開始 – 編集用メモリ確保 –

    編集状態マークを表示 • 他のユーザーの編集状態を表示 – ユーザー同士での競合を回避 • その他様々な機能 – 頻繁に編集するセクターのブックマーク – D&Dによるカメラ移動 – 3Dビュー上のグリッド切り替え – LOD情報のクックをトリガー(後述)
  7. 14/82 ハイトマップ • 解像度 257x257 ( 0.5m / pixel )

    • フォーマット – アセット: 32bit EXR – ランタイム: R16_UNORM ハイトマップ ハイトマップを用いたテレイン描画
  8. 15/82 データ構成:マテリアルIDマップ • マテリアルの ID を格納 • シェーダーで ID からマテリアル配列を参照

    • 解像度 257x257 ( 0.5m / pixel ) • 8bit 無圧縮 ( 0 – 255 ) マテリアル描画結果 マテリアルIDマップ マテリアル配列
  9. 16/82 データ構成:その他 • エコトープマップ – 最も粗いレベルのマテリアル分布分け – 例) 森林地帯、砂漠地帯、湿地帯、雪山 –

    解像度 129x129 ( 1.0m / pixel ) – 8bit 無圧縮 ( 0 – 255 ) • 色むらマップ – マテリアルの塗り分けとは別にでも色のムラを出すのに使用 – 解像度 132x132 ( 約 1.0m / pixel ) – BC1 フォーマット
  10. テレインLOD 17/82 • Terrain Quadtree [MOOR18][WEMA17][WID12] – テレインのLOD用 • 各種マップの低解像度版を

    Quadtree 上位ノードが保持 – 2km単位のラージセクター内を Quadtree 化 – セクター選択ツールから、またはナイトリーのジョブで生成 ラージセクター Quadtree 2km 2km
  11. テレインLOD 18/82 • Quadtreeは5段階 – セクター (LOD0: 128m) • 近景用

    • 基本編集単位 – 中間 (LOD1, 2, 3: 256m, 512m, 1km) • 中景用 • クック時に生成 – ラージセクター(LOD4: 2km) • 最遠景用 • クック時に生成 • 常駐
  12. 各種マップのランタイム合成 28/82 ② ベースハイトマップと合成 ① 入力ハイトマップ生成 ③ 点群配置と描画 ランタイム ハイトマップ

    入力テクスチャ + トランスフォーム + マスクテクスチャ テレインレイヤー メッシュスタンプ パスツール ベース ハイトマップ アセットを直接 入力として使用 必要なら ベイク パスをメッシュ化して ハイトマップに変換 ハイトマップに変換 必要に応じて フォリッジ点群 再生成 最終結果 セクター
  13. 分布 31/82 Cavity Flow Roughness Height Slope • 分布 :

    形状をパラメータ化 – 地面の傾き、高さ、凸凹具合、etc… – 2Dグレースケールマップ – Compute Shader で実装
  14. ルールとルールセット 32/82 • ルール – 分布 + マテリアル • ルールセット

    – ルールの集まり – ルールセットに基づいて 自動ペイント
  15. テレイン編集フロー 36/82 ①大枠の地形作成 ④地形の詳細作り込み ⑤区画の移動 ②エコトープ作成 利用ツール 作業フロー ③大枠のマテリアル割当 ハイトマップインポータ

    メッシュスタンプ テレインレイヤー ペイントツール プロシージャルペイント スカルプトツール ペイントツール メッシュスタンプ パスツール テレインレイヤー
  16. Terrain Quadtree 描画 38/82 • Terrain Quadtree 描画 – Quadtree各段階に対応するサイズのメッシュを描画

    – ロード状態と距離に応じてLODレベルを決定 – フラスタムカリングして描画
  17. ③カリング判定 ①レベルNの ノードが対象 Terrain Quadtree 描画 39/82 • 表示するノードレベルの判定 –

    子のロード状況に応じて自身のカリング状態を決定 – 子ノードに対して再帰的に判定 – スモールセクター(LOD=0)はそれ以上分割されない ②ロード状況チェック 子ノードが すべてロード済み 子ノードが 一部ロード済み 子ノードが未ロード レベルN全体をカリング 4分割し、子がロードされて いる部分をカリング 分割せずそのまま表示 N ④N-1を 同様に処理 N-1
  18. マテリアルブレンディング 42/82 • ブレンド処理の処理負荷が高い – Albedo + NRO = 2テクスチャ

    • NRO = Normal/Roughness/Occlusion をパックしたテクスチャ – 4つの各頂点のリニア補間 = 4ブレンド • 頂点ごとに1マテリアル – Triplanar Mapping = 3ブレンド • 崖等のテクスチャ伸び防止 – 近景と遠景でタイリング数が異なる = 2ブレンド • リピート感軽減のために遠景はUVリピート数を減らす ➡ ピクセル当たり合計 2 * 4 * 3 * 2 = 48 サンプル
  19. マテリアルブレンディング 43/82 • Triplanar Mapping – 伸び防止のためXYZ軸の3方向から投影 – 各軸の角度とサーフェス法線の角度を 重みとしてブレンド

    • Biplanar Mapping [QUI20] – 3軸のうち、ウェイトの高い2軸を 採用してブレンド – ブレンド数を3→2に削減 – Triplanar Mapping と遜色ない結果
  20. マテリアルブレンディング 46/82 • Biplanar + Stochastic + α – 近景(30mまで)

    • Biplanar Mapping – 2 * 4 * 2 * 2 = 32サンプル • XYZいずれかに垂直に近い面は その軸方向からのマッピングのみ – 2 * 4 * 1 * 2 = 16サンプル • 同一マテリアルの削減 – 2 * n * 1 * 2 = 4*nサンプル » n は 1 から 4 – 遠景 • 確率的に1つのマテリアルを選択 • 確率的に1つの投影方向を選択(Uniplanar) • 2 * 1 * 1 * 2 = 4サンプル
  21. プロシージャルフォリッジ配置 51/82 • 特徴 – GPUで配置 – ゲーム実行時にリアルタイム配置 – ルールで自動配置

    • 配置のためのデータ – フォリッジマップ:密度、エコトープ – 地形マップ:ハイト、ノーマル、マテリアル – モデル:植生や石など任意のモデル – 配置ルールとパラメーター • フォリッジレイヤー – モデルと配置パラメーターのセット • フォリッジプリセット – フォリッジレイヤーの集合
  22. 配置用マップ 52/82 • 密度マップ – フォリッジ点群の配置密度を保持 – ペイントツールで手動編集 – プロシージャルペイントにも対応

    – 4枚利用可能 • エコトープマップ – 大まかな景観の種類と範囲を表現 • 森林、砂漠、雪山、etc. • サブエコトープマップ – エコトープ内のバリエーション表現 • マテリアルIDマップ – テレインマテリアルIDを保持
  23. 配置用パラメータ 53/82 • 配置パラメータ – 配置間隔 – ランダムスケールと回転範囲 – 配置するテレインの高度と傾斜範囲

    – 密度マップインデックス – 配置されるテレインマテリアル – 配置されるサブエコトープ …etc.
  24. 点群パターン 60/82 • 密度マップを点群に変換 – ランダムでなく Deterministic な配置 – 密度に関わらず偏りのない一様な分布

    • 配置パターン – 事前生成した固定の配置パターン – 各点が2D座標と密度閾値(0~1)を保持 – 密度値が閾値を超える点を残す – セクターにタイリング – 配置間隔でパターンをスケール
  25. 点群生成 61/82 セクター カリング 点群生成 &ソート 点群 カリング 描画 描画フェーズ

    点群生成フェーズ ビューフラスタム セクター 配置点群 1. ビューフラスタム内に存在するセクターを特定 2. 点群を生成してソート • 可視性が変わったセクターのみ生成し直し 3. 点単位にカリングして描画 参考資料 [MUI17]
  26. 点群ソート 62/82 • 点群生成はGPUで並列実行されるため結果は順不同 – フォリッジレイヤー単位でソートが必要 • カリングと描画がフォリッジレイヤー単位のため – 場合によってはセクター単位のソートも必要

    • セクター単位でリードバックする必要があるレイヤー(コリジョンありの点群) • セクター単位で別マップにラスタライズ描画するレイヤー(ブッシュマップ) • ソートキー 1. フォリッジレイヤーインデックス(0~255、256種のフォリッジ) 2. アクティブセクターインデックス(0~120、11*11のロード済みセクター) • 2つのキーを1つに統合してソート • GPU Radix Sort [HAHO11] – ソートする値の範囲が限定されている場合に実用的
  27. フォリッジレイヤの依存関係 66/82 • 例)高木の周り10m以内だけ低木を植えたい – レイヤー間に依存関係を持つ – 依存される側(高木)の点群を Dependency Map

    にラスタライズ – 依存する側のレイヤー(低木)は Dependency Map を参照 Dependency Map フィルタ後 フィルタ前
  28. 遠景フォリッジ 68/82 • アクティブセクター範囲外ではフォリッジ配置データがない – 必要なマップがロードされていない → 点群を配置できない • レジデントマップ

    – 全セクター分割マップを一枚にマージ – 解像度はセクター単位マップの1/4 – ストリーミングなし、メモリに常駐 – Jenkins で毎日自動生成
  29. フォリッジインポスター 69/82 • エンジン内のツールでインポスターテクスチャ生成 – アルベド、ノーマル、ラフネス、オクルージョン、透過色、厚み • Octahedral Impostors [BRU18]

    – 上半球の様々な角度からキャプチャ – キャプチャ時のカメラ方向を、八面体展開したUVに対応付け – 描画時は視線ベクトルで同様の計算を行いUVを決定
  30. 機能とデータの関係図 75/82 編集ツール 対象マップ 出力 入力 入出力 ハイトマップインポータ メッシュスタンプ 手動ペイントツール

    プロシージャルペイント スカルプトツール パスツール テレインレイヤー ハイトマップ マテリアルIDマップ エコトープマップ 色むらマップ 密度マップ サブエコトープマップ テレイン描画システム フォリッジ配置システム コリジョンシステム サウンドシステム ノイズペイント 配置点群 利用システム Dependencyマップ ゲームプレイシステム
  31. 機能とデータの関係図 76/82 編集ツール 対象マップ 出力 入力 入出力 ハイトマップインポータ メッシュスタンプ 手動ペイントツール

    プロシージャルペイント スカルプトツール パスツール テレインレイヤー ハイトマップ マテリアルIDマップ エコトープマップ 色むらマップ 密度マップ サブエコトープマップ テレイン描画システム フォリッジ配置システム コリジョンシステム サウンドシステム ノイズペイント 配置点群 利用システム Dependencyマップ ゲームプレイシステム
  32. 機能とデータの関係図 77/82 編集ツール 対象マップ 出力 入力 入出力 ハイトマップインポータ メッシュスタンプ 手動ペイントツール

    プロシージャルペイント スカルプトツール パスツール テレインレイヤー ハイトマップ マテリアルIDマップ エコトープマップ 色むらマップ 密度マップ サブエコトープマップ テレイン描画システム フォリッジ配置システム コリジョンシステム サウンドシステム ノイズペイント 配置点群 利用システム Dependencyマップ ゲームプレイシステム
  33. 79/82 Cyllista Game Engine が掲げる指針に沿った機能開発 • ハードウェアが最大のパフォーマンスを発揮できる – オープンワールド前提の設計 –

    継続的な最適化 – ゲームの要求を満たしつつ処理負荷を可能な限り低減 • 開発者が最大のパフォーマンスを発揮できる – ベイクや事前データの準備を極力減らし、ランタイム実行 – 機能の利便性、実行速度、メンテナンスのためのシンプルさを注意深くバランス – 我々のチームにとって最適な機能開発 まとめ
  34. References 81/82 [TAG17] 多胡 順司. Cygamesにおける次世代ハイエンドコンソール向けゲームエンジンの開発 ~最高のコンテンツを支えるゲームエンジン~. CEDEC2017 https://tech.cygames.co.jp/archives/3043/ [OKI20]

    沖 幸太朗. Python による大規模ゲーム開発環境 ~Cyllista Game Engine 開発事例~. CEDEC2020 https://tech.cygames.co.jp/archives/3442/ [MOOR18] Jeremy Moore. Terrain Rendering in ’Far Cry 5’. GDC2018 https://www.gdcvault.com/play/1025480/Terrain-Rendering-in-Far-Cry [WEMA17] Guillaume Werle, Benoit Martinez. ‘Ghost Recon Wildlands’: Terrain Tools and Technology. GDC2017 https://www.gdcvault.com/play/1024029/-Ghost-Recon-Wildlands-Terrain [WID12] Mattias Widmark. Terrain in Battlefield 3: A Modern, Complete and Scalable System. GDC2021 https://www.gdcvault.com/play/1015676/Terrain-in-Battlefield-3-A [GOL17] Ben Golus. Normal Mapping for a Triplanar Shader. https://bgolus.medium.com/normal-mapping-for-a-triplanar-shader-10bf39dca05a [QUI20] Inigo Quilez. Biplanar Mapping. https://iquilezles.org/www/articles/biplanar/biplanar.htm [WYMC17] Chris Wyman, Morgan McGuire. Hashed Alpha Testing. I3D2017 https://casual-effects.com/research/Wyman2017Hashed/index.html
  35. References 82/82 [HOOK21] JT Hooker. Boots on the Ground: The

    Terrain of 'Call of Duty’. GDC2021 https://www.gdcvault.com/play/1027463/Advanced-Graphics-Summit-Boots-on [WOH21] Eric Wohllaib. Procedural Grass in 'Ghost of Tsushima. GDC2021 https://www.gdcvault.com/play/1027214/Advanced-Graphics-Summit-Procedural-Grass [MUI17] GPU-based Procedural Placement in Horizon Zero Dawn. GDC2017 https://www.guerrilla-games.com/read/gpu-based-procedural-placement-in-horizon-zero-dawn [HAHO11] Takahiro Harada, Lee Howes. Introduction to GPU Radix Sort. http://www.heterogeneouscompute.org/wordpress/wp-content/uploads/2011/06/RadixSort.pdf [BRU18] Ryan Brucks. Octahedral Impostors. https://shaderbits.com/blog/octahedral-impostors