Game Development 10 min read

Why Mobile IBL Looks Different: Solving Split‑Sum Artifacts and Prefilter Issues

This article examines the visual gaps between mobile IBL lighting using Split Sum Approximation and Substance Painter results, analyzes reflection direction corrections, details Prefilter map generation techniques, and proposes solutions for high‑frequency aliasing on low‑roughness surfaces.

Kuaishou Large Model
Kuaishou Large Model
Kuaishou Large Model
Why Mobile IBL Looks Different: Solving Split‑Sum Artifacts and Prefilter Issues

1. Rendering Effect Comparison

The previous article showed that real‑time rendering in a 3D engine can closely match Substance Painter (SP) results, but noticeable differences appear when using only IBL lighting with an HDR environment map. The left image shows SP rendering, while the right image displays the engine result using three‑order SH, a 7‑level mipmap prefilter map, and EnvBRDFApprox.

Increasing roughness reveals subtle high‑frequency lighting differences; the Split Sum Approximation on the right appears blurrier and darker, likely due to n==v assumptions or mipmap interpolation errors.

2. Reflection Direction Correction

Lagarde (2014) introduced an empirical correction to mitigate errors from the assumed view‑normal equality. The following shader function implements the correction:

<code>float3 getSpecularDominantDir (float3 N, float3 R, float roughness) {
    float smoothness = saturate(1 - roughness);
    float lerpFactor = smoothness * (sqrt(smoothness) + roughness);
    // The result is not normalized as we fetch in a cubemap
    return lerp(N, R, lerpFactor);
}</code>

Because the engine uses EnvBRDFApprox (Lazarov 2013) to estimate the BRDF, additional errors arise, and the correction may have limited impact for our use case.

3. Prefilter Map Generation

We store the Prefilter map as a cubemap. To conserve bandwidth on mobile, the base texture resolution should be as low as possible while preserving detail at low roughness for clear specular reflections. UE4’s heuristic for mapping roughness to mip level is used:

<code>#define REFLECTION_CAPTURE_ROUGHEST_MIP 1
#define REFLECTION_CAPTURE_ROUGHNESS_MIP_SCALE 1.2
half ComputeReflectionCaptureMipFromRoughness(half Roughness, half CubemapMaxMip) {
    // Heuristic that maps roughness to mip level
    half LevelFrom1x1 = REFLECTION_CAPTURE_ROUGHEST_MIP - REFLECTION_CAPTURE_ROUGHNESS_MIP_SCALE * log2(Roughness);
    return CubemapMaxMip - 1 - LevelFrom1x1;
}</code>

When the mip level is 0 (highest resolution), a higher‑resolution source yields a larger maximum mip count, allowing smaller roughness values to retain sharper reflections.

By designing a curve that passes through the origin, we ensure that at mip 0 the generated roughness is near zero, producing a clear mirror‑like reflection.

4. IBL Highlight Aliasing

Higher‑precision HDR images expose severe aliasing in IBL highlights, especially at very low roughness where the reflection direction (R) changes abruptly. Traditional anti‑aliasing smooths the effect, but we first identify regions with large R jumps and compute a new roughness that lowers high‑frequency content.

The resulting smoothing dramatically improves visual quality without affecting the Fresnel term, as shown in the side‑by‑side comparison.

References

https://google.github.io/filament/Filament.html

https://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_slides.pdf

https://zhuanlan.zhihu.com/p/149217557

game developmentIBLMobile RenderingSplit Sum ApproximationPrefilter Maps
Kuaishou Large Model
Written by

Kuaishou Large Model

Official Kuaishou Account

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.