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

【CEDEC2024】『鉄拳8』の揺れもの表現を支えた内製クロスシミュレーション

 【CEDEC2024】『鉄拳8』の揺れもの表現を支えた内製クロスシミュレーション

鉄拳8では衣服をはじめ、髪の毛やアクセサリー等、ありとあらゆる揺れもの表現に内製のクロスシミュレーションが利用されています。内製だからこそ小回りを効かせて実現できた機能や、衣服以外でクロスシミュレーションを利用するにあたって実施した、機能面での工夫をご紹介します。

一方で、クロスシミュレーションの対象物が増えるとクロスの枚数が増えて、負荷が心配です。そこで、鉄拳8ではGPUでクロスシミュレーションを実行することで、枚数が増えることによる負荷の上昇を抑えています。クロスシミュレーションをGPUで実装するにあたってのポイントについてもご説明します。

Bandai Namco Studios Inc.

December 24, 2024
Tweet

More Decks by Bandai Namco Studios Inc.

Transcript

  1. 『鉄拳8』の揺れもの表現を支えた 内製クロスシミュレーション 発 表 者 株 式 会 社 バ

    ン ダ イ ナ ム コ ス タ ジ オ 新 川 昌 典 共 同 研 究 者 ・ 開 発 者 株 式 会 社 バ ン ダ イ ナ ム コ ス タ ジ オ 藤 本 和 章 TEKKEN 8 & ©Bandai Namco Entertainment Inc. 発売元:株式会社バンダイナムコエンターテインメント
  2. 自己紹介 • 新川 昌典 (しんかわ まさのり) • 2014年度新卒入社 • 主にキャラクターアニメーションの研究開発を扱う部署に配属

    • 学生時代から物理に興味あり • ほかの技術に携わりつつ、内製のクロスシミュレーションに着手 • 他プロジェクトも経験(クロスは関係なし) • 鉄拳8 • プロジェクトの外側から、導入や運用をサポート • 現在は内製エンジン開発に従事
  3. 内製クロスの特徴 • すべてGPU • クロス1枚:コア1つに分散 • クロスを増やしても負荷が増えにくい • 躊躇なくクロスを増やせる •

    衣服以外に応用 • 躊躇なくクロスを増やせると、布以外に使用するアイデアが出てくる • 布以外も意図通りに動かせる機能
  4. ワークフロー • Maya • パラメータ設定 • コリジョン作成 • パラメータをエクスポート •

    プレビューはできない • Unreal Engine • ペルソナエディタでインポート • デバッグ描画も使って挙動を確認 • 鉄拳8固有のセットアップ Maya ツール+プラグイン UE5 ペルソナエディタ
  5. クロスの設定 • 頂点ごと • ペイントツールで設定 • スキニングからの可動範囲 • 距離(Max Distance)

    • 法線方向の距離 • Frontstop Limit (法線方向) • Backstop Limit (法線逆方向) • ほかにも様々 • スキニングに近づこうとする強さ • セルフコリジョンの衝突半径 • 等
  6. 硬い金属のアクセサリー • 半自動リジッドスキニング設定 • リジッドにしたい部分を塗りつぶす • 塗りつぶした領域を トポロジーで繋がった頂点にグループ化 • 鎖の輪を分割

    • 頂点のグループごとに 計算メッシュにリジッドバインド • 鎖の輪それぞれがリジッドな挙動に 輪っかのスケール許容 激しい動きでも 千切れて見せない スケール変形させない 形状維持重視
  7. 人工はためき • 波のパラメータを指定 • 周波数、振幅、波長 • 根元からの増幅度合い • 風が強いほど激しく揺らす •

    風速に応じて周波数を増やす • 風が強そうに見せる • 根元からつたう波 • 根元からの距離を位相に加味 波長 振幅
  8. リセット機能 • リセット機能 • スキニング結果に初期化される • それは安定した状態とは限らない • 震えたり重力落下が見える •

    空回しで解決 • 初期化から画面表示までの間に 数回クロスを更新 • 負荷は高い • 見た目と負荷のトレードオフ • 鉄拳8では15回 空回し無 空回し15回
  9. スロー • スローになると? • 時間進行が遅くなる • Delta Time が小さくなる •

    しかし、物理シミュレーションは Delta Time が変わると挙動が変わる
  10. スロー • Delta Time 非依存にする研究はある • XPBD等 • しかし、代償は大きい •

    追加の計算、メモリ • シームレスに見えればよいと割り切る • 欠点: 完全なDelta Time非依存ではない • 0.1倍速 x 10フレーム • 1.0倍速 x 1フレーム • 経過する時間は同じだが結果は違う • 利点: 線形的な外挿計算だけで済む
  11. • ゲームの Delta Time からはみ出た分は? スロー (資料用) 時間進行 ゲーム Delta

    Time 前フレーム 現フレーム クロス用 Delta Time 1. 時間逆方向に頂点位置を線形外挿 2. クロス用 Delta Time でクロスを更新
  12. スロー • 最初に固定 Delta Time で更新するとどうなる? 補間の結果 めり込んでないとは 限らない ゲーム

    Delta Time 前フレーム 現フレーム クロス用 Delta Time 2. 前フレームと頂点位置を線形補間 1. クロス用 Delta Time でクロスを更新 コリジョンめり込み 解消はこの時点 時間進行
  13. 全体の処理の流れ • 【CPU】スケルトンのポーズからコリジョンの姿勢を計算 • 【CPU】風など動的に決まるパラメータの計算 • 【CPU】パラメータやコリジョンをGPUのメモリにコピー • 【GPU】Compute Shader

    でスキニング • UE5 の GPUSkinCache を使用 • 【GPU】Compute Shader で計算メッシュ更新 • GPUSkinCache の後処理を差し込めるように UE5 を改造 • 後処理はプラグインに実装 • 【GPU】Compute Shader で表示メッシュに反映 • 計算メッシュで表示メッシュをスキニング • 描画に使用する頂点バッファに位置、法線、接線を書き込み
  14. 全体の処理の流れ • 【CPU】スケルトンのポーズからコリジョンの姿勢を計算 • 【CPU】風など動的に決まるパラメータの計算 • 【CPU】パラメータやコリジョンをGPUのメモリにコピー • 【GPU】Compute Shader

    でスキニング • UE5 の GPUSkinCache を使用 • 【GPU】Compute Shader で計算メッシュ更新 • GPUSkinCache の後処理を差し込めるように UE5 を改造 • 後処理はプラグインに実装 • 【GPU】Compute Shader で表示メッシュに反映 • 計算メッシュで表示メッシュをスキニング • 描画に使用する頂点バッファに位置、法線、接線を書き込み
  15. 計算メッシュ更新のスケジューリング • 1回の Compute Shader 実行 = 1枚の計算メッシュ更新すべて • 更新すべてを担うため、

    Compute Shader としては巨大 • オーバーヘッドが大きくなるのでパスを分割しない • 非同期 Dispatch • 直前の更新処理の完了を待たずに次の計算メッシュを更新 クロス1 クロス2 クロス3 クロス4 ・・・ 同期実行 非同期実行 クロス1 クロス2 クロス3 クロス4 クロス5 ・・・ クロス14 クロス15 クロス16 クロス17 クロス18
  16. 計算メッシュ更新の中身 • 使用頻度の高い頂点位置と付加情報は groupshared にコピー • スレッド間で共有されるキャッシュ • GPU の

    RAM よりもアクセスが高速 • 容量に制限あり (32 KiB) • groupshared にあるデータをたたき台にクロス計算 • 重力、空気抵抗、コリジョン、形状の維持 等 • クロス計算の結果をバッファに書き戻す
  17. Compute Shader の仕様 • 計算メッシュの頂点数は1枚当たり2048まで • groupshared の容量のため (32 KiB)

    • シミュレーションに関与しない頂点はカウント対象外 • メッシュの一部だけ計算メッシュはOK • 上限を超えた場合用のシェーダもあるが低速 • Dispatch のスレッドグループ数は1 • Dispatch(1,1,1) • スレッドグループのスレッド数は512 • [numthreads(512,1,1)]
  18. データ構造の工夫 • グラフ彩色 • 隣り合う3角形には違う色 • 同色の3角形は頂点を共有しない ため、並列に処理できる • グラフ彩色は貪欲法で実装

    • Smallest-Last Orderingという 色数を減らすためのヒューリス ティクスを利用 参考文献 M. Fratarcangeli, F. Pellacini: Scalable Partitioning for Parallel Position Based Dynamics
  19. データ構造の工夫 ス レ ッ ド 間 同 期 ス レ

    ッ ド 間 同 期 ス レ ッ ド 間 同 期 ほ か の 3 色 も 同 様
  20. パフォーマンス • 計算メッシュ(1体分) • 総枚数: 10 • 頂点数: 1535 (合計)

    • 最大558、最小54 • コリジョン(1体分) • 総数: 29 • 1枚当たり最大15 • GPU負荷 (2体分) • PlayStation 5: 0.134 ms
  21. パフォーマンス • 計算メッシュ(1体分) • 総枚数: 27 • 頂点数: 3017 (合計)

    • 最大658、最小20 • コリジョン(1体分) • 総数: 102 • 1枚当たり最大20 • GPU負荷 (2体分) • PlayStation 5: 0.232 ms
  22. GPU実装のメリット • 複数のレベルで並列化できる • コア • クロス単位で並列化 • スレッド •

    頂点や三角形などの単位で並列化 • スレッド数に目が行きやすいが、コア数の恩恵も大きい
  23. GPU実装のデメリット • デバッグが難しい • PIXなど特殊なツールが必要 • バッファをLockして、中身をデバッガで見るorログ出力 • 良いパフォーマンスを得るには制約が多い •

    少ない分岐、メモリアクセスパターン • 良いパフォーマンスを得られるアルゴリズムが限定される • 並列化できるデータ構造が必要
  24. まとめ • GPUで動かすと、クロスを増やしても負荷が上がりにくい • 1枚の計算メッシュを1つのコアで実行 • 複数の計算メッシュは複数のコアで非同期に実行 • 並列に実行できるようにグラフ彩色で処理単位をグループ化 •

    負荷が上がらないから、もっとクロスで揺らしたくなる • 制約が無いと、アーティストが新しい応用先を思い描きやすい • 揺らしたいものに特化した機能が増える • クロスによる揺れ物がさらに増える
  25. まとめ • ゲームならではの機能も整備 • バインドポーズから遷移しながら空回し • 自然なスロー演出 • DCCツールでの作業効率化 •

    UVからペイント用メッシュ生成 • ミラー複製 • ペイントの可視化 • 鉄拳8向けの機能 • 様々な体格にクロスを適応 • 特定の演出でクロスを差し替えて不具合を回避
  26. 関連セッション 『鉄拳8』 カスタマイズキャラクターのための多重リグシステム ~ 複雑な筋肉表現と大量生産の両立 ~ 8/21(水) 13:40 〜 14:40

    レギュラーセッション(60分) セッション会場:第三会場 株式会社アクトエイジ 大橋 英樹 株式会社バンダイナムコスタジオ 近藤 直樹 『鉄拳8』アニメーション技術 ~鉄拳7からの進化 8/21(水) 16:40 〜 17:05 ショートセッション(25分) セッション会場:第三会場 株式会社バンダイナムコスタジオ 稲城 聡
  27. Q. FP16にすることでgroupsharedに乗る 頂点数を増やすという方向性は? • 頂点数を増やすとクロスの挙動の自由度が増え、自分自身に突 き抜けてしまう機会が増えて、制御が難しくなります。 • また、それを防ごうとするとセルフコリジョンを使うことにな り、頂点数が増えた分以外の負荷も増えてしまいます。 •

    頂点数を大きく増やしたい場合、全く別の方法をとる必要があ ると考えております。 • 物理演算の特徴として、演算結果にさらに演算処理を加えるた め、FP16を使用することによる誤差の蓄積は懸念されますが、 見た目上の問題になるかどうかは実践しないと判断できないと 考えております。
  28. Q. 表示メッシュと計算メッシュのマッピ ングはどうしているのか • 表示メッシュ側で頂点ごとに影響半径を設定しています。 • この影響半径内にある計算メッシュの三角形を検索し、それに 連動します。 • 会場の質疑応答では計算メッシュの頂点と回答しましたが、実際には

    三角形です。 • 頂点で検索すると、 影響範囲内に三角形があっても、 画像左のように 連動する頂点が見つからない事態に 陥ることがあります。 • 開発の途中で画像右のように三角形で 検索するように変更しました