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.
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
Kuaishou Large Model
Official Kuaishou Account
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.