Point

レンダリングの大きな部分を占める。また、計算が複雑でハードウェアの負担も大きい。静的ライティングと動的ライティングがあり、それぞれの特性を理解し適切な場面で正しく使うことが大事。

静的ライティング

エディタで事前に計算されライトマップに保存されます。

  • 〇 : パフォーマンス良し、クオリティも高くできる(ライトマップの設定次第
  • ✕ : メモリの消費量が多く、事前計算に時間がかかる
  • ❕: なにか変更するたびにレンダリングが必要
  • ❕: どのオブジェクトにもライトマップが必要

ライトマップとは?


ライトマスと呼ばれる計算を使ってUE4が生成するテキスチャのことです。World Settingの設定をいじることでクオリティをコントロールできます。Lightmass Importance Volumeをプリント内に置くことで、このボックス内は高クオリティ、それ以外は低クオリティのライティングに設定することができます。

また、ライトマップの解像度はメモリに影響を与えます。
Optimization Viewmodes > Lightmap Density
からライトマップのUV座標が確認できます。
「プレイヤーから遠いオブジェクトなのにライトマップの解像度が高すぎないか?」などの問題がビジュアル化されます。ただ、そこまでこだわりすぎる必要はありません。

動的ライティング

リアルタイムでレンダリングされ、G-bufferの画像を使ってブレンドしながらライティングを視覚化されます。
パフォーマンスに大きな影響を及ぼすので、よく理解してから使う必要があります。

  • 〇:シャープで自然な映り、オブジェクトのサイズに関係なく動く
  • ✕:パフォーマンスへの影響大

動的シャドウ

  • ✕:パフォーマンスへの影響大
  • ✕:ラジオシティなし、グローバルイルミネーションなし
  • ❕:いくつかのライトでは「Shadow Casting」設定をOFFにするのがおすすめ
1. CSM(カスケードシャドウマップ)
    距離に応じで徐々にシャドウをなくしていく。(カメラからの距離に応じてシャドウがフェードイン・アウトする)
  • ✕:オープンワールド系は向いていない
  • ❕:Directional lightのみ
2. ディスタンスフィールドシャドウ(DF)
    *デフォルトではOFF

    • 〇:パフォーマンス良し、遠くまで正確に表現できる
    • ✕:クオリティは低い
    CSMのように距離に応じでシャドウをフェードアウトしても、どうしても目立ってしまう部分がある。 ex遠くの建物にシャドウがまったくないなど
    それをあまり負担がかかわない処理を使ってカバーするのがDF。
    プロジェクト設定>distanceと検索してでてくる「Generate Mesh Distance Fields」にチェックを入れる
3. Inset Shadow (=Per Object Shadow)
    適切なライトが近くになくても高解像度のシャドウをキャストできる。キャラクターなどではデフォルトでONなことが多い。
4. Contact Shadow
    使用頻度は少なめ。小さいオブジェクトに向いていて、下の接触面にシャドウを作成
5. Capsule Shadow
    使用頻度は少なめ。オブジェクトの下のシャドウを低負でレンダリングできる。実際のオブジェクトよりもポリゴン数の少ないオブジェクトを使用しシャドウを作るため。

ライトのモビリティ

1. Movable ※動的
  • ×影がシャープすぎるのでローポリがばれる
  • ×ラジオシティなし、グローバルイルミネーションなし
2. Stationary ※動的と静的のブレンド
  • 事前に生成された静的ライティングと動的ライティングをブレンドさせて作られる。
  • 〇:よりリアルでソフトな映り
3. Static ※静的
    〇:レンダリングが一番早い

まとめ 

動的ライティング自体はそこまで負荷は問題になりません。シャドウの方がコストが高く問題になりやすいです。なぜなら、シャドウの処理はピクセルシェーダーが行っており、その処理が多ければ多いほど時間がかかるからです。だからこそ、ライトのradiusは小さい方がよく、ライトはあまり重複させない方がパフォーマンスが向上します。画像にある白線の領域内ではピクセルシェーダーの処理が行われています。そのため、不要な部分はradiusを小さくし、コストを最小限に抑える必要があります。

\"\"

また、そもそも必要がなければシャドウはOFFでも問題ありません。、動的シャドウを多く使いたい場合は、ポリゴン数にも気を付ける必要があります。どうしてもポリゴン数が多い時は、ディスタンスフィールドシャドウを使って最適化するといいでしょう。

ケーススタディ

 

その1:部屋があり、その中に多くのライトやシャドウを使用している

ブループリントを使って、その部屋の扉が開いたらライトとシャドウを有効にする

その2:VRなどとにかくパフォーマンスが必要な場合

静的ライティングのみ使う

その3:ライティングを自由に変更する必要がある

動的ライティングのみ使う

 

参考: Rendering Master by Sjoerd De Jong at Unreal Academy