Fundamentals 8 min read

Mobile IBL Rendering: Split‑Sum Approximation Comparison and Highlight Aliasing Mitigation

This article examines mobile Image‑Based Lighting (IBL) rendering, comparing Split‑Sum Approximation with Substance Painter results, analyzing high‑frequency lighting differences, proposing reflection direction corrections, detailing Prefilter map generation, and presenting solutions for highlight aliasing on mobile GPUs.

Kuaishou Tech
Kuaishou Tech
Kuaishou Tech
Mobile IBL Rendering: Split‑Sum Approximation Comparison and Highlight Aliasing Mitigation

The article introduces the challenges of using Image‑Based Lighting (IBL) on mobile devices, focusing on the visual gap between real‑time rendering and the results produced in Substance Painter. It compares the Split‑Sum Approximation method with the artist‑friendly SP workflow, highlighting differences in high‑frequency lighting and specular highlights.

It then discusses reflection direction errors caused by the n·v assumption and presents an empirical correction algorithm from Lagarde (2014). The correction is implemented with the following shader function:

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);
}

Next, the generation of Prefilter maps is described. The approach stores the Prefilter map as a cubemap and uses a heuristic function to map roughness to mip‑level, shown in the code below:

#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
    // This is done in a way such that a certain mip level will always have the same roughness, regardless of how many mips are in the texture
    // Using more mips in the cubemap just allows sharper reflections to be supported
    half LevelFrom1x1 = REFLECTION_CAPTURE_ROUGHEST_MIP - REFLECTION_CAPTURE_ROUGHNESS_MIP_SCALE * log2(Roughness);
    return CubemapMaxMip - 1 - LevelFrom1x1;
}

The article explains how the curve is calibrated so that at the highest‑resolution mip (Mip = 0) the roughness is near zero, ensuring clear specular reflections for low‑roughness surfaces while keeping texture resolution low for performance.

Finally, the problem of highlight aliasing on mobile IBL is addressed. The author proposes detecting regions with large view‑direction (R) changes and applying a custom roughness adjustment to smooth the high‑frequency components, effectively reducing jagged highlights without affecting the Fresnel term. Visual comparisons demonstrate the improvement.

The article concludes with a call for community feedback on further optimizations for mobile IBL rendering.

shaderIBLMobile RenderingPrefilter MapSplit Sum Approximation
Kuaishou Tech
Written by

Kuaishou Tech

Official Kuaishou tech account, providing real-time updates on the latest Kuaishou technology practices.

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.