Crysis3 のライティング技術やテクスチャ作成の説明

概要

  • この記事では Crysis3 でのライティングやテクスチャ作成について気になった箇所をピックアップして説明します.

参考資料

Crysis3 の AO 用の減算ライトやバウンスライト

  • Crytek は基本的にはテクスチャ焼付けを行わない方針です.
  • しかし, 現世代のゲーム機ではテクスチャ焼付けを利用しない場合, グラフィックスの見た目のクオリティを向上させるのが難しいです.
  • そこで Crytek ではアーティストが手置きで AO 用の減算ライトやバウンスライトを配置するという, 古典的な方法を利用しています.
  • 但し, ライトの調整結果がリアルタイムにプレビューできるのでオフラインのレンダラーよりは調整しやすいです.
  • このように焼付けを使わずにアーティストによるライトの手置きの配置によってグラフィックスクオリティを上げるアプローチは Tomb Raider 2013 でも行われていました.

AO 用の 減算ライト

  • AO っぽい表現をするための減算用のライトについてです.
  • 長所はアーティスト側が作業コストを支払えば, 減算用のライトのパラメータを調整することで柔軟な修正ができることです.
  • 短所は基本的に手置きなので Crysis3 のように地形が広範囲の場合, アーティスト側の手作業のコストがかなり発生することです.

  • 下図が太陽光のディレクショナルライトと SSDO 適用後の結果です.

  • 上の結果に AO 用の減算ライトを適用すると以下のようになります.

  • 下図はそれにランタイムの 1バウンスの ディフューズ GI( 恐らく Light Propagation Volume)を追加した結果です.

  • 最後にアーティストが設置した照り返し用のバウンスライトを適用すると, 以下のようになります.


  • 少し話がそれますが, Crysis2 ではポイントライトのシャドウの計算時に処理が重い地形が含めることはできないので, ライティングが壁を貫通してしまうという問題が起きていました.
  • そこで, アーティストが手置きで配置した遮蔽用のボックスや凸包体をポイントライトのシャドウ計算に含めることで, 軽めの処理負荷でライティングが貫通しないようにしていました.
  • 下はポイントライトのライティングが壁を貫通した状態です.


  • 下図は手置きの遮蔽用のボックスでこれを防いだ状態です.


ランタイムのディフューズ GI (Light Propagation Volume)

  • CryEngine 3 にはランタイムのディフューズ GI を計算する手法として, Light Propagation Volumeがあります.
  • この手法の長所はランタイムでディフューズ GI の計算ができることです.
  • 短所は基本的にはディレクショナルライトの 1 バウンスのディフューズ反射しか扱えないことや, 焼付けに比べると品質が低いことです.

  • 下は GI がない状態のものです.

  • 上の結果にランタイムのディフューズ GI (Light Propagation Volume)を適用したものが下図です.

  • 最後に補助用にアーティストがバウンスライトを追加したのが下図です.


Height ベースの AO

  • Crysis3 では Height-Based ambient という手法を使って, AO を実現していました.
  • この手法は恐らくシーンを真上からデプスバッファをレンダリングして, ハイトマップを作ってその結果を AO として適用しているのだと思います.
  • 恐らく, Assasin's Creed 3 の World AO と同じような手法だと思います.
  • 下図は Height-based Ambient を適用する前のものです.

  • そして, 下図は Height-based Ambient という手法を適用した結果です. 他のビルに遮蔽されているビルの下部の部分が暗くなっています.

  • さらに AO 用の減算ライトを適用すると下図のようになります.

  • そして, 表面が濡れているように見せるためのスペキュラ用のライト(Wet Light)を追加したのが下図です. この Wet Light という概念も Tomb Raider 2013 (GDC 2013)で使われていました.

  • それに 木漏れ日のような まだら模様のライト(Dappled Lighting)を追加したのが下図です.

  • バウンス用のライトを追加すると下図のようになります.



素材用のテクスチャ

  • Crysis3 で使われているテクスチャの例が下図の左から順に ディフューズテクスチャ, スペキュラリフレクタンステクスチャ, ラフネステクスチャです.
  • 全体的に色が薄いと思うかもしれませんが, こうなっている理由について簡単に説明します.

ディフューズテクスチャ
  • CryEngine ではランタイムでライティングやシャドウ, AO, ポストプロセスが適用されるので, それを除いた状態のディフューズテクスチャを素材として作る必要があります.
  • 下図の上側の行がディフューズテクスチャに既に陰影を強めに書き込んでいるために, ランタイムのエンジンでのシャドウや AO がさらにかかって陰影が黒くなりすぎた悪い例です.
  • 下図の下側の行はディフューズテクスチャにシャドウや AO を書き込まないので, ランタイムのエンジンでのシャドウや AO が適用されてちょうど良い見た目になっています.


  • どういうディフューズテクスチャを用意するか ? は実際のランタイム側のグラフィックスの処理に依存します.
  • GPU の処理負荷の都合上, ランタイムで行えないような処理は見た目のクオリティを上げるためにテクスチャに書き込む必要があると思います.
  • また写真で撮影したディフューズ用のテクスチャは Color Checker Passport とその付属ソフトウェアでホワイトバランスやカラーバランスを自動で調整して利用しています.

  • 最後の参照用に代表的なディフューズテクスチャの素材を用意しておいて, 作っているディフューズテクスチャが見た目的におかしくないか ? の確認をしていました.

スペキュラリフレクタンスのテクスチャの作成
  • まず, スペキュラリフレクタンスのテクスチャを作る際に, ディフューズアルベドテクスチャをグレースケールでコントラストが強いものは良くないです.


  • 理由は同一の物資がこのような極端なスペキュラリフレクタンスの値の違いを持つことはないからです.
  • 下図を見ると非金属は 0.25 以下, 金属は 0.8 ぐらいで高めです.
  • 従って, 1 マテリアルのスペキュラリフレクタンスのテクスチャは非金属あるいは金属のどちらかに近い値しか持たないはず, ということになります.


  • グラフィックスのランタイムで, スペキュラライティングの計算に物理ベースなものを使っている場合は正しい値が既知であるので, できるだけきっちりと値を合わせておいた方がいいと思います.
  • 下図のように非金属の場合はスペキュラリフレクタンスは リニア RGB で 0.17 以下になります.

  • 一方で, 金属の場合は 0.9-1.0 とかなり値が高いものが一般的です.

  • 値を sRGB で与えるとしたら, 下図のように非金属は 20-70, 金属は 180 以上になります.

  • 上記の流れに従って, 修正したスペキュラテクスチャは以下のようになります.

ラフネステクスチャ
  • ラフネステクスチャについては結構, ざっくりとした情報しかなかったです.

  • ラフネステクスチャをどういう値にしたら良いか ? については結局のところ, スペキュラライティングのシェーディングモデルに依存します.
  • 一応, 参考程度に Remember Me を開発した DONTNOD のスペキュラとグロシネスチャートの画像を添付しておきます.
  • 上から順に非金属のスペキュラリフレクタンスの sRGB, 金属のスペキュラリフレクタンスの sRGB, ラフネスの sRGB

になります.