Kembali ke Blog

Unreal Engine 5.8 Lumen Reflections Bug: Mengatasi Silent Screen-Space Fallback

Diterbitkan pada 23 Juni 2026
Unreal Engine 5.8 Lumen Reflections Bug: Mengatasi Silent Screen-Space Fallback

Ringkasnya

Artikel ini membahas bug rendering pada Unreal Engine 5.8 di mana penonaktifan Lumen Global Illumination secara silent mematikan representasi Lumen Scene dan memaksa transisi ke screen-space reflections (SSR). Bug ini sangat memengaruhi game dengan baked lighting karena memaksa developer memilih antara beban GPU yang masif atau penurunan kualitas visual yang drastis. Artikel ini menyediakan solusi programatis menggunakan C++ untuk memaksa pembaruan Lumen Scene, serta opsi modifikasi file konfigurasi dan patch langsung pada source code engine. Terakhir, dibahas pula cara meminimalkan risiko regresi ini di tingkat produksi menggunakan manajemen konfigurasi dinamis lewat platform backend seperti [horizOn](https://horizon.pm).

The Silent Fallback: Mengapa Reflections Anda Rusak di UE 5.8

Melakukan upgrade ke Unreal Engine 5.8 seharusnya menjadi pembaruan pipeline yang standar, namun para graphics engineer menemukan bahwa material metalik mereka yang glossy tampak flat dan muddy. Permukaan yang sebelumnya menunjukkan detail ray-traced yang tajam kini kembali (revert) ke screen-space reflections (SSR) yang kabur segera setelah objek yang memantulkan bergeser keluar dari layar (off-screen). Degradasi rendering yang silent ini disebabkan oleh unreal engine 5.8 lumen reflections bug, di mana engine gagal menghasilkan reflections kecuali Lumen Global Illumination (GI) aktif sepenuhnya. Untuk game yang mengandalkan baked lighting atau solusi GI alternatif, hal ini memaksa developer memilih antara GPU overhead yang masif atau visual fidelity yang rusak.

Masalah utama bermula dari bagaimana Unreal Engine 5.8 menginisialisasi rendering pipeline miliknya. Pada versi sebelumnya, developer dapat menonaktifkan Lumen Global Illumination untuk menghemat resource GPU sambil tetap mengaktifkan Lumen Reflections guna mempertahankan specular highlights berkualitas tinggi pada logam dan kaca. Mode standalone reflections ini merupakan standar untuk hardware kelas menengah (mid-tier) dan profil optimasi target di mana global indirect lighting di-bake ke dalam lightmaps. Namun, di UE 5.8, menonaktifkan Lumen GI secara silent menonaktifkan seluruh representasi Lumen Scene, menyebabkan reflections langsung fallback ke metode screen-space tanpa peringatan atau error di dalam log.

Regresi ini sangat merugikan untuk perilisan multi-platform. Game yang dioptimalkan untuk berjalan stabil pada 60 FPS di konsol dapat mengalami pembengkakan budget grafis secara drastis jika developer terpaksa mengaktifkan kembali Lumen GI hanya untuk menjaga agar material glossy mereka tetap terlihat benar. Memahami mengapa fallback ini terjadi dan cara melakukan patch sangat penting bagi siapa saja yang merilis atau melakukan upgrade proyek Unreal Engine pada tahun 2026.

Memahami Arsitektur: Lumen Reflections vs. Global Illumination

Untuk memahami mengapa bug ini terjadi, kita perlu memeriksa bagaimana Lumen menghasilkan reflections dan indirect lighting di balik layar (under the hood). Lumen tidak melakukan trace ray secara langsung terhadap static meshes dengan detail penuh di level Anda, karena hal tersebut akan sangat memakan biaya komputasi untuk aplikasi real-time. Alih-alih demikian, Lumen membangun representasi scene yang disederhanakan yang disebut Lumen Scene, yang terdiri dari struktur voxel beresolusi rendah dan kartu 2D (2D cards) yang berisi atribut permukaan seperti base color, roughness, dan opacity. Kumpulan data ini dikenal sebagai Surface Cache.

Dalam kondisi engine yang normal (healthy), Surface Cache diperbarui secara terus-menerus saat kamera bergerak melalui lingkungan. Ketika permukaan reflektif memerlukan ray-trace, engine menembakkan ray ke dalam Lumen Scene ini untuk menentukan objek apa saja yang terlihat dan cahaya apa yang dipancarkan. Arsitektur ini memungkinkan reflection pass untuk mengevaluasi glossy reflections yang kompleks dengan biaya yang jauh lebih kecil dibandingkan full path tracing. Yang terpenting, Lumen Scene dan Surface Cache miliknya dapat diinisialisasi secara independen, terlepas dari apakah engine menggunakan Lumen untuk menghitung global indirect lighting atau tidak.

Saat Anda menjalankan profil performa standar pada konsol modern seperti PlayStation 5, rincian biaya performa menunjukkan dengan jelas mengapa memisahkan (decoupling) fitur-fitur ini sangat penting:

  • Lumen GI + Lumen Reflections: Menghitung indirect lighting di seluruh scene, memperbarui Surface Cache, dan melakukan tracing pada glossy reflections memakan waktu sekitar 6,5 ms dari GPU frame time pada resolusi 1440p.
  • Standalone Lumen Reflections: Melakukan tracing reflections terhadap Surface Cache saat menggunakan baked lightmaps untuk GI hanya memakan waktu 1,8 ms dari GPU frame time.
  • Screen-Space Reflections (SSR): Melakukan tracing reflections hanya menggunakan screen buffer yang terlihat memakan waktu 0,5 ms dari GPU frame time, tetapi mengalami visual clipping yang parah di tepi viewport.

Dengan memaksakan fallback ke SSR, engine menghilangkan efek parallax dan kemampuan off-screen reflection yang membuat scene modern terasa realistis. Sebaliknya, memaksa developer untuk mengaktifkan Lumen GI demi mendapatkan reflections tersebut menambah beban masif sebesar 4,7 ms ke dalam budget frame GPU. Latensi tambahan ini tidak dapat diterima untuk game aksi atau kompetitif bertempo cepat yang menargetkan frame rate tinggi.

Mendiagnosis Unreal Engine 5.8 Lumen Reflections Bug

Mendeteksi bug ini selama pengembangan memerlukan analisis di luar perilaku default viewport Unreal Editor, yang terkadang dapat menyembunyikan masalah tersebut karena jalur rendering khusus editor (editor-only rendering paths). Bug ini bermanifestasi secara spesifik ketika Hardware Ray Tracing (HWRT) diaktifkan tetapi metode dynamic global illumination dinonaktifkan. Untuk memastikan apakah proyek Anda terdampak, Anda harus mereplikasi pengaturan konfigurasi yang tepat di mana fallback terjadi.

Mulailah dengan memeriksa konfigurasi rendering proyek Anda. Di bawah Project Settings > Engine > Rendering, navigasikan ke bagian Global Illumination dan atur Dynamic Global Illumination Method ke None (atau ke metode non-Lumen lainnya seperti Screen Space). Selanjutnya, buka bagian Reflections dan atur Reflection Method ke Lumen. Di bawah header Hardware Ray Tracing, pastikan Support Hardware Ray Tracing dan Use Hardware Ray Tracing When Available keduanya bernilai true.

+-------------------------------------------------------------------+
| Project Settings -> Engine -> Rendering                           |
+-------------------------------------------------------------------+
| Dynamic Global Illumination Method:  [ None / Screen Space ]      |
| Reflection Method:                   [ Lumen ]                    |
| Support Hardware Ray Tracing:        [ True ]                     |
| Use Hardware Ray Tracing:            [ True ]                     |
+-------------------------------------------------------------------+

Setelah pengaturan ini diterapkan, jalankan scene Anda di standalone game instance atau jendela PIE yang aktif. Jalankan perintah konsol r.Lumen.Visualize.CardPlacement 1 untuk memeriksa Lumen Scene. Di Unreal Engine 5.8, Anda akan melihat layar yang sepenuhnya kosong, memastikan bahwa Surface Cache tidak aktif. Ini menunjukkan bahwa engine telah mematikan card update pipeline, memaksa reflections untuk fallback ke screen-space reflections.

Lakukan profiling pada scene menggunakan tool Unreal Insights atau perintah konsol standar stat GPU. Anda akan melihat LumenReflections menghilang dari profile pass, digantikan sepenuhnya oleh ScreenSpaceReflections yang memakan waktu sekitar ~0,4 ms hingga ~0,8 ms tergantung pada screen coverage.

Perbaikan Programatis: Memeriksa dan Mengatasi Fallback di C++

Sambil menunggu hotfix resmi, Anda dapat mendeteksi kondisi ini secara programatis pada client dan memaksa konfigurasi engine yang diperlukan. Hal ini mencegah degradasi silent memengaruhi pemain Anda pada sistem yang mendukung hardware ray tracing. Di bawah ini adalah implementasi actor component C++ yang melakukan query ke console manager, memeriksa konfigurasi rendering saat ini, dan secara dinamis menyelesaikan konflik tersebut.

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "HAL/IConsoleManager.h"
#include "Engine/World.h"
#include "LumenReflectionsChecker.generated.h"

UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
class MYGAME_API ULumenReflectionsChecker : public UActorComponent

{
    GENERATED_BODY()

public:
    ULumenReflectionsChecker();

protected:
    virtual void BeginPlay() override;

private:
    void ValidateLumenConfiguration();
};

ULumenReflectionsChecker::ULumenReflectionsChecker()
{
    PrimaryComponentTick.bCanEverTick = false;
}

void ULumenReflectionsChecker::BeginPlay()
{
    Super::BeginPlay();
    ValidateLumenConfiguration();
}

void ULumenReflectionsChecker::ValidateLumenConfiguration()
{
    // Ambil console variables engine yang penting untuk konfigurasi Lumen
    IConsoleVariable* GiMethodVar = IConsoleManager::Get().FindConsoleVariable(TEXT("r.DynamicGlobalIlluminationMethod"));
    IConsoleVariable* ReflectionMethodVar = IConsoleManager::Get().FindConsoleVariable(TEXT("r.ReflectionMethod"));
    IConsoleVariable* ForceLumenSceneVar = IConsoleManager::Get().FindConsoleVariable(TEXT("r.Lumen.ForceLumenScene"));

    if (GiMethodVar && ReflectionMethodVar)
    { 
        int32 GiMethod = GiMethodVar->GetInt();
        int32 ReflectionMethod = ReflectionMethodVar->GetInt();

        // Di UE 5.8, jika GI bernilai 0 (None) dan Reflection bernilai 1 (Lumen), reflections akan fallback ke SSR.
        if (GiMethod == 0 && ReflectionMethod == 1)
        { 
            UE_LOG(LogTemp, Warning, TEXT("[LumenChecker] Warning: Lumen GI is disabled, but Lumen Reflections are active. UE 5.8 forces SSR fallback in this state."));

            if (ForceLumenSceneVar)
            {
                // Mitigasi fallback dengan memaksa Lumen Scene untuk diperbarui
                ForceLumenSceneVar->Set(1, ECVF_SetByCode);
                UE_LOG(LogTemp, Log, TEXT("[LumenChecker] Applied CVar workaround: r.Lumen.ForceLumenScene set to 1."));
            }
        }
    }
}

Component ini dapat dipasang pada game state utama atau initialization actor Anda. Saat game dimulai, script akan memeriksa apakah pengaturan proyek cocok dengan konfigurasi yang bermasalah. Jika cocok, script akan mengatur r.Lumen.ForceLumenScene ke 1 secara programatis. Ini menginstruksikan renderer untuk mempertahankan Surface Cache meskipun sistem global illumination tidak memintanya, sehingga reflections Anda tetap berfungsi sepenuhnya.

Workaround Manual dan Perbaikan Source Code Engine

Bagi developer yang tidak ingin mengeksekusi script C++ saat runtime untuk mengubah console variables, ada dua metode utama untuk mengatasi fallback ini: memodifikasi file konfigurasi secara langsung atau melakukan patch pada source code engine. Kedua pendekatan ini valid tergantung pada apakah Anda menggunakan Unreal Engine versi launcher atau custom source build.

Workaround 1: Override Konfigurasi via Console Variables

Jika Anda menggunakan Unreal Engine 5.8 versi Epic Games Launcher, Anda tidak dapat memodifikasi kode engine secara langsung. Sebagai gantinya, Anda harus memaksa engine untuk menjaga Lumen Scene tetap aktif menggunakan file konfigurasi. Buka direktori proyek Anda dan navigasikan ke Config/DefaultEngine.ini.

Di bawah kategori [/Script/Engine.RendererSettings], tambahkan baris berikut:

r.DynamicGlobalIlluminationMethod=0
r.ReflectionMethod=1
r.Lumen.ForceLumenScene=1.Lumen.Reflections.AllowWithoutGI=1

Mengatur r.Lumen.ForceLumenScene ke 1 meng-override optimization pass pada rendering pipeline yang menandai Lumen Scene sebagai tidak digunakan saat GI dinonaktifkan. Hal ini memaksa engine untuk mengalokasikan memori GPU yang diperlukan dan compute passes untuk membangun serta memperbarui Surface Cache cards. Meskipun cara ini memulihkan reflections, perlu diingat bahwa langkah ini akan sedikit meningkatkan GPU base pass cost Anda dibandingkan dengan UE 5.7, karena engine sekarang melakukan pembaruan ini tanpa konteks optimasi yang dimilikinya pada versi sebelumnya.

Workaround 2: Memodifikasi Source Code Engine

Jika Anda mengompilasi Unreal Engine 5.8 dari source, Anda dapat melakukan patch pada bug tersebut langsung dari sumbernya. Penyebab utama dari regresi ini terletak di dalam FDeferredShadingSceneRenderer::InitLumenScene, yang berada di file rendering privat engine (Private/Lumen/LumenScene.cpp). Di UE 5.8, pemeriksaan bersyarat yang menentukan apakah Lumen Scene diperlukan telah dioptimalkan, namun secara tidak sengaja melewatkan pemeriksaan pengaturan reflection.

Untuk memperbaikinya, buka LumenScene.cpp dan cari tempat di mana bNeedLumenScene didefinisikan. Kode yang bermasalah dan hasil perbaikannya terlihat seperti ini:

- // Pemeriksaan bermasalah di UE 5.8 yang mengabaikan pengaturan reflection
- const bool bNeedLumenScene = Scene->DynamicGIProjectSetting == EEDynamicGlobalIlluminationMethod::Lumen;
+ // Pemeriksaan yang diperbaiki untuk memulihkan kompatibilitas reflections-only
+ const bool bNeedLumenScene = Scene->DynamicGIProjectSetting == EEDynamicGlobalIlluminationMethod::Lumen || Scene->ReflectionProjectSetting == EEReflectionMethod::Lumen;

Setelah memodifikasi baris ini, rebuild engine Anda. Perubahan ini memulihkan logika pipeline persis seperti yang digunakan di UE 5.7, memungkinkan renderer menginisialisasi Lumen Scene kapan pun Lumen reflections dipilih, terlepas dari metode Global Illumination yang digunakan. Ini adalah cara terbersih untuk menyelesaikan masalah ini, karena menghindari eksekusi override CVar yang dapat membingungkan anggota tim atau mengotori file konfigurasi Anda.

Dampak Lanjutan: Client Frame Spikes dan Multiplayer Desync

Meskipun bug grafis sering dianggap sebagai masalah visual yang terisolasi, efek sekunder dari bug tersebut dapat merembet ke seluruh arsitektur game Anda. Ketika developer menemui bug ini, reaksi awal mereka sering kali adalah mengaktifkan kembali Lumen GI untuk memulihkan reflections. Namun, menambahkan beban kerja GPU sebesar 4 ms hingga 6 ms pada client dapat menyebabkan penurunan frame rate yang parah, yang berpotensi memicu masalah multiplayer desync.

Dalam game multiplayer, simulasi fisika dan pemrosesan input pemain sangat terikat dengan frame tick rate pada client. Ketika client mengalami rendering stall yang tiba-tiba—seperti reflection pass yang membebani GPU secara berlebih saat kamera berputar—simulation frame time milik client akan melonjak (spike). Keterlambatan ini dapat menyebabkan paket jaringan dikirim terlambat atau diproses di luar urutan, yang menghasilkan lag yang terlihat dan server corrections. Untuk mencegah performance spikes ini merusak kenyamanan bermain multiplayer game Anda, silakan baca panduan kami tentang how to fix player location desync in UEFN and Unreal Engine multiplayer.

Selain itu, masalah rendering ini menyoroti pentingnya memisahkan pengaturan grafis client-side dari logika server. Headless dedicated servers tidak boleh melakukan kompilasi atau memuat rendering pipelines, material, atau post-processing volumes. Saat mengompilasi file executable server Anda, kegagalan untuk menghapus (strip out) aset-aset ini akan mengakibatkan ukuran memori membengkak (bloated memory footprint) dan waktu startup yang lambat, yang dapat menurunkan tingkat respons matchmaker. Untuk panduan mendalam tentang optimasi build server Anda, baca artikel kami tentang how to master Unreal Engine dedicated server asset stripping.

Mengatasi Configuration Overhead dengan horizOn

Mengatasi rendering bugs seperti unreal engine 5.8 lumen reflections bug di mesin lokal Anda barulah setengah dari perjuangan. Begitu game Anda dirilis, Anda harus mengelola profil grafis, console variable overrides, dan pengaturan engine di ribuan konfigurasi PC client yang berbeda. Melakukan hardcoding CVar di konfigurasi lokal berarti jika regresi rendering lainnya ditemukan dalam update minor engine, Anda harus melakukan kompilasi, pengemasan (packaging), dan mendistribusikan patch yang sepenuhnya baru kepada basis pemain Anda.

Overhead manajemen konfigurasi inilah yang membuat horizOn menjadi tool yang sangat berharga bagi game developer. Alih-alih memaksa Anda mengirimkan pembaruan client game yang besar hanya untuk menyelesaikan masalah rendering, platform kami memungkinkan Anda mengelola pengaturan game secara dinamis dari backend yang tersentralisasi. Menggunakan layanan remote configuration milik horizOn, Anda dapat menentukan profil target untuk konfigurasi hardware yang berbeda dan memperbaruinya secara real-time.

Sebagai contoh, saat pemain memulai game Anda, client dapat mengirimkan query ke backend dengan menyertakan detail tentang GPU dan versi engine yang terdeteksi. Server akan mengevaluasi data ini berdasarkan aturan konfigurasi Anda saat ini dan mengembalikan daftar CVar yang dioptimalkan. Jika pemain menjalankan UE 5.8 pada kartu grafis kelas menengah (mid-range), backend akan mengirimkan r.Lumen.ForceLumenScene=1 secara dinamis. Hal ini membuat reflections tetap berfungsi dengan sempurna tanpa memaksa Anda menulis dan memelihara profil client-side yang rumit atau merilis patch darurat.

Best Practices untuk Mengonfigurasi Lumen dalam Produksi

Saat merilis game yang menggunakan Lumen reflections atau global illumination, mengikuti proses QA yang terstruktur akan mencegah regresi visual sampai ke tangan pemain. Berikut adalah empat best practices yang dapat Anda integrasikan ke dalam development pipeline Anda:

  1. Automate GBuffer Checks: Bangun pengujian otomatis (automated tests) dalam CI/CD pipeline Anda yang menangkap gambar viewport menggunakan flag rendering tertentu. Gunakan tes ini untuk memverifikasi bahwa reflection channel berisi data ray-traced yang valid alih-alih fallback ke screen space kosong.
  2. Decouple GI and Reflections during Optimization: Uji game Anda dengan GI dinonaktifkan dan Lumen reflections diaktifkan. Langkah ini memungkinkan Anda mengevaluasi peningkatan performa dari solusi baked lighting pada sistem berspesifikasi lebih rendah (lower-end) dengan tetap mempertahankan specular highlights yang glossy.
  3. Execute CVar Validations at Startup: Implementasikan script validasi runtime yang memeriksa status dari console variables seperti r.DynamicGlobalIlluminationMethod dan r.ReflectionMethod selama fase loading awal game, memastikan variabel-variabel tersebut tidak memicu fallback.
  4. Use Dynamic Client Profiles: Hindari melakukan hardcoding pada presets grafis di dalam biner proyek Anda. Gunakan dynamic configuration tools untuk menyesuaikan variabel render secara langsung (on the fly), memungkinkan Anda merespons regresi engine dengan segera tanpa harus meluncurkan pembaruan client secara penuh.

Siap untuk menyederhanakan manajemen konfigurasi game Anda dan men-deploy dedicated servers yang stabil? Daftar ke horizOn hari ini atau baca dokumentasi developer kami untuk mempelajari cara mengintegrasikan pembaruan pengaturan dinamis ke dalam pipeline Unreal Engine Anda.


Sumber: UE 5.8 Release - Lumen Reflections not working unless Lumen GI enabled