【CEDEC2017】『MONSTER HUNTER WORLD』のレンダリング技術とGPU最適化の紹介(前半)

20.5K Views

January 17, 24

スライド概要

CEDEC2017 (Computer Entertainment Developers Conference 2017)で行われた講演
「『MONSTER HUNTER WORLD』のレンダリング技術とGPU最適化の紹介」
で使用されたスライドの前半パートです。
※本スライドには動画が含まれております。pptxファイルをダウンロードすることで動画込みでご覧いただけます

後半パートのスライドはこちらです。
https://www.docswell.com/s/CAPCOM_RandD/KYWR4N-cedec2017

講演概要は以下のサイトをご覧ください。
https://cedec.cesa.or.jp/2017/session/ENG/s58db95edac30a.html

※CEDECの資料公開サイトCEDiLでも本資料が公開されています。
https://cedil.cesa.or.jp/

profile-image

株式会社カプコンが誇るゲームエンジン「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/

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

『MONSTER HUNTER: WORLD』 のレンダリング技術とGPU最適化の紹介(前半) 株式会社カプコン 岩崎 秀介 ヴォンクサイ キティ

2.

はじめに • MONSTER HUNTER: WORLD – 全世界向けに開発中のハンティングアクション – PS4, XboxOne, PC • 主に描画に 焦点を当てる 2

3.

前半・アジェンダ • 描画システムの設計 • MH: World のための描画機能 • アルファディザ • HDR ディスプレイ対応 • 4K 対応 • 高速化 3

4.

MH: Worldの描画システムの設計 • 物理ベースレンダリング (PBR) • Direct3D 11 • Deferred Rendering • 多くの専用描画機能 4

5.

MH: Worldのための描画機能

6.

MH: Worldの描画 • 自然界を美しく表現 – 草木、空、星、水、海 • キャラクターを可愛く表現 – フェイシャル、ファー • 密度感(情報量の多さ)や透明感を重視 ※紹介する内容・画像はすべて開発中のものです。 6

7.

草木 7

8.

草木 • ミドルウェア SpeedTree を導入 • すべての草木が常に風を受ける – 速度・強さを種類毎に指定 – 揺れ方は3タイプ • 大域的な風揺れ(SpeedTree を利用) • 押し当たり • 局所的な風揺れ 8

9.

草木の押し当たり • キャラクターの草の掻き分けを表現 – 大きさを持つ球形状で当たり配置 – 4つまで反応 • ComputeShader で草木の近くのものをピックアップ 9

10.

草木の押し当たり(動画) • キャラクターの草の掻き分けを表現 10

11.

草木の押し当たり(動画) • デバッグ表示 11

12.

草木の局所的な風揺れ • 武器やモンスターの攻撃などを表現 – 押し当たりと同様に、球形状で4つまで反応 – 時間変化で球の大きさ・強さを変え、風圧を表現 12

13.

草木の局所的な風揺れ(動画) • 武器やモンスターの攻撃などを表現 13

14.

空 14

15.

空 • 全てアーティストのハンドメイド • 星、大気、雲、太陽で構成 • 雲は4層で構成 – 上下 x2、側面 x2 – 天球メッシュのUVでスクロール方向・速度を指定 15

16.

空(大気+太陽のみ) 16

17.

空(1枚) 17

18.

空(2枚) 18

19.

空(3枚) 19

20.

空(4枚) 20

21.

空(タイムラプス) 21

22.

星 22

23.

星 • 事前生成 – 数と位置・大きさ・等級・色温度をセットで保持 • 乱数で決定、必要に応じて書き換えも可能 23

24.

星 • レンダリング – 四角形を生成、円形にくり抜き加算合成 • 乱数で時間に応じた煌めきをつける 24

25.

水 25

26.

水 • アーティストのハンドメイド • 近似的な屈折表現 – 直前の描画結果を一時退避、UVをずらして参照 26

27.

水のインタラクション • すべての水面がキャラクターの動きに反応 – アルゴリズム • エフェクトが高さマップを加算合成で描画 • 法線に変換し、マテリアルの法線と合成 高さマップ 合成 27

28.

海 28

29.

海 • 頂点が動く – Gerstner波 (Large + Small) – ノイズ https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch01.html • 処理負荷に応じた 2 つのモード – メッシュ – クアッドテセレーション 29

30.

海のレンダリング • ライティング(反射) – 反射マップ、太陽 or 静的環境マップ • 太陽はBrunetonのBRDFモデル [BNH10] を実装 • 屈折 – Schlick近似式に従う • 演出用として、偽のフレネル係数や 屈折率を設定可能 空気 水 30

31.

海のレンダリング (cont’d) • 消失(光の透過率) – Lambert-Beer の法則に従う • どの距離でどの色がどの程度消失するかを指定 [Bur15] • 散乱(濁り) – 水深に応じて色が変化 水 • コースティクス(集光模様) – 単純な加算合成 地面 31

32.

海 なし 32

33.

海 深度 33

34.

海 消失+散乱 34

35.

海 ライティング 35

36.

海 屈折 36

37.

海 コースティクスマップ 37

38.

海 合成 38

39.

フェイシャル • 法線再計算 – スキニング後のワールド空間座標から法線を再生成 • 3x3行列を頂点法線に掛ける方法では、ジョイントの移動・ スケール成分を正確に反映できない – 頂点カラーでブレンド率指定 • パーツの境目の法線を滑らかに繋ぐ 39

40.

フェイシャル • えくぼ・唇の陰影が強調される OFF ON 40

41.

毛(ファー) • モーションブラーをそのまま利用 – 非常に細かい大量の毛を表現 OFF ON 41

42.

毛マテリアル • 専用のマップを用意 – RG: 横・下向きに生やす量、B: 毛の長さ 土台 ファー ベロシティ 結果 42

43.

アルファディザ

44.

アルファディザ(パンチ抜き) • 半透明を不透明で疑似的に表現する手法 – アルファ値に応じて「描く」「描かない」を判定 α=1.0 α=0.0 44

45.

アルファディザの利点 • 半透明に比べ、 • ☺ ポリゴンが被ったり突き刺さっても不自然に ならない • ☺ 厳密なZソートが不要 • ☺ 影を落とすのが容易 45

46.

アルファディザの活用 • カメラの視認性を向上 – 多くのオブジェクトにディザがかかるよう設定 • 木や岩は、全体に適用 • 地形は、適用するパーツと適用しないパーツに分離 – アルファ値は距離のみで判定(一部除く) 46

47.

アルファディザの活用(草木) 47

48.

アルファディザの活用(地形) 48

49.

アルファディザの欠点 •  GPU負荷が高い – GPUの高速化機能(階層Zカリング)や、ライトカリ ングの効率が落ちる •  縮小解像度で行う画面効果にアーティファク トが出る – 一度フル解像度で描き、縮小することで対処 49

50.

HDRディスプレイ対応

51.

MH: WorldのHDRディスプレイ対応 • PS4 / XboxOneのHDR10出力に対応 • 単に対応しただけでは品質が悪い – レンダリングパイプラインを見直し、一部リソース も再調整 – SDRの方が魅力的とは言わせない! ~最新タイトルの HDR対応~ 17:50 – 18:15 (3F 303) で紹介させて頂きます。 51

52.

結果的には? • ハイエンドHDRディスプレイでは本当に美しい – 階調が多いので、暗部がはっきりする • オプションとして彩度調整を導入 52

53.

HDR対応で発生した問題 • ネガポジ反転演出でHDR感がない – フィルタで saturate(1.0 - SceneColor) • 1.0以上の輝度が出ない • カラーグレーディングに処理を移した – ネガポジ専用の3D LUT (HDR)を用意 53

54.

4K対応

55.

4K対応 • 現行機上位版の登場をきっかけに対応 • MH: Worldのグラフィックスでは、上位版でも ネイティブ4K解像度では30fpsを下回る • チェッカーボードレンダリング[Man16]を採用 55

56.

チェッカーボードレンダリング(CBR) 現在のフレーム の色 前のフレーム の色 ● ● ● ●● ●● 合成 (リゾルブ) ● 56

57.

チェッカーボードレンダリング(CBR) 現在のフレーム 合成 (リゾルブ) 前のフレーム 57

58.

チェッカーボードレンダリング(CBR) • EQAA (Enhanced Quality Anti-Alias) を利用 [Wih17] – SubPixelの位置をパターンに合わせる – リゾルブの補助情報としてIDを生成 (ID Buffer) ● ● Pixel ● Sub Pixel ID ● 58

59.

チェッカーボードレンダリング(CBR) Color ID Buffer Result Velocity Prev Color 59

60.

CBRレンダリングパイプライン変更点 • Z-Prepassのモデル描画順序を変更 – 不透明 → ディザ → アルファ抜き(アルファテスト) • テクスチャ読み込みが必要なアルファ抜きを最小限に抑える • 僅かな変更のみ – 絵を出すだけなら想定より早く対応できた ☺ – 調整は一筋縄ではいかない… 60

61.

アルファディザとCBR • CBRとディザは”極めて”相性が悪い •  ディザパターンが斜めになる – Pixelが横方向2倍になっているため – 静止物体の場合、斜めパターンが画面に残り続ける ● Pixel ● Sub Pixel 61

62.

アルファディザとCBR (cont’d) •  物体・カメラが動くとチラチラする ※録画品質の問題のため、ディザ幅を本来の2倍に広げています。 62

63.

アルファディザとCBR (cont’d) •  物体・カメラが動くとチラチラする – リプロジェクションが正しくできない ●● 前のカラー (抜かれた) ●● ●● ↓ ↓ 今のカラー (抜かれない) 速度バッファ ? ? 結果 63

64.

キャラクターのディザの解決法 • 縦のディザを2倍広げる – ☺ ディザパターンは非チェッカーボードと同じ – ☺ ROPの処理単位(2x2pixel)と一致するため、 GPU固定機能ユニットの効率が上がり、高速 –  半透明の代用としては不十分 64

65.

キャラクターのディザの解決法(後) ※録画品質の問題のため、ディザ幅を本来の2倍に広げています。 65

66.

キャラクターのディザの解決法(前) ※録画品質の問題のため、ディザ幅を本来の2倍に広げています。 66

67.

ディザの穴とCBRの問題 • ディザがはっきり残り続ける –  輪郭はIDが異なるため、リゾルブ時にエッジを残 そうとする –  ディザを縦2倍にしたため、横長ディザより目立つ –  木・岩は動かないため、余計に目立つ • アルファ値を距離のみで決めている 67

68.

ディザの穴とCBRの解決法 • G-BufferにAlphaDitherBitを導入 – AlphaDitherBitが立っていたら、ハックを適用 • 近傍のAlphaDitherBitも取得し、ORをとる • 近傍のIDが同じものとみなし、均一の重みでブレンド • リプロジェクションの効果を強くする – ブレンド率を上げ、カラークランプを常に適用 – ☺ ディザ感が減り、半透明っぽくなる –  パラメータ調整が難しい • ジッター、残像、ギザギザ、ボケ –  負荷が増える 68

69.

ディザの穴とCBRの解決法 (結果) 69

70.

ディザの穴とCBRの解決法 (拡大) ディザ 50% Before After 70

71.

ディザの穴とCBRの解決法 (拡大) ディザ 25% Before After 71

72.

ディザの穴とCBRの解決法(MH: World) Before After 72

73.

ディザの穴とCBRの解決法(MH: World) Before After 73

74.

ディザの穴とCBRの解決法(MH: World) Before After 74

75.

高速化

76.

高速化 • GCN世代のRadeonの機能を使った事例 – Screen Rect List で星を高速化 – Quad Swizzle でブルームを高速化 76

77.

Screen Rect List • ポリゴンを四角形で描画する機能 – cf. SCREENRECT Topology (AGS Library) • 矩形をそのまま描画することで、ROP効率を上げる • 星の描画が15~25%高速化 – 微小ポリゴンを大量に描くため、効果が大きい 1 ROP最小単位(2x2) 2 1 4 3 5 Triangle List 6 2 3 ScreenRect List 77

78.

スィズル命令 • シェーダ内でスレッドを跨いで変数を交換 – Cross-Lane Operations (GPUOpen) – ☺ LDS (groupshared) を使わない [San16] • 頂点シェーダ・テセレータを邪魔しない • LDS BankConflict フリー – ☺ ComputeShader 以外でも使用可能 –  groupshared メモリほどの自由度はない – 2 種類の命令 • Quad Swizzle と Lane Swizzle 78

79.

Quad Swizzle • 隣接する 4 スレッド間の任意の変数交換 – 例:9-tap ガウシアンフィルタ • PixelShader でのテクスチャサンプル回数を削減 – 注意:Screen Rect Topology が必要 • ☺ カラー圧縮(Delta Color Compression)と併用可 – ComputeShaderではDCC圧縮書込が不可 (GPUOpen) • 5~10%高速化 [Bre16] tap1 – 応用範囲は広い tap2 quadSwizzle(a, 1, 0, 3, 2) 79

80.

前半・まとめ • MH: Worldのレンダリング技術と 高速化について紹介 • キティの講演に続きます – 物理ベースボリュームフォグ – 最適化 80