18.4K Views
January 17, 24
スライド概要
CEDEC2017 (Computer Entertainment Developers Conference 2017)で行われた講演
「『MONSTER HUNTER WORLD』のレンダリング技術とGPU最適化の紹介」
で使用されたスライドの後半パートです。
※本スライドには動画が含まれております。pptxファイルをダウンロードすることで動画込みでご覧いただけます
前半パートのスライドはこちらです。
https://www.docswell.com/s/CAPCOM_RandD/KENMD6-cedec2017
講演概要は以下のサイトをご覧ください。
https://cedec.cesa.or.jp/2017/session/ENG/s58db95edac30a.html
※CEDECの資料公開サイトCEDiLでも本資料が公開されています。
https://cedil.cesa.or.jp/
株式会社カプコンが誇るゲームエンジン「RE ENGINE」を開発している技術研究統括によるカプコン公式アカウントです。 これまでの技術カンファレンスなどで行った講演資料を公開しています。 【CAPCOM オープンカンファレンス プロフェッショナル RE:2023】 https://www.capcom-games.com/coc/2023/ 【CAPCOM オープンカンファレンス RE:2022】 https://www.capcom.co.jp/RE2022/ 【CAPCOM オープンカンファレンス RE:2019】 http://www.capcom.co.jp/RE2019/
『MONSTER HUNTER: WORLD』 のレンダリング技術とGPU最適化の紹介(後半) 株式会社カプコン 岩崎 秀介 ヴォンクサイ キティ
はじめに • MONSTER HUNTER: WORLD – 全世界向けに開発中のハンティングアクション – PS4, XboxOne, PC • 主に描画に 焦点を当てる 2
PBVR Physically Based Volumetric Rendering
アジェンダ • MHにボリューム描画? • PBVRというのは? • レファレンス実装 • GPGPUの基本アルゴリズム • 統合の最適化 4
MHにボリューム描画? • 空気感と距離感が欲しい • ライトシャフトの表現がしたい • ライティングがPBR 5
PBVRというのは? • Physically based Volumetric Rendering – 物理系ボリューム描画 • ほこりや小さな粒子が光線を偏向させている 6
PBVRというのは? 7
PBVRというのは? 8
PBVRというのは? 9
レファレンス実装 • 理論はMagnus Wrenningeの「Production Volume Rendering」シリーズに基づいてる [Wrenninge11] • Frostbiteの「Physically-based & Unified Volumetric Rendering」も参照した [Hill15] 10
レファレンス実装 11
レファレンス実装 12
レファレンス実装 13
レファレンス実装 14
レファレンス実装 15
レファレンス実装 16
レファレンス実装 • 単一散乱のみ • 完全に非同期コンピュート • 均一でないFroxel [Evans15] • 8x8や4x4 • 深さは32や64 17
レファレンス実装 18
タイルZ • タイルの大きさ(例:8x8) でZのmin/maxを作る • 240x135, 2 packed FP16 • コンソール機ならHTILEを そのまま使える 19
カウンタバッファ • D3D11_BUFFER_UAV_FLAG_COUNTER • RWStructuredBuffer::IncrementCounter • CopyStructureCount • DispatchIndirect • コンソール機ならGDS側の手動実装が必要 20
再計算 • 基本はZのminを使う • エッジの所はmaxも計算し ないといけない • タイル座標をカウンタバッ ファに入れる 21
再計算 Minのみ Min/Max 22
再計算 • Bilinear Filteringは見た目が良いが、エッジには効果がな い • タイル解像度が低いため、普通のBilateral Upsampling またはNear Depth Upsampling を使うと、多くのアー ティファクトが発生する[Shopf09] [BaJan11] • BilinearかBilateralのどちらを使うかを、アーティストが パラメーターで管理するヒューリスティックを使用して どちらを使うか決定する[Hennessy15] 23
再計算ヒューリスティック • Zの差と角度に対して平均 二乗誤差を使用して、タイ ルを再計算する必要がある かどうかを判断する • アーティストが指定した maxZより大きくなれば再 計算しない • それ以上はMipFogに切り 替える [Brinck16] 24
再計算 25
カリング • 再計算タイルにも行う • 4種類のプリミティブが対応 されている 26
カリング 27
カリング 28
カリング 29
カリング 30
カリング • 視錐台カリングをCPU上で行う • スレッドごとに1タイルを処理する • スカラーロードを使用してボリュームを反復処理する [Lottes17] • 入射点も出射点も必要 31
カリング • タイル毎に「一つのボリュームしかない場合」と「複数 ボリュームが存在する場合」で別のカウンタバッファに 入れる • 通過したボリュームの番号をパックして保存する 32
サンプリングポイント生成 • 入射点から出射点まで点を 生成する • ステップは線形か指数関数 かを選択 33
サンプリングポイント生成 • 複数ボリュームを通す場合 ソートが必要になる • Shuffle Bitonic Sort [Demouth13] 34
サンプリングポイント生成 35
関与媒体生成 • 以下のプロパティが対応され てる: 吸収 float3 (RGB) 発光 float3 (RGB) 散乱 float3 (RGB) 位相関数 int + float (type + 偏心) 消散 float 36
関与媒体生成 • 3Dテクスチャを使用して、ボリュームに詳細やシェイプ を与えることができる • UVアニメーション可能 • 同じボリュームを処理する可能性が高いため、ここもス カラーロードが非常に効果的 37
関与媒体生成 • ボリュームが重複している場合は、合成する必要がある • 吸収と発光および散乱を加えることができるが、位相関 数はできない • 位相関数の重みとして散乱の最高値を使用すれば十分 weight = max3(scattering.r, scattering.g, scattering.b) 38
ライト仕分け • 一つのシェーダですべての ライト組み合わせを処理す るとVGPRの数が多すぎる • 別のカウンタバッファに分 けて入れる • 合わせて28組み合わせが ある 39
ライトインジェクション • VGPRを減らすために影の PCFのサンプル数を減らす ことができる • 指向性ライトの影のみもで きる • GIの使用は任意 • 位相関数適用など • 出力は輝度と消滅 40
統合 • GPGPUの最適化の基本ア ルゴリズムの後に説明 • 出力は統合された輝度(左) と消滅(右) 41
ブラー • ダブルパスガウスブラ • 基本はBilinear • 再計算されたタイルが近くに あればBilateralに切り替え • 再計算タイルは別で処理する 42
時間軸再射影 • カラークランプで履歴を拒 否 • 再計算は別で処理する 43
チェッカーボード • ハーフ解像度にアップサンプル • 普通・再計算タイルの合成 8x8 2x2 8x8 44
アップサンプル • 基本はBilinearを使う • チェッカーボードタイルな らBilateralに切り替える 45
処理時間 • 最適化前(実装が合っているかどうか確認) – ~30ms • 最適化を行ってから – 1回目:~9ms • アーティストの検証のため – 2回目:~6ms • 制作に支障をきたさない速度 – 3回目:~2ms • コンソール機への最適化 46
GPGPUの基本アルゴリズム • できるだけ多くのスレッ ドに沿って作業を広げた い • ステップ効率性または演 算効率性に焦点を当てる • 「結合法則」を守らない といけない +, *, ^, min, maxなど 47
リダクション(シリアル) 48
リダクション(並列) *最も効率的な実装ではない 49
スキャン • 包括スキャンは、現在のものを含めてすべての前の要素 を処理する • 排他スキャンは、現在のもの以外のすべての前の要素を 処理する 50
スキャン(包括) Hillis & Steele (1986) [Hasenow07] *最も効率的な実装ではない 51
スキャン(排他) Blelloch (1990) [Hasenow07] *最も効率的な実装ではない 52
スキャン(排他) Step complexity Work complexity Hillis & Steele Blelloch 53
GPGPUの基本 • 次の最適化の段階はメモリのアクセスパターン 1. テクスチャ/バッファの読み込み回数を減らす • Gather命令など 2. キャッシュミスを減らす • • インデックスを同じ範囲内に保つ スウィズル(例:morton)と同じパターンで読み込む、 3. LDSを利用する 4. LaneSwizzle, QuadSwizzle 54
統合 • シンプルが計算量が多いの で並列化に最適 55
統合(シリアル) float3 T = 1 // transmittance float3 L = 0 // luminance // per tile from start to last interval { intervalLen = GetStepLen(step); // load 2 points T *= exp(-step.extinction * intervalLen); L += step.luminance * intervalLen * T; } 56
統合(並列1) • 32や64スレッド単位でタイルを処理する • 共通データとサンプリングポイントをLDSに必要にキャ ッシュ • 輝度の計算はリダクションを使う • 透過率の計算はHillisの排他スキャンを使う 57
統合(並列2) • 異なるスレッド間で共通データ読み込みを分散する • Read Laneで割り与えて • Quad Swizzleでサンプリングポイントを共有 • Lane Swizzleでリダクションとスキャンを行う 58
統合(並列3) • Blellochスキャンに切り替える • リダクションをまとめることができる 59
統合 Voxel depth: 64 Time (ms) Speed ↑ Total Speed↑ Serial 2.64 x1 x1 Scan (Hillis) + Reduction + LDS 0.69 x3.82 x3.82 Scan (Hillis) + Reduction + Swizzle 0.27 x2.5 x9.77 Scan (Blelloch) + Reduction (merged) + Swizzle 0.20 x1.35 x13.2 60
後半・まとめ • MH: Worldの物理ベースボリューム レンダリング (PBVR) • GPGPU の基本アルゴリズム – リダクション、スキャン • 高速化手法 61
謝辞 • Sony Interactive Entertainment Yi Hong Lin 様 • Microsoft Adam Miles 様 (順不同) • 技術面での手厚いサポートに深く感謝致します 62
Bonus Slides グローバルイルミネーション
最初の実験 • 最初にリアルタイムボクセルGIを試みた – ジオメトリシェーダでボクセル化 • 精度と範囲が低かった – カスケード対応しましたが足りなかった • 蓄積型 – 速いカメラの動きで収束するのが難しかった • 高速ボクセル化のために別個のLODが必要 – 無視できないメモリコスト 64
最初の実験 • 解決策はオフラインプローブに接続 • 精度が上がった • アーティストが最終的な外観をよりコントロールできる • 結局プローブのみになる 65
ライトプローブ • Irradiance(放射照度)のみ • 3次SH(球面調和関数)で圧縮 [Sloan08] • 時間変化は係数間の線形補間 • プローブネットワーク [Cupisz12] • HDRに必要な高輝度の光がアーティファクトを起こして いる – Gaussian、HanningまたはLancsozの窓関数 66
ライトプローブ 67
ライトプローブ 68
ライトプローブ 69
ライトプローブ 70
ライトプローブ 71
プローブネットワーク • 配置はDCCによって行われ、オフラインツールで処理さ れる • 均一なAABBグリッドで保存 • 配置を四面体化して、全てのAABBに対して当たり判定 する • 分散ビルド • Jenkins ⇒ ベークファーム 72
グローバルイルミネーション 73
ライトプローブ(シリアル) // per pixel aabb = FindAABB(worldPos); foreach tetra in aabb { if (IsInTetra(worldpos, tetra, out indexes, out weights)) EvalSH(indexes, weights) } 74
ライトプローブ(並列) • 多くのピクセルが同じAABBを使用するため、スカラー ロードが効果的 • すべてのスレッドにわたって4面体の当たり判定を広げ る • 多くの共通四面体の頂点とプローブの係数があるので、 ここでもスカラーロ-ドを使用できる 75
Bonus Slides その他
レンダリングパイプライン • SubScene – Reflection / Star / Wind / ComputeNormal • ZPrepass • GBuffer • GBuffer Decal • Shadow • Global Illumination • Volume Fog (PBVR) • Lighting / ScreenSpace • Sky / Sun • Transparent / Water • PostEffect • Tonemap / ResolveCBR • GUI • Display HDR / SDR 77
G-Buffer構成 R G 1 2 3 Roughness Format LightChannel RGBA8 sRGB Metallic Translucent Misc1 RGBA8 Misc2 SSSProfile 10_10_10_2 - 11_11_10F - - R32F packed - - RG8 (UAV except PC) - - D32F Normal (Octahedron) ExtraColor (Emissive or SSS) Velocity X 6 Z A BaseColor 4 5 B Velocity Y, Flag FurVelocity Depth - Misc1 bit0: No Lighting, bit1: Decal Mask, bit2: Non-metallic Fresnel, bit3-7: GBufferID Misc2 bit0-7: SSS Blend, bit8: Alpha Dither, bit9: No ExtraColor Flag bit0: Fur Enable 78
テクスチャパッキング • 基本的な格納フォーマット – Albedo: BC1 • 階調を持つアルファがあるものはBC7 – Normal: BC5 – Roughness / Metallic / Translucent: BC1 • 品質に問題があるものはBC7 – Emissive: BC1 79
ミップフォグ • VolumeFogではカバーしきれない遠景フォグ – “The Technical Art of Uncharted 4”[BM16]を参考 OFF ON 80
フォグ • ミップマップ付きCubeMapをサンプル – 距離に応じて参照するミップを変化させる • 撮影したローカル環境マップをベースに加工 Near Far 81
HDR対応で発生した問題2 • 一部のTVで変な絵が出る – カメラを動かすとUIにモーションブラー?? – 開発時はTVを「ゲームモード」に切り替えて制作 • ファームウェア更新を推奨 82
AlphaDitherBit 83
Quad Swizzle • 隣接する4スレッド間の任意のレジスタ交換 A B スレッド0 A B スレッド1 B D スレッド2 C A スレッド3 D B C D ROP単位(2x2) quadSwizzle (1, 3, 0, 1) 84
References • [BaJan11] - Jon Jansen, Louis Bavoil - Fast rendering of opacity mapped particles using DirectX 11 tessellation and mixed resolutions • [BM16] – Waylon Brinck, Andrew Maximov – The Technical Art of Uncharted 4 • [BNH10] – Eric Bruneton, Fabrice Neyret, Nicolas Holzschuch - Real-time Realistic Ocean Lighting using Seamless Transitions from Geometry to BRDF • [Bre16] - Chris Brennan - Delta Color Compression Overview • [Brinck16] – Waylon Brinck – The Technical Art of Uncharted 4 • [Bur15] - Brent Burley - Extending the Disney BRDF to a BSDF with Integrated Subsurface Scattering • [Cupisz12] - Robert Cupisz - Light probe interpolation using tetrahedral tessellations • [Demouth13] - Julien Demouth - Shuffle: Tips and Tricks • [Evans15]- Alex Evans - Learning from Failure: a Survey of Promising, Unconventional and Mostly Abandoned Renderers for ‘Dreams PS4’, a Geometrically Dense, Painterly UGC Game’ • [Hasenow07] - Mark Harris , Shubhabrata Sengupta, John D. Owens - Parallel Prefix Sum (Scan) with CUDA • [Hennessy15] - Padraic Hennessy - Mixed Resolution Rendering in 'Skylanders: SuperChargers‘ • [Hill15] - Sebastien Hillaire - Physically-based & Unified Volumetric Rendering in Frostbite 85
References • [Man16] - Jalal El Mansouri – Rendering Rainbow Six Siege • [Lottes17] – Timothy Lottes, GDC2017 – Advanced Shader Programming on GCN • [San16] - Ben Sander - AMD GCN Assembly: Cross-Lane Operations • [Shopf09] - Jeremy Shopf - Mixed Resolution Rendering • [Sloan08] - Peter-Pike Sloan - Stupid Spherical Harmonics (SH) Tricks • [Wih17] - Graham Wihlidal - 4K Checkerboard in Battlefield 1 and Mass Effect Andromeda • [Wrenninge11] - Magnus Wrenninge - Production Volume Rendering 86
CAPCOM Team • Tomohiro Ueda • Takumi Okadaue • Hiroshi Yasugi • Yasuyuki Takagi • Yusuke Kuroha • Munenobu Tajika • Taro Yahagi • Takayuki Osawa • Hitoshi Mishima • Hiroki Sone • Haruna Akuzawa • Teppei Yoneyama • Ojiro Tanaka • Yoshimi Matsukawa 87