「LostPlanet2 DirectX11 Features」中継視聴メモ

テッセレーションの活用

細分割のアルゴリズム
  • PN Triangles (N Patch)
    • 欠点
      • サーフェースの連続性が低い
  • Phong Tessellation
    • 欠点
      • PN Trianglesより曲面の連続性が低い
  • Approximating Catmull-Clark
    • 欠点
      • 専用のデータ構造。データ量
Lost Planet 2での選択→PN Triangles
  • PN Trianglesの問題点
    • クラック(穴があく)
    • デザイン的な問題
  • クラック対策
    • ジオメトリパッチ用の「ジオメトリ法線」を持つ
      • 同一座標の異なる法線を統合する
  • エッジを検出
    • 三角形ごとに、クラックするエッジの情報を3ビットで持つ
  • Phong Tessellationへの適用
    • エッジ対応に拡張(計算は重いので必要なときのみ)
  • その他のクラック
    • Tジャンクション
  • 長いエッジが丸くなりにくいパラメータを用意し、デザイナがマテリアル単位で調整
  • ディスプレースメントマップの作成
    • コンテンツパイプライン
      • XSI
      • ZBrush
      • XSI (AltiMappeer)
  • ディスプレースメントマップの問題
    • クラック
      • 同一座標で異なるUVの場合
      • 解決策
        • マスキングで対応(問題部分はディスプレースメントしない)
まとめ
  • DirectX11で標準化
  • 現状のHDゲームでの効果は微妙
    • 十分にハイポリゴン
  • 次世代機に期待

コンピュートシェーダの活用

  • 全体的な波
    • ディスプレースメントマップを多重合成
  • 細かな波(波紋)
    • Wave Particles
      • 波を直進する粒子として表現
      • 粒子は独立
      • ある程度進んだら粒子を分割
      • 壁で反射
      • 時間とともに強度が減衰して消滅
  • Lost Planet 2への適用
    • 簡易版
      • 粒子を分割しない
      • 放射状のみ
  • CS実装
    • 粒子数は増減
    • Append Structured Buffer (ASB)
      • UAV
      • 要素に構造体が使える
        • 発生点 / 進行方向 / 経過時間 / ...
      • Appendできる
  • 起動: ID3D11DeviceContext::Dispatch
  • 更新: ID3D11DeviceContext::DispatchIndirect 粒子数は増減する(CPUは粒子数を読み戻さない)
  • 頂点バッファ更新
    • Byte Address Buffer (BAB)
    • DrawInstancedIndirectを使ってポイントレンダリング
    • フィルタをかけてハイトマップを作成
    • ハイトマップからディスプレイスメントマップを作成
      • 法線(RGB)+ハイト(A)

ソフトボディ

  • 巨大ボスの表皮に「よりリアル」な動きをもたせる
  • 質点バネモデル(Mass-Spring Model)
    • 表皮(Surface Spring)
    • 骨と表皮(Inner Spring)
    • 質点とスキニング頂点をつなぐ(Goal Spring)
    • Verlet(ベルレ)物理
      • 質点の運動
        • Verlet積分。位置を直に動かしても安定な方法。位置と速度のずれが起きない。速度は位置の差で計算するから。

delta = x2 - x1;
deltaLength = sqrt(delta * delta);
diff = (deltaLength - restLength) / deltaLength;
x1 -= delta * 0.5f * diff;
x2 += delta * 0.5f * diff;

  • バッチにわけて、バッチ単位で並列処理。
ソルバ: Jacobi法
  • バネ単位で独立して頂点位置を移動
  • 個々の頂点位置の計算結果を平均位置に修正

※収束はGauss-Seidel(ガウス・サイデル)法より遅い

  • パイプライン
    • スキニング→Verlet積分→Jacobiソルバ→頂点バッファ更新→
  • Jacobiソルバ
    • 点が何度も参照される→シェアードメモリを使う
  • 四面体の重み付けで描画頂点
まとめ
  • コンピュートシェーダは使える
    • 実装しやすさ
      • (VSやPSでのGPGPUよりも)記述が容易
      • 描画パイプラインと独立
    • 描画パイプラインとの連動
    • デバッグ環境の問題
      • GPUベンダごとに異なる
      • PIX?(CS未対応)