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

UE5.9 Lumen動的ライト対応完全実装ガイド|リアルタイムGI + 可動光源の品質・パフォーマンス最適化

UE5.9で実装されたLumenの動的ライト対応機能を徹底解説。可動光源によるリアルタイムグローバルイルミネーションの品質設定からパフォーマンスチューニングまで、実装レベルで詳述します。

約13分で読めます

Unreal Engine 5.9が2026年4月にリリースされ、Lumenのグローバルイルミネーション(GI)システムに動的ライト(Movable Light)の完全対応が実装されました。従来のLumenは静的ライトや固定ライトには高品質なGIを提供していましたが、Movable Lightに対しては限定的な対応に留まっていました。

この制約により、時刻変化する太陽光や、プレイヤーが持つ懐中電灯、爆発エフェクトなど、動的に変化する光源を使用したシーンでは、リアルタイムGIの品質が大幅に低下していました。UE5.9の新実装により、これらの動的光源でも静的光源と同等の高品質なグローバルイルミネーションが実現可能になっています。

本記事では、UE5.9で導入されたLumen動的ライト対応の技術的な実装詳細、品質設定の最適化手法、GPU負荷とのトレードオフ、そして実際のゲーム開発における実装パターンを解説します。

UE5.9のLumen動的ライト対応:技術的変更点

UE5.9以前のLumenは、Movable Lightに対してレイトレースベースのシャドウと限定的な間接照明のみを提供していました。直接照明は正確に計算されるものの、バウンスライト(間接照明)の品質は静的光源と比較して著しく劣化していました。

新アーキテクチャの概要

UE5.9では、以下の技術的変更により動的ライトの完全対応が実現されています。

以下のダイアグラムは、UE5.9のLumen動的ライト処理パイプラインを示しています。

flowchart TD
    A[動的光源] --> B[Surface Cache更新]
    B --> C[リアルタイムプローブ再配置]
    C --> D[インクリメンタルSDF更新]
    D --> E[ハードウェアレイトレーシング]
    E --> F[間接照明計算]
    F --> G[時間的フィルタリング]
    G --> H[最終GI出力]
    
    B --> I[GPU Driven更新]
    C --> J[Hierarchical Probe Grid]
    D --> K[Sparse SDF Structure]
    E --> L[BVH Refit]

動的ライトに対する新しい処理フローは、従来の静的なキャッシュ構造を時間ごとに更新する仕組みを導入しています。

主要な技術変更:

  1. インクリメンタルなSurface Cache更新: 動的光源の移動・変化を検出し、影響範囲のSurface Cacheのみを部分的に再構築します。従来は光源が動くたびに全体を再計算していましたが、UE5.9では変更された領域のみを更新することで、GPU負荷を最大70%削減しています。

  2. Hierarchical Probe Grid: 動的光源周辺に高密度のプローブを配置し、光源から離れるにつれてプローブ密度を段階的に低下させる階層構造を採用。これにより、重要な領域では高品質なGIを維持しながら、遠方では計算コストを抑制します。

  3. ハードウェアレイトレーシングの最適化: RTX 40シリーズやRadeon RX 7000シリーズのハードウェアレイトレーシング機能をフル活用し、BVH(Bounding Volume Hierarchy)のリフィット処理を動的に実行。光源移動時のBVH再構築を最小限に抑えます。

パフォーマンス特性

Epic Gamesの公式ベンチマークによると、UE5.9のLumen動的ライト対応は以下のパフォーマンス特性を示しています。

シーン構成UE5.8(従来版)UE5.9(新実装)GPU負荷削減率
単一動的光源8.2ms/frame4.1ms/frame50%
複数動的光源(5個)32.5ms/frame13.8ms/frame58%
大規模オープンワールド45.3ms/frame18.7ms/frame59%

この性能向上は、上述のインクリメンタル更新とHierarchical Probe Gridの組み合わせによるものです。

動的ライト品質設定の最適化

UE5.9では、動的ライトのGI品質を制御する新しいプロジェクト設定とコンソールコマンドが追加されています。

プロジェクト設定

Project Settings > Engine > Rendering > Lumen に以下の新設定が追加されました。

Movable Light Quality(0~4の5段階):

  • 0 (Minimal): 直接照明のみ、間接照明は最小限
  • 1 (Low): 1バウンスのみ、プローブ密度: 低
  • 2 (Medium): 2バウンス、プローブ密度: 中(デフォルト)
  • 3 (High): 3バウンス、プローブ密度: 高
  • 4 (Cinematic): 4バウンス、プローブ密度: 最高、高精度レイトレーシング

実装例(C++でのプロジェクト設定読み込み):

// プロジェクト設定からLumen動的ライト品質を取得
const URendererSettings* Settings = GetDefault<URendererSettings>();
int32 MovableLightQuality = Settings->LumenMovableLightQuality;

// 実行時の品質変更
IConsoleManager::Get().FindConsoleVariable(TEXT("r.Lumen.MovableLight.Quality"))->Set(3);

コンソールコマンド

以下のコンソールコマンドで、実行時に品質を動的に調整できます。

r.Lumen.MovableLight.Quality 2
r.Lumen.MovableLight.ProbeSpacing 200.0
r.Lumen.MovableLight.MaxTracingDistance 10000.0
r.Lumen.MovableLight.SurfaceCacheUpdateRate 30
r.Lumen.MovableLight.TemporalFilter 1

各パラメータの解説:

  • ProbeSpacing: プローブ間の距離(cm)。小さいほど高品質だがGPU負荷増
  • MaxTracingDistance: レイトレーシングの最大距離。遠方のGI精度に影響
  • SurfaceCacheUpdateRate: Surface Cacheの更新頻度(フレーム数)。高いほど負荷軽減
  • TemporalFilter: 時間的フィルタリングの有効化(0/1)。ちらつき抑制

品質とパフォーマンスのトレードオフ

以下の図は、品質設定とGPU負荷の関係を示しています。

graph LR
    A[Quality 0<br/>2.5ms] --> B[Quality 1<br/>4.1ms]
    B --> C[Quality 2<br/>7.3ms]
    C --> D[Quality 3<br/>12.8ms]
    D --> E[Quality 4<br/>24.6ms]
    
    A -.->|+64%| B
    B -.->|+78%| C
    C -.->|+75%| D
    D -.->|+92%| E

品質レベルが1段階上がるごとに、GPU負荷は約60~90%増加します。ターゲットプラットフォームに応じて、適切な品質レベルを選択する必要があります。

実装パターン:時刻変化する太陽光システム

動的ライトの最も一般的なユースケースは、昼夜サイクルを持つオープンワールドゲームにおける太陽光の実装です。UE5.9では、Directional LightをMovableに設定するだけで、時刻変化に応じた高品質なGIが自動的に計算されます。

Blueprint実装例

以下は、時刻に応じて太陽の角度と色温度を変化させるBlueprintの実装パターンです。

// C++での時刻管理システム実装
UCLASS()
class ADynamicSunSystem : public AActor
{
    GENERATED_BODY()

public:
    UPROPERTY(EditAnywhere, Category = "Sun")
    ADirectionalLight* SunLight;

    UPROPERTY(EditAnywhere, Category = "Time")
    float TimeOfDay = 12.0f; // 0~24時間

    UPROPERTY(EditAnywhere, Category = "Time")
    float TimeSpeed = 1.0f; // 時間の進行速度

    virtual void Tick(float DeltaTime) override
    {
        Super::Tick(DeltaTime);

        // 時刻を進める
        TimeOfDay += DeltaTime * TimeSpeed / 3600.0f;
        if (TimeOfDay >= 24.0f) TimeOfDay -= 24.0f;

        // 太陽の角度を計算(0時=北、12時=南)
        float SunAngle = (TimeOfDay - 6.0f) * 15.0f; // 6時を基準に15度/時
        FRotator SunRotation(SunAngle, 0.0f, 0.0f);
        SunLight->SetActorRotation(SunRotation);

        // 色温度を時刻に応じて変化(朝夕は暖色、昼は白色)
        float ColorTemp = CalculateColorTemperature(TimeOfDay);
        SunLight->SetLightColor(FLinearColor::MakeFromColorTemperature(ColorTemp));

        // Lumenに光源変更を通知(UE5.9で自動化されているが明示的に呼ぶことも可能)
        SunLight->MarkRenderStateDirty();
    }

private:
    float CalculateColorTemperature(float Time)
    {
        // 朝夕(5-7時、17-19時): 3000K(暖色)
        // 昼(10-14時): 6500K(白色)
        if (Time >= 5.0f && Time <= 7.0f)
            return FMath::Lerp(3000.0f, 6500.0f, (Time - 5.0f) / 2.0f);
        else if (Time >= 17.0f && Time <= 19.0f)
            return FMath::Lerp(6500.0f, 3000.0f, (Time - 17.0f) / 2.0f);
        else if (Time >= 10.0f && Time <= 14.0f)
            return 6500.0f;
        else
            return 4500.0f; // 中間値
    }
};

パフォーマンス最適化

時刻変化システムでは、太陽光が1フレームごとに変化するため、Surface Cacheの更新頻度が重要です。以下の設定で最適化できます。

r.Lumen.MovableLight.SurfaceCacheUpdateRate 15

この設定により、Surface Cacheは15フレームごとに更新されます。60fpsでは0.25秒ごとの更新となり、視覚的には滑らかに見えながらGPU負荷を大幅に削減できます。

複数動的光源の最適化戦略

複数の動的光源(懐中電灯、爆発、魔法エフェクトなど)が同時に存在する場合、GPU負荷が急増します。UE5.9では、光源の重要度に応じた優先順位付けが可能です。

光源優先度システム

以下のシーケンス図は、複数動的光源の優先度管理フローを示しています。

sequenceDiagram
    participant Player
    participant LightManager
    participant Lumen
    participant GPU

    Player->>LightManager: 懐中電灯オン
    LightManager->>Lumen: 高優先度光源登録
    Lumen->>GPU: Quality 3で処理
    
    Player->>LightManager: 遠方の松明出現
    LightManager->>Lumen: 低優先度光源登録
    Lumen->>GPU: Quality 1で処理
    
    LightManager->>Lumen: 距離チェック(毎フレーム)
    Lumen->>LightManager: 優先度再計算
    LightManager->>Lumen: 優先度更新

光源の優先度は、プレイヤーからの距離や光源の強度に基づいて動的に調整されます。

C++実装例

UCLASS()
class ULumenLightPriorityManager : public UActorComponent
{
    GENERATED_BODY()

public:
    struct FLightPriority
    {
        UPointLightComponent* Light;
        float Priority; // 0.0~1.0
        int32 QualityLevel; // 0~4
    };

    TArray<FLightPriority> ManagedLights;

    void UpdatePriorities(const FVector& PlayerLocation)
    {
        for (auto& LightInfo : ManagedLights)
        {
            float Distance = FVector::Dist(PlayerLocation, LightInfo.Light->GetComponentLocation());
            float Intensity = LightInfo.Light->Intensity;

            // 距離と強度から優先度を計算
            LightInfo.Priority = FMath::Clamp(Intensity / (Distance * Distance) * 1000.0f, 0.0f, 1.0f);

            // 優先度に応じて品質レベルを設定
            if (LightInfo.Priority > 0.8f)
                LightInfo.QualityLevel = 3; // High
            else if (LightInfo.Priority > 0.5f)
                LightInfo.QualityLevel = 2; // Medium
            else if (LightInfo.Priority > 0.2f)
                LightInfo.QualityLevel = 1; // Low
            else
                LightInfo.QualityLevel = 0; // Minimal

            // Lumenに品質レベルを反映
            SetLightQuality(LightInfo.Light, LightInfo.QualityLevel);
        }
    }

private:
    void SetLightQuality(UPointLightComponent* Light, int32 Quality)
    {
        // カスタムプリミティブデータを使用して品質を設定
        Light->SetScalarParameterValueOnMaterials(FName("LumenQuality"), static_cast<float>(Quality));
    }
};

この実装により、重要な光源には高品質なGIを適用し、背景の光源は低品質で処理することで、視覚品質を保ちながらGPU負荷を最適化できます。

プラットフォーム別推奨設定

UE5.9のLumen動的ライト対応は、プラットフォームごとに異なる設定が推奨されます。

PC(ハイエンドGPU)

推奨GPU: RTX 4070以上、RX 7800 XT以上

r.Lumen.MovableLight.Quality 3
r.Lumen.MovableLight.ProbeSpacing 150.0
r.Lumen.MovableLight.MaxTracingDistance 15000.0
r.Lumen.MovableLight.SurfaceCacheUpdateRate 10
r.Lumen.HardwareRayTracing 1

ハイエンドGPUでは、ハードウェアレイトレーシングを有効化し、Quality 3での運用が現実的です。4K解像度でも60fps維持が可能です。

PlayStation 5 / Xbox Series X

r.Lumen.MovableLight.Quality 2
r.Lumen.MovableLight.ProbeSpacing 200.0
r.Lumen.MovableLight.MaxTracingDistance 10000.0
r.Lumen.MovableLight.SurfaceCacheUpdateRate 20
r.Lumen.HardwareRayTracing 1

コンソールでは、Quality 2が最適なバランスです。ハードウェアレイトレーシングは利用可能ですが、ProbeSpacingを広めに設定して負荷を抑えます。

Steam Deck / ミドルレンジPC

r.Lumen.MovableLight.Quality 1
r.Lumen.MovableLight.ProbeSpacing 300.0
r.Lumen.MovableLight.MaxTracingDistance 5000.0
r.Lumen.MovableLight.SurfaceCacheUpdateRate 30
r.Lumen.HardwareRayTracing 0

ミドルレンジ環境では、ソフトウェアレイトレーシングを使用し、Quality 1で運用します。Surface Cache更新頻度を下げることで、30fps安定を目指します。

以下の比較図は、プラットフォーム別の設定戦略を示しています。

graph TD
    A[ターゲットプラットフォーム] --> B[PC ハイエンド]
    A --> C[コンソール]
    A --> D[ミドルレンジ]
    
    B --> B1[Quality 3<br/>HW RT有効<br/>ProbeSpacing 150]
    C --> C1[Quality 2<br/>HW RT有効<br/>ProbeSpacing 200]
    D --> D1[Quality 1<br/>SW RT<br/>ProbeSpacing 300]
    
    B1 --> E[60fps @ 4K]
    C1 --> F[60fps @ 1440p-4K]
    D1 --> G[30fps @ 1080p]

プラットフォームのGPU性能に応じて、Quality、ProbeSpacing、レイトレーシング方式を調整することで、最適なパフォーマンスを実現できます。

デバッグと可視化ツール

UE5.9では、Lumen動的ライトのデバッグ用可視化コマンドが強化されています。

可視化コマンド

r.Lumen.Visualize.Mode 1

このコマンドで、以下のモードが選択可能です。

  • Mode 1: Surface Cacheの更新頻度(赤=高頻度、青=低頻度)
  • Mode 2: Probe配置の可視化(球体で表示)
  • Mode 3: レイトレーシングのヒートマップ(赤=高負荷)
  • Mode 4: 間接照明の寄与度(明るさで表示)

パフォーマンスプロファイリング

stat Lumen コマンドで、Lumen関連のGPU負荷を詳細に確認できます。

stat Lumen
stat LumenMovableLight

出力例:

Lumen Movable Light Update: 4.23ms
  Surface Cache Update: 2.15ms
  Probe Redistribution: 0.87ms
  Hardware Ray Tracing: 1.21ms
Lumen GI Total: 12.45ms

これにより、どの処理がボトルネックになっているかを特定し、適切な最適化を行えます。

まとめ

UE5.9で実装されたLumen動的ライト対応により、以下が実現可能になりました。

  • Movable Lightでの高品質GI: 静的光源と同等の品質で、動的光源のグローバルイルミネーションが計算可能
  • インクリメンタル更新による負荷削減: 従来比50~70%のGPU負荷削減
  • 柔軟な品質設定: プラットフォームやシーンに応じた5段階の品質レベル
  • 複数光源の優先度管理: 重要度に基づく動的な品質調整

実装時の推奨事項:

  • ハイエンドPC: Quality 3、ハードウェアレイトレーシング有効
  • コンソール: Quality 2、ProbeSpacing 200cm
  • ミドルレンジ: Quality 1、Surface Cache更新頻度30フレーム
  • 複数光源: 優先度システムの導入
  • 時刻変化: Surface Cache更新レート15フレーム

UE5.9のLumen動的ライト対応は、オープンワールドゲームや動的な照明が重要なプロジェクトにおいて、ビジュアル品質の大幅な向上をもたらす重要な機能です。

参考リンク

#Unreal Engine 5 #Lumen #リアルタイムレンダリング #グローバルイルミネーション #動的ライト
シェア: