Japanese memo of CEDEC2014 9/2

About

  • CEDEC2014 の講演の受講時の簡易メモです.
  • 僕の理解が足りずにメモの内容が間違っている可能性があります.
  • より正確な情報は CEDEC Digital Library (http://cedil.cesa.or.jp/)で公開される資料が正しいので, そちらを参考にして下さい.

「deep down」のグラフィックス表現の技術

  • シェーディング
    • 通常のシェーディング : OrenNayer + GGX
    • 皮膚のシェーディング : Pre-Integrated Skin Shading + GGX
  • マテリアルのパラメータ
    • アルベド
    • Reflectance(非金属はグレー, 金属は色あり)
    • Glossiness
    • Normal
    • Emissive(オプション)
  • テクスチャ
    • HDR 画像 : BC6H
    • 色と法線 : BC7
    • メモリ不足のところ : BC1
    • ラフネス : BC4
  • シェーダは2 種類
    • 物理ベースのマテリアル
    • アーティスト主体のノードベースのシェーダ
  • G-Buffer
    • RT0(FP16) : PreLighting(RGB), Occlusion(A)
    • RT1(R10G10B10A2) : NormalXY(RG), Options(B)[Decal/BRDF type], LightChannel(A)
    • RT2(R8G8B8A8) : AlbedoY, ReflectanceY, Roughness, Reflectivity
    • RT3(R8G8B8A8) : AlbedoC, ReflectanceC, VelocityXY
    • (YCbCr は高輝度で紫色が発生. 普通にRGBを入れる方が良い, Metallic を使うとか)
  • 照明
    • 直接照明: タイルベースドディファード+フォワード
      • ライトリストを作成, 直接照明処理の2段階
      • フォワード(皮膚や半透明用, ライトリストの結果を使う)
    • 間接照明: 放射照度ボリューム+視差補正環境マップ
      • 放射照度ボリューム, スクリーンスペースリフレクション, 視差補正環境マップ
    • 放射照度ボリューム
      • ゲームのロード中にボクセルコーントレーシングで作る
      • シーンのボクセル情報を(照明済みカラー情報とオクルージョン)リストに出力
      • リストをボクセル(256^3)に出力, ボクセルのミップマップを作成
      • シーン全体を覆う128^3. 全球面を 12 方向に分割してコーントレーシング.
      • コーントレースの結果は FarCry3 の 4 基底の色として加算.
      • 最終的には 128^3 の 3Dテクスチャ3個に格納.
    • スクリーンスペースリフレクション
      • 線形探索+2分法
    • 視差補正環境マップ
      • 拡散反射と鏡面反射の両方の利用(金属の質感に必須)
      • シーンで最大 96 個. 128x128. 表面の粗さでミップマップが変化.
      • RGBA8 で RGBE 形式(シーンのロード時に作るために非圧縮テクスチャ)
      • ロード時に四面体で環境マップを撮影,フィルタリングする(Compute Shader を利用)
      • スタックレスツリーの AABB のみの BVH で使用する環境マップをピクセルシェーダで探索する
    • ポイントライト,スポットライト,カスケードに対応
    • シャドウマップは 1枚のアトラステクスチャとして使う.
    • 移動や回転がない光源は,深度を専用の一時バッファにキャッシュする.
    • キャラクターや物体のみを書き出す. メモリは消費するが,処理時間は減る.
  • SSAO
    • ScreenAmbientObscurance を利用
    • for でのループ処理を 4 個単位で行うことで高速化.

シリコンスタジオの最新テクノロジーデモのレンダリング技術


  • Deferred Renderer
    • 40 枚弱のレンダーターゲット
  • 半透明なし
  • 平行光のみ(Spot Light, Point Light は未対応)
  • シェーディングモデル
  • マテリアルのパラメータ
    • Unreal Engine 4 と同じパラメータセットを利用
    • BaseColor/Normal/Shininess/Metallic/Cavity
    • Roughness ではなく, Shininess(1.0 - Roughness)を使用
  • マテリアルのレイヤーシステム
    • Albedo,Normal,Shininess,Metallic,Cavity の 5 つのパラメータ(&テクスチャ)の集まりを 1 レイヤーとする.
    • 複数のレイヤーを重ねてマスクテクスチャで合成
    • 全テクスチャで独立して UV 変換が設定可能
    • 先行事例: The Order 1886 "スタック的なマテリアルシステム"
    • 先行事例2: Unreal Engine 4 の"リアルタイムなブレンディング"
    • 今回: スタックベースのレイヤリング + リアルタイム合成(実装コストも現実的だった)
    • レイヤーの合成は毎フレームのレンダリング時に行う. G-Buffer に合成結果を書き出す.
      • オフラインで合成すると, 解像度感が失われて今回のデモの接写に耐える目的に合わないため.
  • リニアワークフロー
    • リニア
    • ほぼすべてのテクスチャを素材集などから利用
    • ( Raw 用のプラグインも用意したが, raw が重い/現像が遅いと理由で小規模チームでは厳しかったので使わなかった)
  • G-Buffer
    • RGBA16 (PackedNormal.xy:RG(Octahedron normal vector encoding), Depth, Shininess)
    • RGBA8 (BaseColor.rgb, Metallic)
    • RGBA8 (BaseColor.a, Clothness(研究中), VertexAO, Cavity)
    • RG16 (Velocity.xy)
    • R11G11B10 (LightMap.rgb/Emissive.rgb)
  • 間接光
    • 背景用のライトマップ
      • 3ds Max + V-Ray
      • マテリアル設定は Albedo のみ
      • 方向非依存
      • 50MB(BC6H)
    • Image-Based Lighting
      • キューブマップ, 事前計算はコストが高め.
      • 背景以外: Diffuse も Specular も IBL
      • 背景オブジェクト: Diffuse はライトマップ, Specular は IBL
      • Parallax Correction はなし(完全な鏡面以外でのエラーが許容できなかった.)
    • ローカル環境キューブマップ
      • デザイナーさんが影響範囲をボックスや球で指定
      • 全体で 90 個ほど配置.
      • 各面 256x256 ピクセル, 〜50MB(BC6H)
      • キューブマップの影響範囲を順に描画, オーバーラップする領域はキューブマップをブレンド.
      • RGB = w0 * cubemap0_rgb + w1 * cubemap1_rgb, A = w0 + w1 として最後にアルファで除算して正規化する.
    • 背景用にはライトマップを V-Ray で焼付け
      • IBL用の CubeMap の撮影のために必要
      • 実行時に背景オブジェクトでは Diffuse として利用
    • ローカルリフレクション
      • IBL で捉えられない細かいスペキュラを扱う, 接地感
      • カラーバッファ(IBL Specular なし)とデプスバッファを使ったレイマーチ
      • BRDF Importance Sampling(Hi-Z cone tracing + Mip-mapped Color Buffer + Temporal Super Sampling )
      • ただし, Hi-Z cone tracing はまだかなりアドホック
      • Half 解像度で 3-4msec(GeForce GTX660)
      • 1 フレームごとのレイの数は1-4本(シャイニネスに依存), 1 レイあたり最大16tap, ブラー処理はなし
  • Sun/Sky
    • デザイナの選んだ HDRI + 手動の古典的な平行光
    • 平行光の強さは空の輝度から手計算
  • Fog
    • Shadow Map のレイマーチング
    • CubeMap を 1 つだけ考慮
  • SSAO
    • Alchemy AO
    • GI っぽい乗算方法( Color *= lerp(BaseColor, 1.0, AOTerm) )
  • PBR + IBL + ハイポリ + 高コントラストなシーン -> エイリアシング地獄
  • 対策
    • Toksvig Normal Mapping : 法線のミップマップで非正規化の法線を使って, shininess を抑え込む
    • Temporal G-Buffer Filtering : 法線を時間方向でブレンド + Toksvig の要領で shininess 低減
    • FXAA
    • Temporal Anti-Aliasing
      • Unreal Engine 4 のもとに拡張
      • サンプリングパターンを工夫した上で, 16 点サンプリング.
  • 絞り・収差シミュレーション
    • エッジ部分を検出して,ボケに対して重要なピクセルをマークする
      • 重要なピクセルだけスキャッターベースで.
      • それ以外はギャザーベースで.
  • カメラパラメータの制御
    • 開放F 値, 画角による開放F値の変化
    • フォーカスグレージング
    • レンズ収差補正タイプ/収差の強さ
    • 絞り羽根枚数
  • 動的にパラメータの自動調整

"次世代のライティング"実用的速度で動作するボクセルコーントレースライティング"


  • スライドが公開されたので, メモを書くのは中止にします.
  • スライドには日本語も載っていたのですが, かなりの直訳なので...読んでいると逆に混乱することがありました(汗)
  • なので, 英語が苦手でない方は英文の方を読んだ方がいいです.