PS4 ”Killzone : Shadow Fall” の物理ベースなエリアライティング
PS4 "Killzone : Shadow Fall" の物理ベースなエリアライティングの説明
概要
- 前回の記事で紹介した PS4 Killzone Shadow Fall の技術資料について - OLD hanecci’s blog : 旧 はねっちブログ については以下のような 3 部構成になっています.
エリアライト
- "Killzone : Shadow Fall" では全ての光源が 大きさ・形・ライトの強さを持つようになっています. つまり, 大きさが無限小であるポイントライトは使っていないです.
- BRDF を使ってきちんとライティングの計算をする際には基本的には光源の強さ(正確には放射輝度)と光源の大きさ(正確には光源の見た目の立体角)のペアを使って計算します.
- 従って 恐らく光源の大きさがないと, ライティングの計算の都合が悪いので導入したのだと思います. (Unreal Engine 3 もだいぶ前にエリアライトに移行していました. http://udn.epicgames.com/Three/Lightmass.html )
- 下は元の情報のスライドです.
- 以下にローカルライトを使ったライティング結果の図を貼っておきましたが, 図の見方について簡単に説明します.
- 中央のデバッグ表示っぽいところにライトが置いてあります.
- 図を見るときは「図の中央の上部にある赤い柱に映っている白い光源の形」や「床面の映っている白い光源の形」を見るとわかりやすいです.
- [a] 球ライト(sphere light)
- [b] 円盤ライト(disk light)
- [c] 長方形ライト (rectangle light)
- [d] 投影テクスチャ付きの長方形ライト (rectangle light)
エリアライトのディフューズライティング( Irradiance )の計算方法
- Killzone では Cook Torrance BRDF を使っていて, エリアライトによるディフューズライティングの計算のために標準的な計算によって Irradiance を求めています.
- 下図によると,点 p (法線 n)に対して微小面積 dA のエリアライトの点p'(法線n')から出る Irradiance を計算する際には
dE[エリアライトの微小面積の Irradiance] = L[エリアライトの放射輝度] * cos(fi)[法線nと対角線の角度] * cos(fo)[法線n'と対角線の角度] * dA(エリアライトの微小面積) / d^2[立体角への変換用]
で求めています.
エリアライトのスペキュラライティング( radiance )の計算方法
- 次にエリアライトによるスペキュラライティングの計算方法についてです.
- 下図のように視点位置からレイを飛ばした際に, シェーディング位置p(法線n)の反射ベクトル(赤い矢印)を求め, ラフネスに応じてエリアライトからサンプリングするコーン[黄色]の角度の開きの大きさを調整していると思います.
- ラフネスが滑らかで完全な鏡面反射のときにはくっきりとしたリフレクションの結果を得るためにこの黄色のコーンが直線になり, スペキュラライティング用にサンプリングするエリアライトの領域が点になります.
- 一方でもしラフネスが粗くなると, 光沢感があるグロッシーなスペキュラの結果を得るためにこの結果のコーンの角度の開きが大きくなって, スペキュラライティング用にサンプリングするエリアライトの領域が2D の面積になります.
- 下図がライトの座標系から, エリアライトの面積(青い長方形)とスペキュラサンプリング用の黄色のコーンを見たものです.
- 実際にエリアライトとサンプリング用のコーンの交差領域から radiance を計算する際には, 交差領域の各点を等価には扱っていないです.
- 具体的には, 下図のように円状に重みづけをしたテーブルを用意しておいて, それをサンプリング用のコーンの中心に配置したうえで交差領域の各点の重み付けをして, radiance を求めています.