Skip to content
Go back

拙訳「The Lighting Technology of 'Detroit: Become Human'」

· Updated:

[Caurant 2018Caurant, G. 2018. The Lighting Technology of 'Detroit: Become Human'. Game Developers Conference. https://gdcvault.com/play/1025339/The-Lighting-Technology-of-Detroit.]

url

The lighting technology of Detroit: Become Human#

お品書き#

  • Quantic DreamでのPBRへの道のり
    • Heavy RainからDetroit: Become Humanへ
    • 測光photometricの単位
    • マテリアルの較正
  • 直接ライティング
    • 解析的なライト
    • シャドウ
    • ボリューメトリックライティング
  • 間接ライティング

Quantic DreamでのPBR#

  • Heavy Rain (PS3)
    • フォワードシェーディング
    • ガンマ空間
    • Blinn-PhongスペキュラBRDF

Quantic DreamでのPBR#

  • Beyond: Two Souls (PS3)
    • ディファードシェーディング
    • ガンマ空間のマテリアル
    • 線形空間のライティング
    • マイクロファセットBRDF近似
      • Litシェーダ: 一定の可視性項付き正規化済みBlinn-Phong
      • Skinシェーダ: 独自の可視性項付きBeckmann分布

Quantic DreamでのPBR#

  • Detroit: Become Human (PS4)
    • Clustered Forward Shading
    • 完全な線形空間
    • マイクロファセットスペキュラBRDF (GGX)
    • まだランバートディフューズ(k/πk/\pi)を使っている
    • 部分的なエネルギー保存
    • ライトとemissiveマテリアルに対する測光単位

Quantic DreamでのPBR#

  • マテリアル計算
    • Shading Tree
    • lit、unlit、ランバート、ガラス、肌、髪、目、歯、車の塗装、cloth
    • 強力だが一貫性coherencyを制御し辛い
    • いくつかのマテリアルは複数のスペキュラローブを持ち得る。

Quantic DreamでのPBR#

  • BRDF積層layer stack
    • BRDFを複数の層に分割して積み上げる
    • 最大2つのスペキュラローブ+1つのディフューズ+1つの表面下または後方散乱subsurface/backscatter
    • Litシェーダは1つのスペキュラGGX層を用いる
      • 雨用の金属質表面での追加optionalの層

[Langlands 2014Langlands, A. 2014. Physically Based Shader Design in Arnold. Physically Based Shading in Theory and Practice course. ACM SIGGRAPH. https://blog.selfshadow.com/publications/s2014-shading-course/.]

Quantic DreamでのPBR#

  • BRDF層間のエネルギー保存
    • 各”層”は反射するエネルギーと透過するエネルギーを計算する
    • 残りのエネルギーは次の層を計算するのに再利用される
    • BRDF全体でのエネルギーの伝達transferを事前計算する必要がある
      • 多重散乱multi-scattering、Fresnel界面
    • 残念ながら、我々はF0を計算に入れるだけである

Quantic DreamでのPBR#

  • プロダクションサイクル中に直面する問題:
    • シーン間の不十分poorなライティングの一貫性
    • マテリアルの一貫性もまた問題である
    • 異なるシーンで小道具propsを再利用し辛い
    • => 我々は測光単位に移行することを決断した

測光単位#

  • ライティングの一貫性は我々の主な目標であった
    • 現実real lifeのリファレンスと比較するのがより簡単
    • アーティストは現実の入力値を用いることができる
    • 彼らがアルベドにライティング情報を焼き込めないようにする
    • より良いシーンのコントラストやレンジを可能にする
    • [Lagarde and de Rousiers 2014Lagarde, S. and de Rousiers, C. 2014. Moving Frostbite to Physically based rendering. Physically Based Shading in Theory and Practice course. ACM SIGGRAPH. https://seblagarde.wordpress.com/2015/07/14/siggraph-2014-moving-frostbite-to-physically-based-rendering/.] “Moving Frostbite to Physically based rendering”

測光単位#

  • 光量luminous power (lm)
    • 放射される光の総量
  • 光度luminous intensity (cd)
    • ある方向への立体角あたりのルーメン
  • 照度illuminance (lux)
    • 表面に降り注ぐ光の量
  • 輝度luminance (cd/m2cd/m^2)
    • ある方向における単位面積あたりのカンデラ

測光単位#

  • 直接光はルクスで
  • 他のライトはルーメンで
  • 必須mandatory二次減衰quadratic attenuation
  • 照度は大きさを持たない光源punctual lightの近くで*非常に*高い

測光単位#

  • エミッシブ表面
    • すべてのマテリアルにあるEmissive Intensityというパラメータ(と色)
    • EV値Exposure Valueで表現される
      • cd/m2cd/m^2は線形な尺度だが、人間の目ではそのように知覚されない
      • EV値は知覚的に線形である
      • EV値を+1すると、知覚される光度は倍になる

測光単位 --- 露出#

  • シーンの露出
    • レベルエディタでシーンを正確に露出する必要がある
      • 自動露出は推奨されない
      • 典型的なライティング条件に対する計測された露出を使う
    • 我々のレベルは”Scene Zone”(SZ)に分割される
    • 撮影photographyのディレクターは”SZ”ごとに露出を規定provideする
    • 値を固定し、使い回さないno transitions
    • カメラが”SZ”に侵入するときに露出を適用する

測光単位 --- 露出#

  • シーンの露出
    • 露出はEV100で表される
      • カメラのシャッタースピードとF値の組み合わせを表現する
      • EV100はISO100のセンサ感度に対するEV値である
    • 一貫性のあるライティングレンジを保証するためのフレームワークをもたらす
    • シーンの露出は露出前の累積バッファにとってとても良いものである
    • インゲーム露出にはさらなる制御が必要である

測光単位 --- 露出#

  • カメラの露出
    • シーン露出の上の露出補正exposure compensation
    • 露出を動的に変化させるための制御をもたらす
    • アーティストは4つの露出タイプから選択できる
    • 自動露出 = ゲームプレイのフェーズ(主に)
    • 手動露出 = カットシーン(主に)

測光単位 --- 露出#

  • カメラ露出の種類:
    • 手動
      • EV100におけるEV値、アニメーションカーブanimated curvesで制御できる
    • カメラ
      • 物理的なカメラ設定(F値、ISO、シャッター時間)から計算される
    • 自動・平均
      • シーンの対数平均輝度Log average luminanceから計算される
    • 自動・EVZone
      • “Scene Zone”で規定されるEV値+シーンに手動で設置されるEV”デカール”から計算される

測光単位(デバッグ)#

  • 仮想的な露出計spot meter
    • ピクセルにcd/m2cd/m^2とEV100で絶対輝度をもたらす
    • RGBおよびsRGBの値
    • 以下のときに本当に有用である
      • エミッシブ表面を調整するとき
      • スペキュラ反射における高い値をデバッグするとき

測光単位(デバッグ)#

  • False Colorのデバッグメニュー
    • シーンが上手く露出されるかを確認するのに有用
  • 緑   → ミドルグレー (18%)
  • ピンク → 肌の色合いskin tone
  • 紫   → 黒潰れcrushed blacks
  • 赤   → 白飛びburnt whites

マテリアル較正#

  • ライティングに対する良いフレームワークがある
    • 現実のリファレンス
    • 一貫した値
  • マテリアルは同じ処置を必要とする
  • すべてのマテリアルをスキャンするのは不可能

マテリアル較正#

  • いくつかのオブジェクトとマテリアルのサンプルをキャプチャする
  • 制御された環境がある部屋を設定する
  • 3つの白熱電球がある黒い部屋を作った
  • 我々のエンジン内で再現し易い
  • キャプチャされたマテリアルはライティング環境を評価するのに役立つ

マテリアル較正#

  • この際に、我々は”Icing Tool”を作った
    • いくつかの較正されたライティング環境を提供する
      • あの黒い部屋を含む
      • また他には、様々なライティング環境でキャプチャされたフルレンジIBLを含む[Lagarde 2016Lagarde, S. 2016. An Artist-Friendly Workflow for Panoramic HDRI. Physically Based Shading in Theory and Practice course. ACM SIGGRAPH. https://blog.selfshadow.com/publications/s2016-shading-course/.]
    • マテリアル特性の可視化
    • オブジェクトやマテリアルのリファレンスとの比較
  • すべての小道具はこのツールで評価できる

#

マテリアル較正(デバッグ)#

  • 逸脱したマテリアル特性を持つ値を強調する
    • 赤: 誤った基本色base color
      • 誘電体的なマテリアルはsRGBで30から240の範囲内になければならない
      • 金属的なマテリアルはsRGBで186から255の範囲内になければならない
    • 青: 誤ったガラスシェーダ反射
      • Fresnel反射率はsRGBで52から114の範囲内になければならない
    • 黄: 誤った金属感Metallicパラメータ
      • 金属感の値は0または1の近くにあるべきであり、中間的な値はしばしばエラーとなる

較正#

  • マテリアル特性エラー

お品書き#

  • Quantic DreamでのPBRへの道のり
    • Heavy RainからDetroit: Become Humanへ
    • 測光photometricの単位
    • マテリアルの較正
  • 直接ライティング
    • 解析的なライト
    • シャドウ
    • ボリューメトリックライティング
  • 間接ライティング

直接ライティング#

  • すべての光源は大きさを持たない
    • ディレクショナル
    • ポイントライト
    • スポットライト
    • プロジェクターライト
      • 減衰を伴うボックス内に制約された”ディレクショナル”ライト

直接ライティング#

  • 減衰は既定で二次関数である
  • 大きさを持たない光源はスペキュラ反射において本当に高い強度ピークを生み出し得る

直接ライティング#

  • エリアライトが助けてくれる(かも)
    • この問題を修正するためにエリアライトを実装する
    • フォワードエンジンはすべてのライトをエリアライトにする必要があることを意味する
    • プロダクションサイクルでは遅すぎたし、そのコストが無視できなかった
  • 最終的には、この問題を抑制するためにマテリアルのラフネスを若干バイアスした

直接ライティング#

  • 独自のニアクリップ面
    • 安価であり、独自のライトジオメトリを使わないライトの位置取りの補助に有用
    • ライトはそれに影響を与えずに壁の裏側にあったりオブジェクトの中にあったりすることができる
  • ライトの可視性フラグ
    • すべての”SZ”、ローカル”SZ”、可視の”SZ”
    • ローカルなScene Zoneを照らすだけのてきに有用

近接close-upライティング#

  • 多くの近接カメラショットがあるストーリー駆動のゲーム
  • 映画のセットにあるようなカメラショットごとを照らしたい
  • シーンライティングはショット毎に編集した
    • ライトのセットアップとオブジェクトの選出はムービーエディタで行った
    • カメラ、近接ライティング、露出の追跡を持ち得る

近接ライティング#

  • 一連のライトは通常のライティングを置き換えるために使った
  • 追加の近接ライトとしてシーン中のライトをフラグ立てできる
  • 近接シャドウを使う(後に説明される)
  • 間接的な寄与に影響を与え得る(GI & IBL color multiplier)
  • 近接の選択範囲の境界ボリュームにフィットしたそれ自身のライトクラスタを持つ
    • 11x11x4

オン#

オフ#

シャドウ#

  • シャドウマップ

シャドウ#

  • シャドウアトラス
    • シャドウは16ビット精度を持つ8192^2のアトラスに格納される
      • 256x256のブロックに分けられる
    • アーティストは3つの異なるサイズの中から解像度を選択できる
      • 256、512、1024
    • シャドウはカメラ距離に依存してリサイズされる
      • 解像度は最大で半分になり得る
      • pixel crawlingを抑制するために4段階で解像度を減らしてゆく
      • そして、256ピクセルの倍数に達するときにアトラス内で再パッキングされる

シャドウ#

  • シャドウアトラス
    • 何かがライト錐台内で動く場合に限り更新される
    • ポイントライトのシャドウ面は個々に除外させることができる
    • 調節可能なシャドウのニアクリップ面
      • 数値計算的な精度とライトの位置取りを助ける
      • (回転なしに)ライトのニアクリップ面から相関を失わせるdecorrelatedことができる

シャドウ#

  • Directional Cascaded Shadow map
    • テンポラルスーパーサンプリング付きPCF(8サンプル)
    • ジッタリングとTAAを用いる分割間のなめらかな遷移
    • 各1440ピクセルかつ16ビット精度の最大4分割
      • シーンの大部分は2か3つの分割を用いる
    • 自動分割分布

静的シャドウ#

  • カメラ距離に依存して静的シャドウに切り替える
  • バイリニア比較で1サンプルのみ
  • 静的シャドウアトラス
    • アトラスサイズ: 2048^2
    • シャドウあたり64x64
    • 最大1024つのシャドウ
  • ディレクショナル静的シャドウ
    • そのレベルのすべての静的なジオメトリを含む1つの大きなテクスチャ
    • サイズ: 8192^2

近接シャドウ#

  • 接触部分やセルフシャドウでは精度を追加する
  • 各1536^2ピクセルの最大2つの追加シャドウ
  • アーティストはシーン中で関連するオブジェクトを選択する
    • 例: キャラクター
  • これらのオブジェクトのみが近接シャドウを受ける

近接シャドウ#

  • オブジェクト選出:
    • 半径10m以内にあるすべての可視のフラグ立てしたオブジェクト
    • skinned点群から計算されるskinnedオブジェクトの境界ボリューム
  • 近接レシーバーの選択範囲の境界ボリュームにフィットさせたニア/ファー面

近接シャドウ#

  • オブジェクト選出:
    • 半径10m以内にあるすべての可視のフラグ立てしたオブジェクト
    • skinned点群から計算されるskinnedオブジェクトの境界ボリューム
  • 近接レシーバーの選択範囲の境界ボリュームにフィットさせたニア/ファー面
  • 錐台の外側のオブジェクトはニアシャドウ面に投影される

近接シャドウ#

  • オブジェクト選出:
    • 半径10m以内にあるすべての可視のフラグ立てしたオブジェクト
    • skinned点群から計算されるskinnedオブジェクトの境界ボリューム
  • 近接レシーバーの選択範囲の境界ボリュームにフィットさせたニア/ファー面
  • 錐台の外側のオブジェクトはニアシャドウ面に投影される

オン#

オフ#

シャドウ予算#

  • シャドウアトラス
    • 8192^2、16ビット
    • 10つから1024つの可視シャドウ
    • ポイントライトは巨大になり得る(6x1024)
  • 静的シャドウアトラス
    • 2048^2、16ビット
    • レベルあたり1024つの静的シャドウ
  • ディレクショナルシャドウ
    • 3つの1440^2、16ビット
  • ディレクショナル静的シャドウ
    • 8192^2、16ビット
  • 静的
    • 8MB + 128MB
  • 動的
    • 128MB + 12MB
  • 合計
    • 276MB

#

シャドウパフォーマンス#

  • フレームあたり平均で15つから20つのシャドウが更新される
    • 更新の量的な制限はない、いくつかのケースでは荒れる可能性がある
  • 先程の映像では1.5msから3.5ms
  • 近接シャドウのコスト
    • シーン依存
      • ニア面に再投影されるオブジェクトが少ないと高速(1ms以下)
      • ライトが木の中にあると低速(強大なアルファテストカバレッジ)

ボリューメトリックライティング#

  • Unified volumetric lighting [Wronski 2014Wronski, B. 2014. Volumetric Fog: Unified compute shader based solution to atmospheric scattering. Advances in Real-Time Rendering in Games course. ACM SIGGRAPH. https://advances.realtimerendering.com/s2014/.; Hillaire 2015Hillaire, S. 2015. Physically-based and Unified Volumetric Rendering in Frostbite. Advances in Real-Time Rendering in Games course. ACM SIGGRAPH. https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite.]
    • ライトクラスタ深度にフィットさせる
    • チェッカーボードレンダリングを用いる
      • PS4: 192x108x64
      • PS4 Pro: 240x135x64
    • 青色ノイズのジッタリングでのTAA
    • 直接光とdiffuse probe gridで照らされる
    • GI焼き込みでのフォグの寄与
      • 偽の多重散乱

ボリューメトリックライティング#

  • ボリューメトリックライトは表面を通して漏れる可能性がある

ボリューメトリックライティング#

  • リークを直す
    • タイル毎に最大/最小深度を格納する
    • ライト計算時にボクセルの薄さをクランプするために最大深度を使う
    • ボリューメトリックテクスチャサンプリングでZバイアスを適用する
      • (TileDepthVariance > threshold)

オフ#

オン(コーダの設定)#

17つのライトで約1.8ms

#

お品書き#

  • Quantic DreamでのPBRへの道のり
    • Heavy RainからDetroit: Become Humanへ
    • 測光photometricの単位
    • マテリアルの較正
  • 直接ライティング
    • 解析的なライト
    • シャドウ
    • ボリューメトリックライティング
  • 間接ライティング

間接ライティング#

  • Beyond: Two Souls (PS3)
    • HL2のアンビエントキューブを用いる
    • 静的ジオメトリには頂点焼き込み
    • 動的ジオメトリにはライトプロブ
    • 偽の間接スペキュラライティング
  • 静的および動的用に統一された解法が必要

プロブベースのライティング#

プロブグリッド#

プロブグリッド#

  • 遮蔽に基づくプロブの却下はしばしば補間のアーティファクトを引き起こす
  • 最終的にはプロブを破棄することが一切なくなった

Irradiance Sparse Octree#

  • 放射照度ボリューム [TAT07]1
  • 適応的Sparse Octree
  • アーティストの手がかりによって自動的に構築される
    • Density Zones
    • オブジェクト/壁の周りでより細かい解像度での自動的なシーンのボクセル化

Irradiance Sparse Octree#

  • 1つの八分木セルは8つのプロブを持つ、cornerあたり1つ
  • 空間の点は8つのプロブで常に囲われる
  • いずれのプロブも破棄しない
  • 代わりにプロブを仮想的にオフセットする

Probes attractor#

  • アーティストはすべてのプロブを引きつける閉じたメッシュをセットアップする
    • 通常は可視性ですでに使われるVolume Zoneに近い

Probes repulsor#

  • ボリューム内部のプロブを拒絶repulseする閉じたメッシュ

プロブのオフセット#

  • 場合の大部分を解く
  • キャプチャ/ベイキング中の仮想のオフセット
  • 元のグリッド位置に基づく計算
  • いくつかのケースはより難しい

プロブのオフセット#

  • 壁や遮蔽物でリークしているならば、分割してオフセットする
  • または、誤差を最小化しようとする
    • 明るいリークは暗いリークより気付きやすい

プロブの調整#

  • (最終手段last resortの)手動調整のためのプロブカラーモディファイヤ

八分木レベルの不連続性#

🔴計算されたプロブ

🔵補間されたプロブ

ボリュームテクスチャアトラス#

ボリュームテクスチャアトラス#

全リーフを格納:2x2x2

大量の冗長性

ボリュームテクスチャアトラス#

リーフの親を格納:3x3x3

この方が良い

球面調和関数#

  • 2次のSH
  • 3つのRGBA16Fのボリュームテクスチャ(R,G,B)
    • 24,055つのプロブ → (105x105x3)x3つのテクスチャ ≒ 3MB

GIの表示#

  • プロブの破棄はボリューメトリックテクスチャのサンプリングを不可能にする
  • ハードウェア(3D)バイリニアフィルタリングを単純に使う

GIの表示#

  • 八分木セルのハッシュキーは3D位置から求める
    • Morton Key
    • O(1)
    • 32ビットに限られる
  • テクスチャ座標バッファに事前計算されたハッシュを使う
    • X座標は最初の15ビットでコード化される
    • Y座標は次の15ビットでコード化される
    • Z座標は最後の2ビットでコード化される

GIのおまけ#

  • コンピュータシェーダで複数のGIセットをブレンドするのは自明
    • GIの切替(屋内ライトの切り替え、雷、…)
    • GIの遷移(時刻変化、カーテンの開閉、…)

#

GIの遷移#

  • Scene Zonesの間の辛いGI遷移を回避する
    • 屋内 ↔ 屋外
    • ポータル周りの距離を設定する
    • 通過する動的オブジェクトは両方のGIをサンプルする
    • ポータルへの距離と法線方向に基づく

オフ#

オン#

GIの遷移#

  • ほとんどの静的オブジェクトはユニークなScene Zoneの中にある
    • 屋内の壁 VS 屋外の壁
  • ドア、窓、窓枠はどうなる?
    • 1つのScene Zoneに割り当てられるが、ほかから可視にもなる
    • 1つのScene Zoneに割り当てない

GIの遷移#

  • 両方のGIをサンプルするためにオブジェクトを手動でタグ付けする

おわりに#

おわりに#

  • PBRへの道に終わりはない
    • ライトやマテリアルに対するより良いエネルギー保存が必要
    • マテリアルは十分なほど物理的に正確ではない
    • 物理ベースにすることは良いが、アーティストの視点やニーズを忘れないこと
    • 測光単位は一貫性のあるアセット制作を保証する良いフレームワークを提供する
    • マテリアルを評価するためにリファレンス環境を常に用いる

おわりに --- 次は#

  • エリアライトとソフトシャドウをそこかしこに(はあと)
  • BRDF積層を改善する
  • エネルギー保存のより良い扱い
  • GIに動的要素を追加する
  • ボリューメトリックライティングの改善

謝辞#

ご質問は?#

Footnotes#

  1. 訳注:詳細不明。“Irradiance Volumes”というタイトルのみ示されている。