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

UE5.10 Lumen Neural Radiosity リアルタイムGI+キャッシュ圧縮でメモリ50%削減の実装完全ガイド【2026年5月新機能】

UE5.10の新機能Lumen Neural Radiosityを完全解説。AIベースのキャッシュ圧縮でVRAMメモリを50%削減しながらリアルタイムグローバルイルミネーション品質を維持する実装手法とパフォーマンス最適化戦略を詳解します。

約18分で読めます

Unreal Engine 5.10が2026年5月21日にリリースされ、Lumenレンダリングシステムに革新的なNeural Radiosity Cache機能が追加されました。この新機能は、従来のRadiosity Cacheをニューラルネットワークベースの圧縮アルゴリズムで置き換え、VRAMメモリ使用量を最大50%削減しながらリアルタイムグローバルイルミネーション(GI)の品質を維持します。

本記事では、UE5.10 Lumen Neural Radiosityの技術的背景、実装方法、パフォーマンス最適化戦略、そして従来手法との比較を徹底解説します。大規模オープンワールド開発やモバイル向けプロジェクトでメモリ制約に悩むエンジニアにとって、この新機能は必見です。

UE5.10 Lumen Neural Radiosityの技術背景

従来のLumen Radiosity Cacheは、シーン全体に配置された**Probe(プローブ)**に間接光情報を保存し、これを補間することでリアルタイムGIを実現していました。しかし、この手法には重大な課題がありました。

従来のRadiosity Cacheの課題

従来のRadiosity Cacheは、各Probeに**球面調和関数(Spherical Harmonics, SH)**で表現された放射輝度データを保存していました。具体的には、各Probeに対して以下のデータを保存する必要がありました。

  • SH係数(通常2次まで使用、RGB各3チャンネル×9係数 = 27 floats/Probe)
  • プローブの空間位置(3 floats)
  • 有効性フラグ・タイムスタンプ(2 floats)

合計で1Probeあたり約128バイトのメモリを消費します。大規模シーンでは数十万のProbeが必要となり、VRAM使用量が数GBに達することも珍しくありませんでした。

Neural Radiosityによる圧縮戦略

UE5.10のNeural Radiosityは、**小型のニューラルネットワーク(Tiny Neural Network, TNN)**を用いてRadiosity Cacheを圧縮します。この手法は以下の原理に基づいています。

基本原理:空間的コヒーレンスの活用

現実のシーンにおける間接光分布は、空間的に滑らかで連続的です。つまり、隣接するProbe間の放射輝度は強い相関を持ちます。Neural Radiosityは、この空間的コヒーレンスをニューラルネットワークの重みとして学習・圧縮します。

以下のダイアグラムは、Neural Radiosityの圧縮・展開パイプラインを示しています。

flowchart TD
    A[シーンの間接光データ] --> B[Probeサンプリング]
    B --> C[従来のSH係数生成]
    C --> D[TNN圧縮学習]
    D --> E[圧縮済みNeural Radiosity Cache]
    E --> F[GPU上でTNN推論]
    F --> G[リアルタイムGI復元]
    
    D --> H[メモリ使用量: 50%削減]
    F --> I[推論オーバーヘッド: +2ms]
    
    style D fill:#4CAF50
    style E fill:#2196F3
    style H fill:#FF9800

上記の図は、従来のSH係数ベースのキャッシュをTNNで圧縮し、GPU上でリアルタイム推論により復元する流れを示しています。圧縮により50%のメモリ削減を実現する一方、推論処理で約2msのオーバーヘッドが発生します。

TNNアーキテクチャの詳細

UE5.10で採用されているTNNは、以下の構成を持ちます。

  • 入力層: 3次元位置座標(x, y, z)
  • 隠れ層: 2層、各層32ニューロン(ReLU活性化関数)
  • 出力層: RGB放射輝度(3チャンネル)

このネットワークは、位置座標から放射輝度への連続的なマッピング関数を学習します。重みパラメータはFP16(半精度浮動小数点)で保存され、総パラメータ数は約4,000個です。これにより、従来の個別Probeストレージと比較して50%以上のメモリ削減を実現します。

学習・更新プロセス

Neural Radiosity Cacheは、シーン変更時に自動的に更新されます。更新プロセスは以下の通りです。

  1. 変更検出: ライト移動、オブジェクト配置変更を検出
  2. サンプル収集: 変更領域周辺でProbeサンプリング
  3. 増分学習: 既存のTNN重みを微調整(Full Retrainingは行わない)
  4. GPU転送: 更新された重みをGPUメモリに転送

この増分学習により、動的シーンでも1-2フレーム以内にGIキャッシュを更新できます。

UE5.10 Neural Radiosity実装ガイド

ここでは、実際のUE5.10プロジェクトでNeural Radiosityを有効化し、最適化する手順を解説します。

プロジェクト設定での有効化

Neural Radiosityは、UE5.10デフォルトでは実験的機能として提供されています。有効化するには、プロジェクト設定を変更します。

手順1: コンソールコマンドでの有効化

エディタのコンソールで以下のコマンドを実行します。

r.Lumen.Radiosity.NeuralCompression 1

手順2: DefaultEngine.iniでの永続化

プロジェクトのConfig/DefaultEngine.iniに以下を追加します。

[SystemSettings]
r.Lumen.Radiosity.NeuralCompression=1
r.Lumen.Radiosity.NeuralCompression.Quality=2
r.Lumen.Radiosity.ProbeSpacing=200
r.Lumen.Radiosity.UpdateRate=30

各パラメータの意味は以下の通りです。

  • NeuralCompression.Quality: 圧縮品質(0-3、デフォルト2)
  • ProbeSpacing: Probe配置間隔(cm単位、デフォルト200)
  • UpdateRate: 更新頻度(フレーム単位、デフォルト30)

パフォーマンス最適化設定

以下のダイアグラムは、Neural Radiosityのパフォーマンス設定とトレードオフの関係を示しています。

graph TD
    A[Neural Radiosity設定] --> B[Quality=0: モバイル向け]
    A --> C[Quality=1: コンソール向け]
    A --> D[Quality=2: PC標準]
    A --> E[Quality=3: 最高品質]
    
    B --> B1[メモリ削減: 60%]
    B --> B2[推論速度: 1ms]
    B --> B3[品質: 中]
    
    C --> C1[メモリ削減: 50%]
    C --> C2[推論速度: 1.5ms]
    C --> C3[品質: 高]
    
    D --> D1[メモリ削減: 50%]
    D --> D2[推論速度: 2ms]
    D --> D3[品質: 非常に高]
    
    E --> E1[メモリ削減: 40%]
    E --> E2[推論速度: 3ms]
    E --> E3[品質: 最高]
    
    style B fill:#FF9800
    style C fill:#4CAF50
    style D fill:#2196F3
    style E fill:#9C27B0

上記の図は、Quality設定値とメモリ削減率・推論速度・品質のトレードオフを示しています。モバイル向けではQuality=0、PC向けではQuality=2が推奨されます。

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

プラットフォームQualityProbeSpacingUpdateRate想定VRAM節約
モバイル(iOS/Android)03006060%
コンソール(PS5/XSX)12003050%
PC(RTX 4060以上)21503050%
PC(RTX 4090クラス)31001540%

ブループリントでの動的制御

Neural Radiosityの設定は、ブループリントから動的に変更できます。これにより、ゲーム内の品質設定メニューからユーザーがGI品質を調整可能になります。

以下のブループリントコードは、品質設定に応じてNeural Radiosityを動的に切り替える実装例です。

// ブループリント疑似コード(実際のノードベース実装の説明)

イベント BeginPlay:
    品質設定 = ユーザー設定から読み込み
    
    Switch on 品質設定:
        Case "Low":
            Execute Console Command: "r.Lumen.Radiosity.NeuralCompression.Quality 0"
            Execute Console Command: "r.Lumen.Radiosity.ProbeSpacing 300"
        Case "Medium":
            Execute Console Command: "r.Lumen.Radiosity.NeuralCompression.Quality 1"
            Execute Console Command: "r.Lumen.Radiosity.ProbeSpacing 200"
        Case "High":
            Execute Console Command: "r.Lumen.Radiosity.NeuralCompression.Quality 2"
            Execute Console Command: "r.Lumen.Radiosity.ProbeSpacing 150"
        Case "Ultra":
            Execute Console Command: "r.Lumen.Radiosity.NeuralCompression.Quality 3"
            Execute Console Command: "r.Lumen.Radiosity.ProbeSpacing 100"

実際のブループリントでは、「Execute Console Command」ノードを使用してコンソールコマンドを実行します。

C++での詳細制御

より細かい制御が必要な場合、C++から直接Neural Radiosityのパラメータを操作できます。

// LumenRadiositySettings.h
#include "CoreMinimal.h"
#include "LumenSceneRendering.h"

class FLumenRadiosityController
{
public:
    static void SetNeuralCompressionQuality(int32 Quality)
    {
        static IConsoleVariable* CVar = 
            IConsoleManager::Get().FindConsoleVariable(
                TEXT("r.Lumen.Radiosity.NeuralCompression.Quality")
            );
        
        if (CVar)
        {
            CVar->Set(FMath::Clamp(Quality, 0, 3));
        }
    }
    
    static void SetProbeSpacing(float SpacingCm)
    {
        static IConsoleVariable* CVar = 
            IConsoleManager::Get().FindConsoleVariable(
                TEXT("r.Lumen.Radiosity.ProbeSpacing")
            );
        
        if (CVar)
        {
            CVar->Set(FMath::Max(SpacingCm, 50.0f));
        }
    }
    
    // 動的シーンでの強制更新トリガー
    static void ForceUpdateRadiosityCache()
    {
        static IConsoleVariable* CVar = 
            IConsoleManager::Get().FindConsoleVariable(
                TEXT("r.Lumen.Radiosity.ForceUpdate")
            );
        
        if (CVar)
        {
            CVar->Set(1);
        }
    }
};

// 使用例: ゲーム内品質設定変更時
void UMyGameSettings::ApplyGraphicsSettings()
{
    switch (GraphicsQuality)
    {
        case EGraphicsQuality::Low:
            FLumenRadiosityController::SetNeuralCompressionQuality(0);
            FLumenRadiosityController::SetProbeSpacing(300.0f);
            break;
        case EGraphicsQuality::High:
            FLumenRadiosityController::SetNeuralCompressionQuality(2);
            FLumenRadiosityController::SetProbeSpacing(150.0f);
            break;
        // 他の品質設定...
    }
}

このコードは、コンソール変数を直接操作してNeural Radiosityの設定を変更します。ForceUpdateRadiosityCache関数は、大規模なシーン変更(時間帯変化、建物破壊など)が発生した際に、キャッシュを強制的に再構築するために使用します。

パフォーマンス検証とベンチマーク結果

Epic Gamesが公開したUE5.10リリースノート(2026年5月21日)によると、Neural Radiosityは以下のパフォーマンス特性を示しています。

テスト環境

  • GPU: NVIDIA RTX 4080 (16GB VRAM)
  • シーン: City Sample(大規模都市シーン、約200万ポリゴン)
  • 解像度: 4K (3840x2160)
  • ターゲットフレームレート: 60 FPS

メモリ使用量比較

手法Radiosity Cache メモリ総VRAM使用量削減率
従来のSH係数ベース2.8 GB11.2 GB-
Neural Radiosity (Quality=1)1.4 GB9.8 GB50%
Neural Radiosity (Quality=2)1.5 GB9.9 GB46%
Neural Radiosity (Quality=3)1.8 GB10.2 GB36%

以下のダイアグラムは、時間経過に伴うGPUメモリ使用量の推移を示しています。

gantt
    title GPUメモリ使用量推移(City Sampleシーン)
    dateFormat X
    axisFormat %s
    
    section 従来手法
    初期ロード (8GB) :0, 10
    Probe配置完了 (11.2GB) :10, 30
    定常状態 (11.2GB) :30, 100
    
    section Neural Radiosity
    初期ロード (8GB) :0, 10
    TNN学習 (8.5GB) :10, 25
    圧縮完了 (9.8GB) :25, 100

上記のガントチャートは、シーンロード開始からRadiosity Cache構築完了までのメモリ使用量推移を示しています。Neural Radiosityは学習フェーズで一時的にメモリが増加しますが、圧縮完了後は従来手法より約1.4GB少ないメモリで動作します。

フレームタイムへの影響

Neural Radiosityの推論処理は、GPUのCompute Shaderで実行されます。以下は、フレームごとのGI計算時間です。

手法GI計算時間総フレーム時間オーバーヘッド
従来のSH補間3.2 ms14.8 ms-
Neural Radiosity (Quality=1)4.5 ms16.1 ms+1.3 ms
Neural Radiosity (Quality=2)5.1 ms16.7 ms+1.9 ms
Neural Radiosity (Quality=3)6.3 ms17.9 ms+3.1 ms

Quality=2設定では、約2msの推論オーバーヘッドが発生しますが、60 FPSターゲット(16.67ms/frame)を十分に維持できます。

画質比較

主観的な画質評価では、Neural Radiosity (Quality=2以上)は従来のSH係数ベースと視覚的にほぼ同等の品質を実現します。特に以下の点で改善が見られました。

  • 間接光の滑らかさ: Probe間の補間がより自然(従来手法で見られた「ブロック状のアーティファクト」が減少)
  • 動的ライト対応: 移動する光源に対する応答が高速化(更新レイテンシが平均40%短縮)

ただし、Quality=0設定では、複雑なライティング環境(多数の色付きライトが混在するシーン)で若干の品質低下が観察されました。

大規模オープンワールドでの実装戦略

大規模オープンワールドゲームでは、広大なシーンを効率的に扱うためにNeural Radiosityを空間分割と組み合わせる必要があります。

World Partitionとの統合

UE5のWorld Partition機能と組み合わせることで、ロード済みセル(チャンク)ごとにNeural Radiosity Cacheを構築できます。

// World Partition統合の実装例
class FLumenWorldPartitionRadiosityManager
{
private:
    // セルごとのNeural Radiosity Cache
    TMap<FIntVector, TSharedPtr<FNeuralRadiosityCache>> CellCaches;
    
public:
    void OnCellLoaded(const FWorldPartitionStreamingCell& Cell)
    {
        FIntVector CellCoord = Cell.GetCoordinate();
        
        // 新しいセルのキャッシュを非同期で構築
        AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [this, CellCoord]()
        {
            auto NewCache = MakeShared<FNeuralRadiosityCache>();
            NewCache->BuildForRegion(CellCoord);
            
            // メインスレッドに戻してキャッシュを登録
            AsyncTask(ENamedThreads::GameThread, [this, CellCoord, NewCache]()
            {
                CellCaches.Add(CellCoord, NewCache);
            });
        });
    }
    
    void OnCellUnloaded(const FWorldPartitionStreamingCell& Cell)
    {
        FIntVector CellCoord = Cell.GetCoordinate();
        
        // キャッシュを解放してメモリを削減
        CellCaches.Remove(CellCoord);
    }
};

このアプローチにより、プレイヤーの視界外のセルのRadiosity Cacheを解放し、VRAM使用量をさらに削減できます。

プローブ密度の動的調整

重要度に応じてProbe密度を動的に調整することで、メモリとGI品質のバランスを最適化できます。

// プローブ密度の動的調整
float CalculateDynamicProbeSpacing(const FVector& Location, const UCameraComponent* Camera)
{
    float DistanceToCamera = FVector::Dist(Location, Camera->GetComponentLocation());
    
    // カメラに近いほど高密度(小さいSpacing)
    const float MinSpacing = 100.0f;  // 1m
    const float MaxSpacing = 500.0f;  // 5m
    const float FalloffDistance = 5000.0f;  // 50m
    
    float NormalizedDistance = FMath::Clamp(DistanceToCamera / FalloffDistance, 0.0f, 1.0f);
    
    return FMath::Lerp(MinSpacing, MaxSpacing, NormalizedDistance);
}

この実装により、カメラ近傍では高品質なGIを、遠方では低コストなGIを適用できます。

トラブルシューティングと最適化Tips

よくある問題と解決策

問題1: 動的オブジェクト周辺でGIが更新されない

Neural Radiosityは、デフォルトで静的ジオメトリのみを考慮します。動的オブジェクト(プレイヤー、車両など)の影響を反映するには、以下の設定が必要です。

[SystemSettings]
r.Lumen.Radiosity.TrackDynamicObjects=1
r.Lumen.Radiosity.DynamicObjectUpdateRadius=1000

問題2: TNN学習中にフレームレートが急低下

初回シーンロード時、TNN学習処理がメインスレッドをブロックする場合があります。これを回避するには、非同期学習を有効化します。

[SystemSettings]
r.Lumen.Radiosity.AsyncTraining=1
r.Lumen.Radiosity.TrainingBudgetMs=5

TrainingBudgetMsは、1フレームあたりの学習処理時間の上限(ミリ秒)です。5msに設定すると、学習が複数フレームに分散され、フレームレートへの影響が軽減されます。

問題3: 色の精度が低下(バンディングが発生)

Neural RadiosityはデフォルトでFP16精度を使用します。HDR環境で色バンディングが発生する場合、FP32精度に変更できます。

[SystemSettings]
r.Lumen.Radiosity.NeuralCompression.UseFP32=1

ただし、メモリ使用量が約2倍に増加するため、VRAM容量に注意が必要です。

プロファイリングツールの活用

UE5.10では、Neural Radiosityの詳細なプロファイリング情報を取得できます。

// コンソールコマンド
stat LumenRadiosity

このコマンドにより、以下の情報が表示されます。

  • TNN推論時間(ms)
  • アクティブなProbe数
  • キャッシュメモリ使用量(MB)
  • 前回の学習時間(ms)

これらの情報を元に、ProbeSpacingQualityパラメータを調整します。

まとめ

UE5.10のLumen Neural Radiosityは、ニューラルネットワークベースの圧縮技術により、以下のメリットを実現します。

  • VRAMメモリ使用量を最大50%削減(従来のSH係数ベースと比較)
  • リアルタイムGI品質をほぼ維持(Quality=2設定時)
  • 動的シーンへの対応が高速化(更新レイテンシ40%短縮)
  • 大規模オープンワールド開発でのメモリ管理が容易に

一方で、以下の点に注意が必要です。

  • 推論オーバーヘッド: 約2ms/frameの追加コスト(Quality=2設定時)
  • 初回学習コスト: シーンロード時に一時的なフレームレート低下
  • モバイルプラットフォーム: Quality=0-1推奨(GPU性能制約)

推奨される導入戦略は以下の通りです。

  1. 段階的導入: まずPC版でQuality=2を試験運用
  2. プロファイリング: stat LumenRadiosityでパフォーマンス計測
  3. プラットフォーム別最適化: 各プラットフォームに応じたQuality設定
  4. World Partition統合: 大規模シーンでは空間分割と組み合わせる

Neural Radiosityは、次世代グラフィックスにおけるメモリ効率とGI品質の両立を実現する重要な技術です。UE5.10以降のプロジェクトでは、積極的に採用を検討すべき機能と言えるでしょう。

参考リンク

#Unreal Engine 5 #Lumen #Neural Radiosity #GPU最適化 #グローバルイルミネーション
シェア: