8.9K Views
April 01, 19
スライド概要
2019/03/29に開催された【Unity道場 3月 ~ライティングとVFX Graph~】の講演スライドです。
講師:山村 達彦 (ユニティ・テクノロジーズ・ジャパン合同会社)
Unityのイベント資料はこちらから:https://www.slideshare.net/UnityTechnologiesJapan/clipboards
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
ライティングの おさらい Tatsuhiko Yamamura @ Unity
こんにちは
↓Twitterで紹介用に作ったが、紹介前に埋まってた
光はライトソースから
光が当たる場所は明るい
光が当たらない場所は暗い
光が届かなければ影になる
光は反射する
光は反射する
反射する光は色に依存
白い光+ 青い板 =反射 赤い光+ 青い板 =反射せず 青い光+ 青い板 =反射 緑の光+ 青い板 =反射せず
反射した光は空間を作る
光の表現 全てをリアルタイムに実行するのは高負荷 事前にテクスチャに焼き込んでおく + 動くキャラクターは動的なライト
ライティングの設定
光の種類 環境光 光る物体 ライト
DEMO
光の種類 環境光 光る物体 ライト
空間の光情報 • 空間の光情報 (Environment Light) • 陰影を作る • Skyboxもしくは Reflection Probe Ambient Color
空間の光情報 • Skyboxに設定 • シーン全体に影響 • Unityの初期設定で なんとなく青くなるのは コレが原因(空が青い) • 暗いステージを作りたい場合は、 まずAmbient Colorを操作
周辺の光がオブジェクトに影響を与える
単純なグラデーション、もしくは 単色のEnvironment Lightも
Environment Lightの影響 ✕6 ✕1 ✕3
暗闇を作りたいなら 設定しておきたい項目
空間の光情報 • Reflection Probe • 光情報を集めて 範囲内のオブジェクトに投影 • Box Projectionを有効にして 簡単な反射の代用としても使える
空間の光情報 • 部屋や遮られた区画ごとに設定 • 暗い部屋を作りたい場合に有用
光る材質 • 発光する=光を受けなくても暗くならないマテリアル • 光るパーツ等、Bloomと合わせて使われる事が多い
光る材質 • Materialの設定 • 光源としても利用可能 (光沢は表現出来ない) • 光源として使うなら 要light static • 動的なオブジェクトに影響を与 えるにはライトプローブが必要
ライト • 光を作る • 影を作る
ライトのタイプ Baked Mixed Realtime テクスチャに光と影の 情報を書き込む 事前計算と動的な影を 組み合わせる 動的に光と影を計算 事前計算が必要 事前計算が必要 事前準備が不要 複雑な計算は可 一部で複雑な計算が可 (Realtime GIが無効の場合) 複雑な計算は不可 ライトは一切動かせない ライトの変化のみ可能 自由に動かせる
リアルタイムなライト Baked • 範囲内のオブジェクトに 影響を与える • ダイナミックなオブジェクトに 影が落ちる • 影響範囲が被ると 負荷が上がる事が多い Mixed Realtime
リアルタイムなライト Baked • Realtime GIが有効なら 間接光表現も可能 (動かないオブジェクトのみ。 追加でCPUコストが必要) Mixed Realtime
リアルタイムなライト Baked Mixed • Realtime GIは、部屋の形は変更できないが、 Realtime 模様替え程度なら整合性を維持したままいろいろと出来る
リアルタイムな影 Baked Mixed Realtime • 各ライト毎にShadow Mapが作られる • 影の品質はShadow Resolutionの設定と画面の解像度に依存 • High : 画面の2倍 • Mid : 画面の1倍 • Low : 画面の0.5倍 • ライトの種類毎に見るべき設定が異なる
Directional Light Baked Mixed Realtime • 表示する範囲が品質に直結 • 範囲を狭くすれば面積辺りに 使用できる解像度が広くなり、 影野品質が上がる • Shadow Map解像度は画面の 約2倍(Highの場合) 300m先まで描画 影の範囲を30m先に限定
Directional Light Baked • 広い範囲を描画するために Mixed カスケード 無し カスケードが使える • 近いオブジェクトを 細かい解像度で描画 • 複数回 影を描画するので 描画コストが上がる事も カスケード 有り Realtime
Spot Light Baked • ライトの角度で品質が変化 • Rangeに依存しないが、 広範囲を表示すると雑になる • 解像度は1倍(Highの場合) Mixed Realtime
Point Light Baked Mixed Realtime • ポイントライトとの距離で品質が変化 (Rangeが広くないと表示されないので Rangeに依存するとも言える) • 6回描画する必要があるため、 解像度は低く設定されている(0.5倍) • ポイントライトを太陽の代わりに 使うのは止めよう 4m 40m
リアルタイムなライト Baked • 狭い範囲の影を描画したり する分には非常に良い • 間接光表現は出来ないが、 質感的に最も正しい事が多い Mixed Realtime
ベイクしたライト Baked Mixed • フワっとした影が作れる • 間接光の影響でリアルタイムより空間の 輝度が上がる事も (Indirect Multiplerを調整) • ダイナミックなオブジェクトに 影は落ちない Realtime
ベイクしたライト Baked • CPU負荷が軽い • ライトが増えても負荷は上がらない • リアルタイムと同レベルの細かい影を 出そうと思うとメモリ負荷が高い Mixed Realtime
ベイクしたライト Baked Mixed Realtime • 影の品質は Light-map Resolutionに 強く依存 • ベイク時の品質は resolution 40 サンプリングの 影響が割と高い resolution 4
ベイクしたライト Baked • Progressive Lightmapper • ビルド完了まで待たなくても ある程度完成形が見える • シーンで表示してる部分が 優先して焼かれる • 最近GPU対応した Mixed Realtime
ベイクしたライト Baked Mixed Realtime • 光源の情報が失われる • ノーマルマップによる 凹凸は失われないが、 かなり見えにくくなる Realtime • HDRでライトを焼いて キューブマップで擬似的な再現 というオプションも… Baked
ベイクしたライト Baked Mixed • ダイナミックなオブジェクトへは Lightprobe経由で影響を渡す (プローブ間で光情報を補完) • LightProbeはProbe間の切り替え時に 負荷が発生する → 細かすぎると負荷 • 小物はライトを焼かずに、Lightprobeという 選択肢もある Realtime
Mixed(リアルタイムな影とベイクした影を合成)の 4つのの手法 Baked Mixed • BakeとRealtimeを合わせたもの • 大抵の場合、Realtimeより軽くBakeより柔軟 • ライトマップのベイク等は必要 Realtime
Mixed(リアルタイムな影とベイクした影を合成)の 4つのの手法 Baked Mixed • Subtractive Realtime テクスチャベイク寄り • Shadow Mask • Shadow Mask Distance Shadow • Baked Indirect 動的な計算寄り
Subtractive • 影をベイクする • ベイクした影の上に、 ダイナミックな影を落とす • 影の色を調整して違和感を無くす 色を調整後
Subtractive • staticなオブジェクトは光情報を 一切参照しない(光沢は失われる) • 影の品質はライトマップ解像度に依存 Dynamic static Baked
Shadow Mask • ダイナミックな影と事前ベイクの影が同じ質感で影を落とす • staticなオブジェクトに使用するシャドウマスクを事前に生成 • 間接光の情報はテクスチャに焼き込む + =
Shadow Mask • 質感表現はリアルタイムで行う(綺麗) • Shadow Radiusによるボケた影も利用可能 (影をボカす場合、リアルタイムと混ぜるときに注意) Bake Shadow Mask
Shadow Mask • ダイナミックなオブジェクトは 影を落とせる • ShadowMaskの影(建物の影)は ダイナミックなオブジェクトに 落ちない • Lightprobeで影響を与える (影は落ちないが違和感は減る)
Subtractive or Shadow Maskで 動的なキャラクターに影を落としたい • Shadow Onlyかつ 形状がシンプルなオブジェクトを 配置して影を落とす • Subtractiveは要 微調整 (二重に影が落ちる)
Shadow Mask (DistanceShadow) • 近距離のみリアルタイムで影を表現 (建物が影を落とす) • 遠距離はShadow Maskを使用する (カメラの角度によっては、解像度 が非常に低くても問題ない) • 遠距離のリアルタイムな 影は表示されない
Shadow Maskの問題 • 1オブジェクトにつき 4つしか割り当てられない (1ライト毎にRGBAの一色が割り当てられている) • 適度にBaked設定を利用 (大量のポイントライト等)
Shadow Maskの問題 Baked Lightmap • Shadow Maskが 割り当てられないライトは テクスチャに焼かれる • 焼かれるライトは Light Overlapで確認 (ライトと範囲が赤く表示) Light Overlap
Baked Indirect • 間接光のみテクスチャにベイク • リアルタイムな影や光表現は すべて動的に実行 • 遠距離の影は表示出来ない
用途毎に設定を考える • とにかく軽くしたい Subtractive • 出来るだけ綺麗にしたい Shadow Mask • 広いステージを作りたい Shadow Mask distance shadow • 遠距離を見る必要は無い (上から視点や、霧の濃いゲーム) Baked Indirect
まとめ
ライトの設定 環境光 Ambient Light Reflection Probe 光る物質 Emissive Material (ステージに配置) 直接光 Light 間接光 GI、Area Light (事前計算) ライトを焼く 光を受ける 物質 Renderer (動的に計算)
ライトマップ設定 Baked Mixed Realtime 影をテクスチャに 全て焼く Realtime GI ON Subtractive Baked Indirect 追加で影を描画 Shadow Mask 間接光のみテクスチャに焼く 影は全てリアルタイム Realtime GI OFF リアルタイムかつ 間接光あり リアルタイムかつ 間接光無し (事前準備は無し) 間接光をテクスチャに焼く。 影のマスクを焼き、 リアルタイムな影と合成 オススメ
Point Light 品質は対象との距離に依存 Directional Light Realtime Spot Light 品質は角度に依存 品質は表示範囲に依存
おわり
おまけ
マルチシーンの扱い • 同じLighting Dataを参照するシーン単位でまとめる • ロード単位は分割される • ABに格納すると必要なアセットが全部ABに突っ込まれる • アクティブなLighting Dataが所属するライトマップが 使用される
小技 • Lightprobeは全体で結合される (加算ロードは出来ないはず) • 複数のLightmap差し替えは可能(要スクリプト) • 遠距離のライトマップはMipmapしか使用しないモードが 追加された • LODとライトマップを組み合わせる場合、Lightprobeが必須