<p>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.</p>

<p>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.</p>

<p>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).<br>
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 <a href="http://people.cs.kuleuven.be/~philip.dutre/GI/TotalCompendium.pdf" rel="nofollow">Global Illumination Compendium</a>, 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.</p>

<p>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 <a href="http://www.farbrausch.de/~fg/stuff/phong.pdf" rel="nofollow">this short article</a> 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.</p>

CC BY-SA 3.0
2015-10-17T16:53:08.640Z
That is indeed a much better test. Actually, the Phong normalization I implemented is indeed based on Global Illumination Compendium 31a. It works out to be a 1D table which you precompute to any desired resolution for each BRDF.

The other normalization term produces much weaker results, as might be expected in this glancing reflection case. I'm also trying to solve it myself--a similar 1D table approach should be possible.
geometrian
CC BY-SA 4.0
2023-01-17T22:39:42.913Z
Just a quick note since this is the top result for Phong normalization: I actually improved the Global Illumination Compendum 31a result from Arvo for both the original and modified Phong BRDFs, and it can now be computed in constant-time with simple code (no approximations or tables); see "Constant-Time Energy-Normalization
for the Phong Specular BRDFs": [https://graphics.geometrian.com/research/normalize_phong.html](https://graphics.geometrian.com/research/normalize_phong.html). A similar result for Blinn–Phong, alas, remains elusive.
geometrian
CC BY-SA 3.0
2015-10-17T09:22:33.657Z
2015-11-03T15:18:17.490Z
2015-11-03T15:18:17.490Z
Benedikt Bitterli
<p>I am trying to sample from the Blinn-Phong BRDF.</p>

<p>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 <code>30000</code>:</p>

<p><a href="https://i.sstatic.net/R3uLF.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/R3uLF.png" alt="Phong"></a></p>

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

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

<p><a href="https://i.sstatic.net/xKlyz.png" rel="nofollow noreferrer"><img src="https://i.sstatic.net/xKlyz.png" alt="Blinn-Phong"></a></p>

<p>As you can see, a substantial portion of energy is lost.  The normalization term I am using comes from <a href="http://www.thetenthplanet.de/archives/255" rel="nofollow noreferrer">here</a> and is $\frac{n+1}{2 \pi}$.  The problem is this is a <em>normalization</em> term, not a <em>conservation</em> term.</p>

<p>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.<sup>1, 2</sup></p>

<p>My question:</p>

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

<hr>

<p><sub>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).</sub></p>

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

<p><sub><sup>2</sup>Indeed, I had to derive the Phong conservation term myself.</sub></p>

<raytracing><brdf>
Energy Conservation for Blinn-Phong BRDF
geometrian
# Energy Conservation for Blinn-Phong BRDF

(Asked by: username_0 on 2015-10-16)

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`:

[![Phong](https://i.sstatic.net/R3uLF.png)](https://i.sstatic.net/R3uLF.png)

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):

[![Blinn-Phong](https://i.sstatic.net/xKlyz.png)](https://i.sstatic.net/xKlyz.png)

As you can see, a substantial portion of energy is lost. The normalization term I am using comes from [here](http://www.thetenthplanet.de/archives/255) 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:

1. Is there a version that conserves all energy exactly?
2. 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.

**Tags:** raytracing, brdf


---

## 1 answers

### Answer by username_1 on 2015-10-17. Score: 9 | Accepted answer

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](http://people.cs.kuleuven.be/~philip.dutre/GI/TotalCompendium.pdf), 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](http://www.farbrausch.de/~fg/stuff/phong.pdf) 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.

> **Comments:**
> **username_0**: That is indeed a much better test. Actually, the Phong normalization I implemented is indeed based on Global Illumination Compendium 31a. It works out to be a 1D table which you precompute to any desired resolution for each BRDF.  The other normalization term produces much weaker results, as might be expected in this glancing reflection case. I'm also trying to solve it myself--a similar 1D table approach should be possible.  
> **username_0**: Just a quick note since this is the top result for Phong normalization: I actually improved the Global Illumination Compendum 31a result from Arvo for both the original and modified Phong BRDFs, and it can now be computed in constant-time with simple code (no approximations or tables); see "Constant-Time Energy-Normalization for the Phong Specular BRDFs": [https://graphics.username_0.com/research/normalize_phong.html](https://graphics.username_0.com/research/normalize_phong.html). A similar result for Blinn–Phong, alas, remains elusive.  

---

