Unity Asia Bootcamp Tour Tokyo レポート その3:Lighting worlds in Unity / Unity のライティングを極める

http://unity3d.co.jp/asiabootcamp/

講演内容3つ目です。これがきつかった…。内容難しいわ。スピーチ速いわで。
「ライティング」と銘打っていますので、より専門的な内容になっています。

                                                  • -

#B122:
Lighting worlds in Unity / Unity のライティングを極める
Kuba Cupisz 様(Unity Technologies)


■概要

  • Unityのライティングは柔軟性を重視。様々なゲームの種類に対応。構築できる。
  • ハイエンド、モバイル双方で幅広く実行できるライティング
  • リアルタイムライト、ベイクライト双方を使用可能。

TIPS:スポットライト、ディレクショナルライトなどに、テクスチャの投影が出来るらしい。

  • -

■ポイントシャドウ

  • シャドウマップの場合、ピンホールカメラのような投影。
    • 6回描画するので推奨しない。
  • ポイントライトは、フィル(シャドウなし)として使用して欲しい。
  • -

■スポットシャドウ

ポイントより少し負荷が低い

  • -

■ディレクショナルシャドウ

  • -

■シャドウマップ

  • メモリ制約で大きなテクスチャが使えない。
    • カスケードシャドウマップを使う。カメラ近いと高解像度に。
    • マップ間の移行を見えないようにするのが重要。
    • 多くのエリアに影がかかるものに注意。処理負荷が大きくなる。
  • -

■シャドウプロジェクション

  • クローズフィット
    • 動的なものに使える。
    • 影の境界部分で画像が変わる?←よく分からなかったね。
    • 解像度が高ければいいが・・・
  • ステイブルフィット
    • 静的なものに。
    • ライトの方向、カメラの画角が変わらなければ使える。
  • カメラや画角が動かなければ、ステーブルフィットをおすすめする
  • -

レンダリング

  • -

フォワードレンダリング

  • メリット
    • 柔軟性が高い。
  • デメリット
    • ライトの数に応じて、レンダリングが高負荷になる。
    • 高速化に制約が生まれる。
    • 事実上、シャドウはディレクショナルに限られる。
  • 近いライトはピクセルシェーダで、他のライトはバーテックスで計算するとよい?
    • 最後にSH(球面調和関数)の処理?←SHをどう使うのかくわかんない。
    • フォワードレンダリングでは、途中バーテックス/ピクセル/SHをブレンドさせるために、各セクションに重複箇所がある。
  • -

■デファードライティング

  • シーンジオメトリとライティングを切り離す
    • ジオメトリをレンダリングして格納。
    • 法線、スペキュラ、Z深度はG-Bufferに格納。
  • 2回目のレンダリングで、前のレンダリング情報を利用してライティング
  • メリット
    • 小型のライトに向いている
    • ライトが隠れてる場合も低負荷。
    • G-Bufferの情報を再利用できる。
  • デメリット
    • 2回レンダリングの負荷。ジオメトリに依存。ライトに依存しない。←これはメリットでもあるんじゃない?
    • 帯域が必要。テクスチャがシーンにたくさんあると問題。
    • シャドウキャスティングは高負荷。
    • 制約:ライティングモデルは、全て同じ設定にしなければならない。
  • 透明なオブジェクトは、フォワードレンダリングで処理することになる。
    • Unity側で自動的に処理。
    • ライトの数に応じてレンダリングが発生する。

アルベドってちょいちょい話には出てくるんだけど、仕事では具体的に使ったことないなあ。
たぶんカラーとかテクスチャだけのレンダリングだと思うのだけど。イマイチ詳細な情報が無い。
こんなん

参考→VRay MentalRay Lighting Demoreel 2011 - アルベドマップも確認出来て、ライティングの重要性が伝わるリール!

  • -

■異なるアプローチ…ライトマップ

  • Beastでライトマップ出力←先の講演内容とかぶるね。
  • ライトマップはディフューズの情報しかない。
    • スペキュラ、ノーマルは?→別のDirectionalライトで。
  • -

■デュアルライトマップ

  • 2つのライトマップを使用
  • ニアライトマップ
    • 間接光、スカイライト(GI)を使用
    • Directionalライト使って、スペくキュラ、バンプ、シャドウを表現
  • ファーライトマップ
    • GIのみ
  • メリット
    • ベイク(ライトマップ)、スペキュラ、バンプ、シャドウが使える。高解像度のマップが使える。
    • 遠くは低い解像度ですむ。低負荷。
    • 近い部分のライトは3回書き換えられる。→インテンシティを替えられる←イマイチ意味分かんないね。
  • デメリット
    • メモリ負荷高い。
  • -

■シングルライトマップ

  • シンプル。
  • 静的ライトからのスペキュラがない。
    • バンプなどのライトは別に用意する必要がある。
  • ダブルシャドウ(ベイクシャドウとリアルタイムシャドウのブレンド)の問題が発生する
    • 影をなじませる部分が課題
  • -

■ディレクショナルライトマップ

  • バンプ、スペキュラの情報を格納
  • メリット
    • 法線マップが使える。
    • ライトマップのサンプリングが1回で済む。←どういうことだろうか?
  • デメリット
    • 平面であれば問題ないけど、球とかだと問題がでる?
  • -

■ライトプローブ

  • あくまでも近似の方法
  • プローブ同士の補間は?
    • 4頂点のテトラで補間。Unity上で可視化出来る。
    • 長めの四面体はうまくいかない。大きさ揃える。
  • プローブ配置はマニュアルでやったほうがいい。
    • 重要なところに配置する。
  • -

レンダリングコスト

  • フォワード
    • オブジェクトは毎回描画。負荷はライトの数に応じる
    • シンプルなライト環境であれば使える。
  • デファード
    • 事前に負荷がわかる。
    • それぞれのライトのシェイプを描画できる。
    • 限られたピクセルに対してライトを与えられる
  • -

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

  • レンダリングの2つのフラグでコントロール可能。
  • シャドウがいらなければ、外していけばいい。
  • シャドウディスタンスの微調整。
    • スタックウィンドウで確認し、数値を押さえる。
  • -

■シャドウのクオリティ

  • 距離(ディスタンス)がクオリティに関わる。
    • あまり遠い距離にしない。近めに保っておく。
  • デフォルトシャドウはハード。くっきり
    • できるだけソフトにする。自然に見えるように。
  • ブラーをかける
    • シャドウの境界線に自然なフェード付けられる
    • Radiusを大きくし過ぎないように。
  • -

■ライトマップのこつ

  • ライトマップのスイッチ
    • ムードによって変える
    • 3、4つのセットを用意して切り替える。
  • ポップしてしまう時の対応は?スムーズなトランジションは可能?
    • ライトマップのセットをフェードさせる
  • -

■ライトプルーブ(SH)の再利用

  • マズルフラッシュとか
  • 方向性、精度が気にならない場合は使える。
  • -

■質疑応答

  • ライトマップ計算のスピードアップのコツは?
    • スピードは設定に依存するため、クオリティ、サンプルの数値を減らす。
    • シーンを抽出。小さな部分に注目してやっていく。
  • ライトプローブのライティングは、モバイルではハードスペックに依存する?
    • SHの情報をデコード出来ないデバイスではムリ
    • 現実的な対処法として、動的なライティングは諦めたほうがいいのか?
      • スペックによるが、デバイスを選べば大丈夫。
                                            • -

…以上で本日僕が参加した講演は終了。あと2コマづつくらいありましたが、仕事があったので帰りました。

あとは金曜に参加したセミナー2つ。残りはまた後で更新します。