Energy Conservation for Blinn-Phong BRDF I am trying to sample from the Blinn-Phong BRDF.

For testing, I use a spherical light source (Lambertian emission) sitting on a specular plane.  Here's a reference image using energy-conserving Phong with exponent 30000:



Notice that no energy is lost.  I would now like to achieve the same thing for Blinn-Phong.

Here's my attempt (same exponent, but on Blinn-Phong BRDF):



As you can see, a substantial portion of energy is lost.  The normalization term I am using comes from here and is $\frac{n+1}{2 \pi}$.  The problem is this is a normalization term, not a conservation term.

I believe this is the expected result.  It is common in graphics to make BRDFs reflect less than the input amount of energy, as opposed to exactly the right amount, as this is usually less difficult.1, 2

My question:


Is there a version that conserves all energy exactly?
Iff not, can someone at least confirm this is expected?




N.B. I am fairly confident this is not a ray generation/PDF issue.  These images were importance sampled using a method given in the PBRT book pg. 695 - pg. 699.  Moreover, a non-importance sampled version looks very similar (though I had to use a lower exponent to get it to converge fast enough, and it still took 10,000 s/p).

1This can be argued from a shadowing/masking argument on microfacets.  Unfortunately, it ignores multiple scattering.  The correct answer is somewhere in-between.

2Indeed, I had to derive the Phong conservation term myself.
First off, this is probably not the best way of testing energy conservation, because not all incident inclinations are visible in the image. Most of the environment is also black, so a less "peaky" BRDF such as Lambert would come out very dark with no way of telling whether it's energy conserving or not.

What is more commonly used is a so-called "furnace test", where you place a single sphere into a white environment map. When you render this sphere using the BRDF of interest, it should blend into the environment perfectly if the BRDF is energy conserving (make sure no color channels are clipping). Because it is a sphere, you will be able to see the BRDF at all incident inclinations. Additionally, the sphere is convex, so lacking any other objects in the scene, no reflected ray will be occluded, and every pixel of the sphere in the image will be an integral over the BRDF at a different inclination.

If you did this test, you would also notice that your Phong BRDF is most likely not energy conserving. The commonly used normalization term of $\frac{n+1}{2 \pi}$ (or $\frac{n+2}{2 \pi}$, depending on who you ask) only holds at normal incidence. At other inclinations, and particularly at grazing angle, up to half of the reflected rays will land below the surface and are usually terminated (because transmitting through a reflective surface does not make sense).
The correct normalization term that accounts for the part of the Phong lobe that is clipped below the hemisphere is very difficult to compute. Jim Arvo derived a closed-form solution for integer exponents using double-axis moments, summarised in the Global Illumination Compendium, paragraph 31a) and 31b) (page 17/18). These formulas are not very practical for use in a renderer though and I don't suggest implementing them.

It should be clear that if a simple model such as Phong is already this difficult to normalize, then Blinn-Phong is even more difficult. First of all, the $\frac{n+1}{2 \pi}$ normalization term you mention is only correct if you use Blinn-Phong as a microfacet distribution inside a full microfacet BRDF (e.g. Torrance-Sparrow or Walter). If you directly use the Blinn-Phong BRDF, then a more correct normalization term is $\frac{(n+2)(n+4)}{(8 \pi 2^{-n/2} + n)}$, derived in this short article by Fabian Giesen (second page) and also listed on the page you mention. However, this normalization term is again only correct at normal incidence and will not be exact at other inclinations. From what I can tell, no exact normalization term exists.