129K Views
June 02, 23
スライド概要
講演アーカイブ:
https://youtu.be/gb7qXLnlaB4
講演内容:
『Hi-Fi RUSH』は60FPS最優先のリズムアクションゲームです。パフォーマンス重視だけどビジュアルにもこだわりたかった今作でオリジナル・トゥーン調グラフィックス表現の技術要素がどのようにUE4で実装されたかが解説されます。
講演者:
田中 康介(Tango Gameworks(ゼニマックス・アジア(株)))
駒田 喬(Tango Gameworks(ゼニマックス・アジア(株)))
新感覚リズムアクション『Hi-Fi RUSH』についてはこちら:
https://bethesda.net/ja-JP/game/hifirush
UNREAL FEST 2023 TOKYO 公式サイト:
https://unrealengine.jp/unrealfest/2023/
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
『Hi-Fi RUSH』開発事例 グラフィックスと最適化紹介 Tango Gameworks(ゼニマックス・アジア(株))田中康介 Tango Gameworks(ゼニマックス・アジア(株))駒田喬
自己紹介 田中 康介 ● 2011年にTango Gameworksにプログラマーとして入社。 ● 『サイコブレイク』ではVFX, 『サイコブレイク2』ではグラフィックスを担当。 ● 『Hi-Fi RUSH』ではリードグラフィックスプログラマーとしてグラフィックス 全般を担当。 2
自己紹介 駒田 喬 グラフィックス担当、物理とアニメーションも担当 CEDEC2022 Ghostwire: Tokyoの表現を支える プロシージャルアニメーション 3
目次 ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process Pass前まで) 描画パイプライン (Toon Post Process Pass) 描画パイプラインまとめ GPU物理シミュレーション まとめ プログラマー視点のグラフィックス紹介。 この中辛少し辛めかもしれないです。 4
ゲームの紹介 ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process Pass前まで) 描画パイプライン (Toon Post Process Pass) 描画パイプラインまとめ GPU物理シミュレーション まとめ 5
Hi-Fi RUSH特徴 (トゥーン表現) キャラ、背景、全世界が独自トゥーン表現 6
Hi-Fi RUSH特徴 (60FPS) 60FPSリズムアクションゲーム 7
Hi-Fi RUSH特徴 (Gen9ターゲット) Xbox Series S, Xbox Series XのGen9世代が開発ターゲット。 新しいハードウェアで新しいトゥーン表現が目標。 60FPSで動くGen 9トゥーンレンダリングのゲーム。 8
Hi-Fi RUSH特徴 (Native解像度) シャープ、クリーン、カラフルがキーワード。 Gen9コンソールでNative解像度がターゲット。 PC版はオプション機能としてSuper Resolutionにも対応。 目標解像度は Xbox Series S 1440P Xbox Series X 4K 9
Hi-Fi RUSH特徴 (Native解像度) 60FPS、Native解像度の目標は達成。 XboxではDynamic Resolutionを保険として有効。 Gen9のNative解像度を頑張った結果 幅広いスペックのPCで60FPSで動作可能。 Steam Deckでも60FPSで遊べます。 10
Hi-Fi RUSH特徴 (UE4) Unreal Engine 4を使用。 Hi-Fi RUSHの完全トゥーン調グラフィックスの為にエンジン改造。 UE4 4.27.2が最終バージョン。 11
Hi-Fi RUSH特徴 (UE4) パフォーマンス重視だけどビジュアルにもこだわりたかった今作が Deferred Toon Renderingでどのようにして目標を実現できたかをお 伝えできればと思います。 12
Digital Foundry Review 冒険的なトゥーン表現 固い60 FPS Xbox Series S 1440p https://www.youtube.com/watch?v=8qppoWhanwk&t=503s Xbox Series X 4K 高評価! https://www.youtube.com/watch?v=8qppoWhanwk 13
描画パイプライン (Base Passまで) ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process Pass前まで) 描画パイプライン (Toon Post Process Pass) 描画パイプラインまとめ GPU物理シミュレーション まとめ 14
描画パイプライン概要 UE4 標準のDeferred Renderingの描画パイプラインを拡張。 ・描画パスを追加することで独自Deferred Toon Renderingを実装。 ・UE4の良い箇所はスタイライズして利用。 ・UE4の重い箇所は自前描画パスを追加して代替機能を実装。 15
描画パイプライン概要 (対応3D描画機能) 描画パイプラインでは様々な3D描画機能に対応。 ● Forward Light, Decal LightなどのToon用Light ● Dynamic Shadow Map ● Static Shadow Map ● Capsule Shadow ● AO Volume Shadow ● Probeベース Diffuse Global Illumination ● Screen Space Ambient Occlusion ● Screen Space Reflection ● Post Process Outline ● Volumeベースの空間Post Process Toon Shading 16
描画パイプライン概要 (対応3D描画機能) 今回は紹介できないですが、以下の3D描画機能にも対応。 ● Volumetric Fog ● Camera Motion Blur ● Toon Motion Blur ● Tone Map ● Bloom ● Lens Flare 17
エンジン改造方針 マージ問題やプラグイン互換性問題 を考える。 方針は ・既存ソースコードの変更は最小限に。 ・なるべく新規ソースコードに新規パスを追加する。 ・必須ではない改造は行わない。 18
描画パイプライン (Base Passまで) ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process Pass前まで) 描画パイプライン (Toon Post Process Pass) 描画パイプラインまとめ GPU物理シミュレーション まとめ 19
とある1フレームのGPU Capture PIX on Windowsでとある1フレームのGPUキャプチャーを用意。 20
このシーンをキャプチャー 21
Timelineで生成される描画バッファ 22
Depth Prepass シーン全体の深度バッファをまず生成。 DBuffer Decalを使用しているため有効になっているUE4標準パス。 23
Depth Prepass (描画結果) 24
Shadow Pass UE4標準の影描画パス。 Dynamic Shadow有効ライトごとにShadow Depth Textureを生成。 影OnlyライトのSpotLight動的影や並行光源のCascade Shadow Mapを描画。 25
影OnlyLight 動的影 SpotLightの影などは専用影LightActorを用意。 影描画はそのActorを配置することでのみ使用可能。 処理負荷に余裕があり、配置が効果的な場合のみ影LightActorは使用可能。 26
影有りLightの使用には注意! 27
Shadow Pass (描画結果) 28
Shadow Pass (最終描画結果) 29
Base Pass Material Editorで作成した多くのMaterialをこのパスで描画。 UE4 Deferred RendererのGeometry Passに相当する重要なパス。 30
Base Passの役割 本作でのBase Passの大きな役割は2つ。 ・Deferred Toon Renderer用GBufferを作成。 ・Forward Lighting処理のToonのLit/Shade決定とForward Lightによるライ ティング。 31
Base Pass GBuffer出力に関して 標準的GBuffer構成のGBufferA, B, CのRGBA8 Buffer3枚を使用。 処理負荷の増加を考え、Bufferは増やさず、GBufferのChannel用途変更を選択。 32
GBufferの内容 GBufferA R8G8B8A8 GBufferC R8G8B8A8 GBufferB R8G8B8A8 R World Normal X R Base Color R R Metallic (0固定) G World Normal Y G Base Color G G Specular (用途変更) B World Normal Z B Base Color B B Roughness A PerObjectGBuffe rData A GBufferAO (用途変更) A ShadingModelID+SelectiveOutputMask SSRを使用しているため、Roughnessは使用済み。 トゥーンではMetallicとSpecularは不要。GBufferAOも不要。 修正箇所が少なそうなSpecularとGBufferAOを用途変更して使用。 33
Custom Stencil UE4のCustom StencilをPost Process Material内での処理のために8-bitフ ルに活用。 Custom Stencilの問題点は専用Custom Stencil描画パスによる処理負荷の増 加。 34
GBuffer Stencil GBufferの用途変更 = GBuffer Stencil GBuffer Stencilは処理負荷増加を避けた軽量Stencil Bit。 Material単位に処理負荷を気にせずに使用。 GBufferを持たないUnlitやTranslucentマテリアルでは使用できない。 このようなマテリアルはToon処理対象外なので問題にはならなかった。 GBuffer Stencil > Custom Stencil (処理負荷の軽さでは) 35
GBuffer Stencil (GBufferAO) // GBUFFERAO GBUFFER STENCIL BITS #define HBK_AO_STENCIL_CHARACTER_MASK #define HBK_AO_STENCIL_SKIP_NORMAL_OUTLINE #define HBK_AO_STENCIL_SKIP_DEPTH_OUTLINE 4 16 32 ・CHARACTER_MASKはキャラ判別に使用。 ・ SKIP_NORMAL_OUTLINE, SKIP_DEPTH_OUTLINEはPost Process Outlineの処理スキップに使用。 36
GBuffer Stencil (Specular) // SPECULAR GBUFFER STENCIL BITS #define HBK_SPECULAR_STENCIL_SKIP_SHADOW_MAIN #define HBK_SPECULAR_STENCIL_SKIP_SHADOW_2 #define HBK_SPECULAR_STENCIL_SKIP_SHADOW_3 #define HBK_SPECULAR_STENCIL_SKIP_SHADOW_4 #define HBK_SPECULAR_STENCIL_ENV_SKIP_AMBIENT_CUBEMAP #define HBK_SPECULAR_STENCIL_ENV_SKIP_STATIC_SHADOWMAP #define HBK_SPECULAR_STENCIL_ENV_SKIP_SSAO 1 2 4 8 16 32 64 STENCIL_SKIP_SHADOW系フラグは並行光源影や影OnlyLightの適用をSkip に使用。 Ambient Cubemap, Static Shadow Map, SSAOなどは各種ライティング効果 の適用Skipに使用。 37
Base Pass (Forward Lighting) Base Passの段階でForward Lightingも計算。 Base Passはエンジン改造が不要なので、ライティングの試行錯誤が行い やすい。 38
Base Pass (Lit/Shade決定) Lit Color = Base Color ToonのLit/Shade状態はBase Passで計算。 Lit ColorはGBufferのBase Colorに格納。 Shadow ColorはIsShadeMaskフラグをGBuffer Stencilに格納、実際の Shadow ColorはDeferredで後続パスで決定。 39
Base Pass (Forward Lighting) 上のシーンではForward LightのCutout機能を使用。 専用Forward Light Actorを配置してシーンをライティング。 40
Base Pass (Forward Lighting) Lit Color = Base Color Forward Lightの計算結果はGBufferのBase Colorに格納。 この事で問題が発生しましたが、GBufferは太くせず、GBuffer Stencil を使用して対応。 41
生成バッファ(Base Passまで) Base Passが終わりDeferred RendererのGeometry Passまでが完了。 42
描画パイプライン (Lighting Passまで) ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process Pass前まで) 描画パイプライン (Toon Post Process Pass) 描画パイプラインまとめ GPU物理シミュレーション まとめ 43
Ambient Occlusion Pass UE4標準のSSAOを描画。 44
Ambient Occlusion Pass (描画結果) 45
Ambient Occlusion Pass (最終描画結果) 46
Ambient Occlusion Pass (最終描画結果) 47
Capsule Shadow Pass UE4標準のCapsule Shadowを描画。 48
Capsule Shadow (キャラ影利用) 動的影 Capsule Shadowを影として使用することでNPC, Partner, 敵キャラに常にどの場 面でも影を落とせています。 Capsule Shadowの処理負荷は軽い。 49
Capsule Shadowは処理負荷が軽い! 50
Capsule Shadow (カメラ角度変更) 51
Capsule Shadow Pass (描画結果) 52
Capsule Shadow Pass (最終描画結果) 53
World Volume Lighting Pass World Volume Lightingパスは新規に追加した描画パス。 UE4のVolumetric Lightmapを改造したProbeベースのGIパス。 54
World Volume Lighting Pass (説明) 通常のVolumetric Lightmapだとレベル単位にベイク。 Actor単位にベイクできるように改造。 55
World Volume Lighting (使用方法) 1) 2) 1)World Volume Lighting Volumeを配置。 2)独自メニュからベイクを開始。 配置Volumeの空間限定でVolumetric Lightmapがベイクされ、 VolumeにVolumetric LightmapのIndirection TextureとBrick 3D Texture Dataを保存。 56
World Volume Lighting (利点) Volume範囲内でVolumetric Lightmapをベイクするので、ベイクが高速。 データも球面調和のAmbient情報のみが保存されるように改造したため、 軽量。 VolumeのBox GeometryでDeferredで描画するため描画も高速。 57
ProbeのDebug Visualization 58
World Volume Lighting Pass (描画結果) 59
World Volume Lighting (最終描画結果) 60
AO Volume Pass AO Volumeパスは新規で追加した描画パス。 61
AO Volume Pass (描画結果) 62
AO Volume Pass (最終描画結果) 63
Lighting Pass UE4の標準Deferred RenderingのShading Pass。 このパスでは独自Deferred Lightの描画と、影OnlyLightのタイプ情報を描画。 64
32-bit HDR 64-bit HDR Scene Color r.SceneColorFormat 32-bit HDR Scene Color Dynamic Rangeの精度的に問題はなく、スペックが低いプラットフォームほど 有効な高速化。 ただしR11G11B10形式なので、Alpha Channelがない。 65
Lighting Pass (64-bit RT準備) 32-bit Scene Color 64-bit Lighting Buffer 新規追加独自描画パスで32-bit HDRのSceneColorを64-bit HDRの新 Lighting Bufferにコピー。 66
Lighting Pass (Shadow Projection) 続いて影有りライトの場合、UE4標準パスのShadow Projectionパスを 実行。 67
Lighting Pass (Shadow Projection) 今回のシーンですとPlayer影の影OnlyLightのShadow Mask Texture を描画。 68
Lighting Pass (Deferred Light描画) 次のパスで実際にDeferred Lightを描画。 本作ではDeferred LightではなくDeferred Toon Lightを描画。 69
Lighting Pass (Deferred Light描画) このシーンではPlayerの影OnlyLightがDeferred Toon Lightとし て描画されています。 70
Lighting Pass (描画結果) 71
Lighting Pass (描画結果) 72
生成バッファ(Base PassからLighting Pass) UE4標準Deferred RenderingのShading Passまで完了。 73
描画パイプライン (Toon Post Process Pass前まで) ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process Pass前まで) 描画パイプライン (Toon Post Process Pass) 描画パイプラインまとめ GPU物理シミュレーション まとめ 74
Reflection Pass (SSR) ReflectionにはUE4標準のSSRを使用。 r.SSR.Qualityはmedium (no glossy)設定を採用。 75
Reflection Pass (SSR描画結果) 76
Reflection Pass (Mipmap生成) SSR Mipmap生成パスが続きます。本作で追加された独自パス。 Glossy表現は結局Mipmapのぼけを使用した簡易的表現を自前実装。 77
Reflection Pass (Mipmap使用方法) Roughnessに応じて解像度の低いMip Levelを参照。 処理負荷の軽い簡易的なGlossy表現を実現。 78
Reflection Pass (最終パス) Reflectionの最終パスはGlossy計算とトゥーン調のスタイライズ処理パス。 79
Reflection Pass (Glossy計算) Glossy計算は単純に前パスで準備したSSR Mipmapを参照。 80
Reflection Pass (スタイライズ化) スタイライズにはPosterize Cutout化とScreen Space Halftoneを実装。 81
Reflection Pass (描画結果) 82
Static Shadow Map Pass 動的影 Static Shadow Mapパスは新規に追加した描画パス。 アーティストが影を利用できるように静的影をベイクできる仕組みを用意。 83
Static Shadow Mapは処理負荷が軽い! 84
Static Shadow Map 説明 1)UE4のScene Capture機能を使用してShadow Depth Textureを事前にベイ ク。 2)Shadow Depth TextureはStatic Shadow Map Volumeに割り当てられ、 Volume単位にShadow Mask Textureに投影されます。 85
Static Shadow Map (利点) パフォーマンス Depth Pass不要のため、低処理負荷で影を描画。 Deferred Volumeで描画しているため、描画範囲を制限可能。 2D的絵作りとの相性も良い 好きな場所、角度にカメラとVolumeを配置して、狙った影を落とせる。 86
Static Shadow Map Pass (描画結果) 87
Static Shadow Map Pass (最終描画結果) 88
Decal Light Pass Decal Lightパスは新規で追加した描画パス。 新規に追加したDecal Light Actorを使用。 89
Decal Light特徴 Toon LightとしてCutout Textureの投影ライトとして主に使用。 90
Decal Light Decal Volume使用の最適化 91
Decal Light Pass (描画結果RT0) Static Shadow Map Pass 92
Decal Light Pass (描画結果RT1) RGB(左画像)にBaseColor調整色 Alpha(右画像)にDecal Lightの最終計算結果のBlend率 93
Post Process Outline Pass Post Process Outlineパスは新規に追加した描画パス。 Toon Rendererだとお馴染みの処理パス。 94
Post Process Outline Pass (説明) Depth Outline, Normal OutlineをMeshの内側に描画。 背景専用ポストプロセスアウトライン処理。 背景はマテリアル側のLENシステム(Line/Edge/Nuance)でTexture書き込みの Outlineも併用。 95
キャラのOutline キャラは背面法 を採用。 キャラのMeshの内側だと、カメラを引いた時、キャラの黒つぶれが発生しがち。 Meshの外側に描画されるアウトラインも検証しましたが、処理負荷が高すぎた。 96
Post Process Outline Pass (描画結果) 97
生成バッファ(Lighting PassからPost Outline Pass) Deferred Toon Rendering用の入力バッファを全て生成。 98
描画パイプライン (Toon Post Process Pass前まで) ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process Pass前まで) 描画パイプライン (Toon Post Process Pass) 描画パイプラインまとめ GPU物理シミュレーション まとめ 99
Toon Post Process Pass Toon Post ProcessパスはDeferred Toon RenderingのShading Pass。 GBufferやその他の描画結果を使用して最終Toon Shading処理を描画。 100
生成された描画バッファ 101
沢山のバッファが生成されました 102
Toon Post Process Pass (Scene Color前) 103
Toon Post Process Pass (Scene Color後) 104
Deferred Volumeの描画について Deferred Volumeの空間に対する描画とは? 通常Deferred RenderingのShading PassではLightをLightの実際の Geometryで描画。 105
Deferred Point Light 106
Deferred Spot Light 107
Deferred Toon Post Process Volume 108
Toon Post Process VolumeでToon Shading マップの各エリアも場所ごとのトゥーンの雰囲気を調整可能。 109
Toon Post Process Volumeの重なり 110
生成された描画バッファ 111
Volumeの重なりの最適化 Stencil Bufferを使用する標準的な手法で最適化。 UE4のSandbox Stencilを使用。 EarlyDepthStencilのGPU最適化は重要。Shader側指定を忘れないように! 112
Toon Post Process Pass (Toon化処理) Toon Post ProcessのToon化処理を2つ紹介。 ・3D TextureとAmbient Cubemap Textureを使用した空間的ライティン グ処理 ・各描画パスのスタイライズ処理 113
Shadow Color Volume DeferredのToon Post ProcessパスでShadow Colorを決定。 3Dテクスチャを準備、Shadow Color Volume Actorに割当て、シーンに 配置することで空間的にShadow Colorを調整。 114
Shadow Color Volume 適用結果 115
Ambient Cubemap Volume Ambient Cubemapを使用した明るさ調整も可能。 6方向のCubemap Textureを使用して3D空間に対して大まかな陰影づく りを行う。 116
Ambient Cubemap 適用結果 117
各種描画パスのスタイライズ 118
目次 ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process Pass前まで) 描画パイプライン (Toon Post Process Pass) 描画パイプラインまとめ GPU物理シミュレーション まとめ 119
描画パイプラインまとめ UE4の描画パスの利用できるものは利用しながらパフォーマンスや表現と して変更が必要なものは独自実装。 120
描画パイプラインまとめ 描画パイプラインで様々な描画パスを紹介しましたが、60FPSの目標が実現でき たのは ・技術の採用の段階でパフォーマンスを気をつけられた事 ・トゥーン表現として軽い処理負荷で3D描画処理をどう実現するかを考えた事 が大きい。 Deferred Toon RenderingもUE4がDeferred Rendererである事を考えると自然 な独自拡張の流れ。 121
参考文献 Stefan Gustavson. 2012. “Procedural Textures in GLSL”. Linköping University Electronic Press (OpenGL Insights, Chapter 7の内容). Michal Valient. 2014. “Reflections and Volumetrics of Killzone Shadow Fall”. SIGGRAPH 2014. Nikolay Stefanov. 2016. “Global Illumination in Tom Clancy’s The Division”. GDC 2016. Ramy El Garawany. 2016. “Deferred Lighting in Uncharted 4”. SIGGRAPH 2016. Randy Pitchford. 2017. “Borderlands 3 Unreal Engine 4 Tech Demo”. GDC 2017. 篠山範明. 2018. “Lightmass Deep Dive 2018 Vol.1: Lightmass内部アルゴリズム概要(Lightmap編)”. 篠山範明. 2018. “Lightmass Deep Dive 2018 Vol. 2: Lightmap作成のためのLightmass設定方法”. Li Bo. 2019. “A Scalable Real-Time Many-Shadowed-Light Rendering System”. SIGGRAPH 2019. Zhenzhong Yi. 2020. “From Mobile to Console: Genshin Impact’s rendering technology on Console”. Unite Seoul 2020. 大井 隆義. 2021. “BLUE PROTOCOLにおけるアニメ表現手法について~実装編~”. CEDEC 2021. 岩本東治郎, 久多良木勇人. 2022. "「アイドルマスター スターリットシーズン」におけるグラフィックス実装事例と最適化事例“. UNREAL FEST EXTREME 2022 SUMMER. 122
目次 ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process前まで) 描画パイプライン (Toon Post Process) 描画パイプラインまとめ GPU物理シミュレーション まとめ 123
こちらのセクションはゲーム終盤の ネタバレを含んでいます ネタバレが嫌な人は目と耳をふさいでおきましょう! 124
動画 125
コインエフェクトの要件 ● キャラやギミックの動きに反応して飛散すること ● 物量の多さを感じられること ● パフォーマンスで足を引っ張らないこと ● 手付のエフェクトに近い自然さと格好良さがあること 126
コインのGPU剛体シミュレーション 127
物理シミュレーションのシーン設定 ● ボスと戦闘する場所を覆うボックスを設定 ● 64000枚のコインをボックス内に配置 ● キャラやギミックと衝突して飛散エフェクトを生む 128
物理シミュレーションのシーン設定 コインの初期配置はランダム 碁盤目状の配置だとコインの飛散軌道に対称性がありすぎて不自然 129
物理シミュレーションのシーン設定 ● ボックスの床の高さは足場床と表面を覆うコイン床メッシュの間 ● シミュレーションしているコインは床で寝ているときはユーザから見えない → → ボックス床に落ちたコインを見せないことでコイン同士のめりこみや 枚数不足を隠す 足場床から浮かせることで飛散方向が上方向になり見栄えする 表面を覆うコイン床メッシュ はコイン ボックスの床 足場の床 130 a a a a
物理シミュレーションのオブジェクト設定 ● 剛体物理なのでコインの回転もシミュレーションする 慣性モーメントはコインの形状どおりのものを使用 ● コインは以下とコリジョンする ・ボックス ・キャラクターおよびギミックに追加した専用コライダ 専用コライダの形状はスフィアとカプセルに対応 131
PBDと参考文献 ● 物理シミュレーションにはPosition Based Dynamics(以下PBD) を採用 挙動の安定性の高さにより採用 ● 本件で参考にした論文 Matthias Müller, Miles Macklin, et al. Detailed Rigid Body Simulation with Extended Position Based Dynamics. ACM SIGGRAPH / Eurographics Symposium on Computer Animation 2020 ● PBDの概要 中川展男 Position Based Dynamics Onramp: 物理シミュレーション関連の最新論文実装 CEDEC2022 132
物理シミュレーションの実装 ParticleUpdateで毎フレーム以下を行う コライダの更新 ● スリープ状態の更新 ● 積分 ● コリジョンコンストレイント解決 ● 133
コライダの更新 ● ボックスは不動 ● キャラとギミックのコライダは動くし増減する ・毎フレーム、ボックス内で特定のObjectTypeをもっている コライダを検出 ・コライダの形状、位置、向き、サイズの情報を シミュレーションに渡す 134
スリープ状態の更新 動画 135
スリープ状態の更新 ● 64000枚中、多くのコインは動いていない スリープしているものは描画およびシミュレーションをカリングし 負荷を削減。描画はParticles.MeshIndexによってカリング。 ● 一定の速さを下回ったらスリープ状態に移行 床の動摩擦により速さが減衰する ● スリープしたら初期配置位置に戻す 戻さないとコインの多いところと少ないところのムラができる ● スリープ状態のコインにキャラとギミックのコライダが一定距離に近 づいたらスリープ解除 136
積分 通常のPBDと同じ 剛体なので向きと角速度も扱う 137
コリジョンコンストレイント解決 コリジョン判定 通常の剛体シミュレーション:円柱のメッシュ形状で扱う → 計算が複雑になり負荷が大きくなると予想 今回:厚みを考慮しないディスク形状として扱う ディスクの中で最も深くめりこんだ点のみを衝突点とする 138
コリジョンコンストレイント解決 コリジョンしたコインには以下を適用 めりこみの押し出し 反発、動摩擦(ボックスのみ) キャラとギミックでは反発と動摩擦は入れなくても表現に問題がなかったので不使用 ※ボックスとコライダはコリジョンしても動かさない。無限質量扱い 139
静止摩擦とコインの堆積 ● 動摩擦で十分だったので入れていない ● 堆積表現には必須 コイン同士のコリジョンコンストレイントに 静止摩擦がないと堆積を維持できない ● 初期は堆積の検証もしていたが負荷により断念 コイン同士のコリジョンを計算すると 空間分割構造を入れても負荷が大きい 物量が出せないと判断 140
その他の最適化 MeshRendererのフラスタムカリング コインが現実ではありえない大きさ シミュレーション枚数は減らしたい コイン床の描画負荷も減らしたい 現実の大きさだと視認しにくい → 3者の要望から、不自然にならない程度の大きさに決定 141
パフォーマンス ● 測定条件 Xbox Series S Testビルド 1440p 64000枚 コインがたくさん飛散するタイミングで測定 ● 測定結果 ・シミュレーション Niagaraによるシミュレーション:0.40ms ・描画(コインの描画を入れたことによる処理時間の増大 PrePass:1.10ms → 1.27ms Velocity:0.40ms → 0.64ms BasePass:2.08ms → 2.27ms ※コインは影はなし) コインエフェクトの合計処理時間は1.0ms 142
格好良さのための嘘 ● もっと回転させたい → 慣性モーメントのスケールパラメータ ● 飛散軌道にまだ対称性が見える コリジョン形状がボックス、スフィア、カプセル、ディスクなので素直な 物理シミュレーションだと飛散軌道が均一的になる → 速さの最大値を設定し、コインごとに値をばらつかせる (高さ方向のみ、コインの落ちる速さには制限はかけない) ● シミュレーションだけではエフェクトのクオリティが不足する箇所 → 手付けエフェクトで補ってもらっている 143
GPU物理シミュレーション実装の際のおすすめ ● CPU側で先に実装 ● シミュレーションはワールド座標系でなくローカルな座標系で 物理シミュレーションのシェーダデバッグは描画より大変な傾向 ステップ実行の容易なCPU側で十分に検証と実装を済ませる バグを取りきったものをGPU側に移植する floatは10進数で精度7、8桁 原点から100kmも離れると計算の積み重ねで数mmくらいは誤差が出る コインのスケールでは数mmの誤差でも不安定な挙動に シミュレーションはローカル座標系で描画への出力のみワールド座標系に 144
オプションによる枚数変更 ● デフォルトの低だと64000枚。中だと128000枚。高だと256000枚。 ● このオプションの効果を理解しているレビューを見たことがない ● 高だと飛散枚数が多すぎてプレイヤーキャラが見えにくくなるので ボス戦の難易度も調整できる 145
オプションによる枚数変更 ←チャイここ 146
目次 ゲームの紹介 描画パイプライン紹介 描画パイプライン (Base Passまで) 描画パイプライン (Lighting Passまで) 描画パイプライン (Toon Post Process前まで) 描画パイプライン (Toon Post Process) 描画パイプラインまとめ GPU物理シミュレーション まとめ 147
まとめ (Toon Post Process以降のPass) Toon Post Process Pass以降もCamera Motion Blur, Tonemap, Bloom, Lensflareなどをカスタマイズしています。 Translucency Passでは幾つかのFog表現を実装。 本作のVolumetric Fog表現の解析Fogも半透明マテリアルとして実装。 148
まとめ 本日は田中、駒田による発表でしたが、Hi-Fi RUSHのグラフィックス機能の実現には 様々な方が関わっています。 ・システム班 ・アーティスト達やアートディレクター ・背景プログラマの方々 ・国内のQAチームとBethesda QA ・GPU Maker各社 ・Microsoft ATG ・Epic Games Japanの皆様 149
まとめ ゲームごとにそれぞれ必要な技術は違いますが、本日の講演のどこかが皆様のUE4 のゲームでの実装にお役に立てばと思っています。 150
Q&Aで答えられなかった質問 PostProcessOutlineのOutline検出はどうやっているか? Normal outlineの場合は法線情報に対して2x2のLaplacianを使用して計算。 Depth outlineの場合も深度情報に対して2x2のLaplacianを使用して計算。 Outline検出用Kernelは幾つか検証しましたが、意味ある差は感じなかったので最終的に処理負荷の軽い2x2 Laplacianを採用しました。 Gbuffer Stencilを使用したキャラOutlineも検証にしましたが、背面法を採用したため、そちらは未使用です。 Stationary LightのStatic Shadowなどではなく何故Static Shadow Mapを自前 実装? Volumetric Lightmapベースの改造GIだったため、標準ライトビルドのStatic Shadow機能に必要なLightmap UVを本作のモデルはもっていなか ったです。またスタイライズ加工ができる独自RenderTarget出力ではなかったり、エンジン改造のコストが独自実装より高そうだったりで、あま りその方向でのStatic Shadowの実装は考えなかったです。 151
アンケートへのご協力をよろしくお願いします 152