I'm working my way through this paper about GGX-filtering environment maps:


I find myself stuck on the basics. In particular, I am confused by two statements in section 1.1, Related Work:

Most recent reflection models assume dielectric materials, and in the case of a metal would simply multiply the specular color by an auxiliary specular color map.

This sentence immediately follows an overview of old-school mirrored torus environment mapping, which it refers to as "metal". However, I'm not sure what the author means by specular color here -- incident light or material color. Likewise, what is this secondary map that is referenced. Is that the metalness map from the currently popular PBR texturing workflow? Or is "auxillary specular color map" a cubemap?

Importance sampling is inefficient for texture filtering because raster images are band-limited, which results in the peak of the function being oversampled

I don't understand this at all. I am still learning importance sampling via Peter Shirley's weekend book, so I kind of get the difference between sampling a function with infinite resolution and sampling a down sampled raster grid... but I don't know what the author means by band-limited and how that produces the peak oversampling effect.

Sorry if these questions are overly naive! I'm going to try to read (Kautz 03) now to hopefully fill in some gaps. My ultimate goal is to write the simplest possible dynamic environment mapping demo to show an after school class the connection between offline global illumination and high-end realtime rendering.

A side goal is to synthesize for myself a history of these techniques from the end of this article until today:


  • $\begingroup$ I'm hardly an expert, but when graphics articles start talking about light reflections based on dielectrics and metals, they are often talking about physically based rendering. Hope that helps. $\endgroup$
    – markspace
    Apr 27, 2017 at 17:55

1 Answer 1


Your first quote is referring to "Split-sum approximation" presented in "Real Shading in Unreal Engine 4" by Brian Karis, and also referred in the paper [Kar13]:

$$\frac{1}{N}\sum_{k=1}^N \frac{L_i(l_k)f(l_k,v)cos\theta_{l_k}}{p(l_k,v)}\approx \bigg(\frac{1}{N}\sum_{k=1}^N L_i(l_k)\bigg)\bigg(\frac{1}{N}\sum_{k=1}^N \frac{f(l_k,v)cos\theta_{l_k}}{p(l_k,v)}\bigg)$$

In split-sum approximation the incident radiance (cubemap) is pre-convolved with GGX kernel using for example importance sampling, and normal-incident specular reflectance ($F_0$ or "specular color" you refer to) is multiplied with another pre-convolved 2D look-up-texture (referred as "an auxiliary specular color map") shown below.

Split-Sum 2D LUT

Next about your second question of importance sampling being inefficient due to band-limited signal - It simply means that the incident radiance is sampled with finite resolution (cubemap resolution) and thus higher frequencies have been filtered out. But because importance sampling biases samples to important regions of the function (peak of the GGX BRDF) this region may be sampled in unnecessarily high frequency thus wasting samples.

  • $\begingroup$ Thanks! Wouldn't have guessed first quote referred to split-sum... $\endgroup$
    – user3412
    Apr 28, 2017 at 21:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.