メインコンテンツへスキップ
Tech Playground
ゲーム開発

UE5.11 Lumen Dynamic Lights リアルタイム影計算GPU最適化|可動光源グローバルイルミネーション実装完全ガイド

UE5.11 Lumen Dynamic Lightsの可動光源対応でリアルタイムGI品質を維持する実装手法。影計算最適化、GPU負荷削減、Surface Cache動的更新を徹底解説【2026年6月新機能】

約15分で読めます

Unreal Engine 5.11で大幅に強化されたLumen Dynamic Lightsは、可動光源(動的ライト)に対するリアルタイムグローバルイルミネーション(GI)計算を実現する画期的な機能です。2026年6月にリリースされたこのアップデートでは、従来静的ライトベイクに頼っていた高品質な間接光計算を、完全に動的な環境下で維持できるようになりました。本記事では、UE5.11の公式ドキュメントとEpic Gamesの技術ブログ、GDC 2026での発表内容をもとに、Lumen Dynamic Lightsの実装手法とGPU最適化戦略を完全解説します。

Epic Gamesが2026年5月に公開したベンチマークによると、UE5.11のLumen Dynamic Lightsは従来のUE5.3と比較して、可動光源使用時のGPU負荷を約35%削減しながら、間接光の品質を維持できることが実証されています。この性能向上は、新しいSurface Cache動的更新アルゴリズムと、影計算の階層的最適化によって実現されました。

Lumen Dynamic Lightsの技術アーキテクチャ

Lumen Dynamic Lightsは、可動光源からの直接光と間接光の両方をリアルタイムで計算するシステムです。従来のLumenは静的ジオメトリに対する間接光計算に最適化されていましたが、UE5.11では動的光源の移動・回転・強度変化に追従する新しいキャッシング戦略が導入されました。

以下のダイアグラムは、Lumen Dynamic Lightsのレンダリングパイプラインを示しています。

flowchart TD
    A["動的光源"] --> B["Direct Lighting計算"]
    A --> C["Surface Cache動的更新"]
    C --> D["Radiance Cache更新"]
    D --> E["間接光伝播計算"]
    B --> F["最終ピクセルカラー合成"]
    E --> F
    F --> G["Temporal Accumulation"]
    G --> H["デノイズ処理"]
    
    C -.変更検知.-> I["Dirty Region Tracking"]
    I -.部分更新.-> C
    
    style C fill:#4A90E2
    style D fill:#E24A4A
    style I fill:#50C878

このパイプラインでは、光源の位置や強度が変化したときに影響を受けるSurface Cacheの領域のみを更新する「Dirty Region Tracking」が重要な役割を果たします。これにより、全シーンを再計算する必要がなくなり、GPU負荷を大幅に削減できます。

Surface Cache動的更新の仕組み

UE5.11で導入されたSurface Cache動的更新は、以下の3段階で処理されます。

1. 変更検知(Change Detection)
各フレームで光源の変換行列(位置・回転)と光源パラメータ(強度・色・減衰)を前フレームと比較し、変更があった光源を特定します。この処理は軽量な行列比較として実装されており、オーバーヘッドは1光源あたり約0.02msです。

2. 影響領域計算(Affected Region Calculation)
変更が検知された光源について、その影響範囲内にあるSurface Cacheボクセルを特定します。UE5.11では、階層的バウンディングボリューム(Hierarchical Bounding Volume)を使用した高速な範囲検索が実装されており、1000個の光源がある環境でも約0.5msで処理が完了します。

3. 部分再計算(Partial Recomputation)
影響を受けたボクセルのみを再計算します。この際、周辺ボクセルとの境界で不連続が発生しないよう、2ボクセル分のマージン領域も更新対象に含めます。

以下はプロジェクト設定でSurface Cache動的更新を有効化するコンソールコマンド例です。

// プロジェクト起動時にConsoleVariables.iniに追加
r.Lumen.DynamicLights.SurfaceCache.Update=1
r.Lumen.DynamicLights.DirtyRegionTracking=1
r.Lumen.DynamicLights.UpdateThreshold=0.1  // 位置変化閾値(Unreal Unit)

リアルタイム影計算の最適化戦略

可動光源によるシャドウマップ生成は、Lumenにとって最大のボトルネックの1つです。UE5.11では、Cascaded Shadow Maps(CSM)とVirtual Shadow Maps(VSM)のハイブリッド実装により、このボトルネックを解消しています。

Virtual Shadow Mapsとの統合

Virtual Shadow Mapsは、UE5で導入された高解像度シャドウマッピング技術で、従来のCSMと比較してメモリ効率とキャッシュ効率に優れています。Lumen Dynamic Lightsでは、VSMのページベースキャッシングを活用して、光源が移動してもシャドウマップの大部分を再利用できます。

Epic Gamesの内部テストによると、VSMを使用した場合、可動光源が毎フレーム小さく移動する環境(例: 揺れるランタン)において、シャドウマップ更新コストが従来のCSMと比較して約60%削減されました。

// Virtual Shadow Mapsを有効化(プロジェクト設定)
r.Shadow.Virtual.Enable=1
r.Lumen.DynamicLights.UseVirtualShadowMaps=1

// キャッシュサイズ設定(VRAM使用量とトレードオフ)
r.Shadow.Virtual.Cache.StaticSeparate=1
r.Shadow.Virtual.MaxPhysicalPages=4096  // デフォルト値、GPUメモリに応じて調整

階層的シャドウ更新

UE5.11では、光源の重要度と影響範囲に応じてシャドウマップの更新頻度を動的に調整する機能が追加されました。これにより、画面外の光源や遠方の光源のシャドウ更新頻度を下げ、GPU負荷を削減できます。

以下のダイアグラムは、階層的シャドウ更新の意思決定フローを示しています。

flowchart TD
    A["光源リスト"] --> B{画面内か?}
    B -->|Yes| C{距離判定}
    B -->|No| D["更新頻度: 4フレームに1回"]
    
    C -->|近距離<br/>0-50m| E["更新頻度: 毎フレーム"]
    C -->|中距離<br/>50-200m| F["更新頻度: 2フレームに1回"]
    C -->|遠距離<br/>200m+| G["更新頻度: 4フレームに1回"]
    
    E --> H{輝度判定}
    F --> H
    G --> H
    D --> I["最終更新スケジュール"]
    
    H -->|高輝度<br/>>5000lm| J["優先度: 高"]
    H -->|中輝度<br/>1000-5000lm| K["優先度: 中"]
    H -->|低輝度<br/><1000lm| L["優先度: 低"]
    
    J --> I
    K --> I
    L --> I
    
    style E fill:#50C878
    style F fill:#FFD700
    style G fill:#FFA500
    style D fill:#E24A4A

この階層化により、100個の可動光源がある大規模シーンでも、フレームレートへの影響を最小限に抑えられます。

GPU負荷とメモリ効率のバランス

Lumen Dynamic Lightsを実装する際、GPU計算負荷とVRAMメモリ使用量のトレードオフを慎重に検討する必要があります。UE5.11では、プロジェクトの要件に応じて調整可能な複数のパラメータが用意されています。

Surface Cache解像度設定

Surface Cacheの解像度は、間接光の品質とメモリ使用量に直接影響します。Epic Gamesの推奨設定は以下の通りです。

プラットフォーム解像度設定VRAM使用量品質
ハイエンドPC(RTX 4090級)High(デフォルト)約2.5GB最高
ミドルレンジPC(RTX 4060級)Medium約1.5GB
コンソール(PS5/XSX)Medium約1.2GB
モバイル(不推奨)Low約600MB
// Surface Cache解像度の設定例
r.Lumen.SurfaceCache.Resolution=Medium  // Low / Medium / High

// メモリ削減のための追加設定
r.Lumen.SurfaceCache.AtlasSize=2048  // デフォルト4096から削減
r.Lumen.SurfaceCache.MeshCards.MinSize=8  // 小さいメッシュカードを削減

Radiance Cache更新戦略

Radiance Cacheは、空間内の各点での間接光情報をキャッシュする構造です。UE5.11では、Temporal Reprojectionを活用して、前フレームのRadiance Cacheを最大限再利用します。

Epic Gamesの測定によると、静的なシーンでは最大90%のRadiance Cacheが再利用され、GPU負荷が大幅に削減されます。動的な光源が移動する場合でも、影響を受けないプローブは再利用されるため、約60-70%の再利用率が維持されます。

// Radiance Cache設定
r.Lumen.RadianceCache.ProbeResolution=16  // プローブ解像度(8/16/32)
r.Lumen.RadianceCache.NumProbes=4096  // プローブ数(メモリとトレードオフ)
r.Lumen.RadianceCache.TemporalFilter=1  // Temporal Reprojection有効化

実装例:可動光源を使った動的シーン

ここでは、複数の可動光源がリアルタイムで移動する洞窟環境を例に、実装手順を解説します。

ステップ1: プロジェクト設定の最適化

まず、プロジェクトのレンダリング設定でLumen Dynamic Lightsを有効化します。

Project Settings > Engine > Rendering > Global Illuminationで以下を設定:

  • Dynamic Global Illumination Method: Lumen
  • Reflection Method: Lumen
  • Software Ray Tracing Mode: Hit Lighting for Reflections(品質優先)

次に、ConsoleVariables.iniに以下を追加:

[ConsoleVariables]
r.Lumen.DynamicLights.SurfaceCache.Update=1
r.Lumen.DynamicLights.DirtyRegionTracking=1
r.Shadow.Virtual.Enable=1
r.Lumen.DynamicLights.UseVirtualShadowMaps=1
r.Lumen.SurfaceCache.Resolution=Medium
r.Lumen.RadianceCache.NumProbes=4096

ステップ2: 可動光源の配置

ブループリントで動的に移動するPoint Lightを作成します。

// C++での実装例(Blueprintでも同等の処理が可能)
void ADynamicTorchActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    
    // 松明が揺れる動きをシミュレート
    FVector CurrentLocation = GetActorLocation();
    float FlickerOffset = FMath::Sin(GetWorld()->GetTimeSeconds() * 3.0f) * 10.0f;
    CurrentLocation.Z += FlickerOffset * DeltaTime;
    SetActorLocation(CurrentLocation);
    
    // 光源の強度も動的に変化
    float IntensityFlicker = 3000.0f + FMath::Sin(GetWorld()->GetTimeSeconds() * 5.0f) * 500.0f;
    PointLightComponent->SetIntensity(IntensityFlicker);
}

ステップ3: パフォーマンスモニタリング

stat Lumenコンソールコマンドで、リアルタイムにLumenのGPU負荷を確認できます。

stat Lumen
stat GPU
r.Lumen.Visualize.SurfaceCache 1  // Surface Cacheの可視化

Epic Gamesのベンチマーク環境(RTX 4080、4K解像度、Ultra設定)では、20個の可動光源を含む洞窟シーンで以下のパフォーマンスが達成されました。

  • Lumen Surface Cache Update: 2.3ms
  • Lumen Radiance Cache: 1.8ms
  • Shadow Map Generation (VSM): 3.1ms
  • Total Lumen Cost: 約7.2ms(60fps維持可能)

最適化テクニックとトラブルシューティング

光源の重要度設定

すべての光源を毎フレーム更新する必要はありません。以下の基準で優先度を設定します。

高優先度(毎フレーム更新):

  • プレイヤーの視界内
  • カメラから50m以内
  • 輝度5000lm以上
  • 急速に移動する光源

低優先度(4フレームに1回更新):

  • カメラから200m以上
  • 輝度1000lm未満
  • ほぼ静止している光源
// 光源の更新優先度を設定するC++コード
void AMyGameMode::ConfigureLightPriorities()
{
    for (TActorIterator<APointLight> It(GetWorld()); It; ++It)
    {
        APointLight* Light = *It;
        UPointLightComponent* Component = Light->PointLightComponent;
        
        float DistanceToCamera = FVector::Dist(Light->GetActorLocation(), 
                                                GetWorld()->GetFirstPlayerController()->PlayerCameraManager->GetCameraLocation());
        
        if (DistanceToCamera < 5000.0f && Component->Intensity > 5000.0f)
        {
            // 高優先度: 毎フレーム更新
            Component->SetShadowUpdateFrequency(1);
        }
        else if (DistanceToCamera < 20000.0f)
        {
            // 中優先度: 2フレームに1回
            Component->SetShadowUpdateFrequency(2);
        }
        else
        {
            // 低優先度: 4フレームに1回
            Component->SetShadowUpdateFrequency(4);
        }
    }
}

アーティファクト対策

動的光源を使用すると、以下のようなアーティファクトが発生する場合があります。

1. ライトリーク(光漏れ)
薄い壁を通過して間接光が漏れる現象。Surface Cacheの解像度を上げるか、Mesh Distance Fieldsの精度を向上させることで改善します。

r.Lumen.SurfaceCache.MeshCards.OffsetMeshSDFByTwo=1
r.DistanceFields.DefaultVoxelDensity=0.05  // より細かいボクセル化

2. テンポラルノイズ
光源が高速移動するとチラつきが発生。Temporal Accumulationの重みを調整します。

r.Lumen.Reflections.TemporalMaxFramesAccumulated=16  // デフォルト8から増加
r.Lumen.DiffuseIndirect.TemporalMaxFramesAccumulated=32

3. パフォーマンススパイク
多数の光源が同時に移動するとGPU負荷が急増。更新を複数フレームに分散します。

r.Lumen.DynamicLights.MaxUpdatesPerFrame=8  // 1フレームあたりの最大更新数

まとめ

UE5.11 Lumen Dynamic Lightsは、可動光源を使ったリアルタイムグローバルイルミネーションを実用レベルで実現する革新的な技術です。本記事で解説した実装手法を活用することで、以下のメリットが得られます。

  • 品質向上: 静的ライトベイクと同等の間接光品質を動的環境で実現
  • 開発効率化: ライトベイクの待ち時間がなくなり、イテレーション速度が向上
  • 表現力拡大: 時間経過や天候変化など、動的なライティング演出が可能に
  • パフォーマンス最適化: Surface Cache動的更新とVSMの活用により、GPU負荷を従来比35%削減

重要なポイント:

  • Surface Cache動的更新を活用し、変更領域のみを再計算する
  • Virtual Shadow Mapsでシャドウマップキャッシングを最大限活用する
  • 階層的更新戦略で光源の重要度に応じて更新頻度を調整する
  • メモリとGPU負荷のバランスをプロジェクト要件に応じて調整する
  • パフォーマンスモニタリングを継続的に行い、ボトルネックを特定する

UE5.11のLumen Dynamic Lightsは、次世代のリアルタイムレンダリングにおける重要なマイルストーンです。今後のアップデートでは、さらなる最適化とモバイルプラットフォーム対応が予定されており、より幅広いプロジェクトでの活用が期待されます。

参考リンク

#Unreal Engine 5 #Lumen #リアルタイムレンダリング #グローバルイルミネーション #GPU最適化
シェア: