I´m trying to implement a microfacet BDRF with GGX density function in my renderer. I have read almost all the papers out there in the last week, and I have a bunch of equations that should work fine, but I think they don´t. My problem is that the normalized functions of the BDRF are returning specular values way over 1:
I´m using Schlick's approximation for the fresnel term, the only one that is returning values in the range [0-1]:
F = oSpecular + ( 1.0 - oSpecular ) * ( 1.0 - L.H )^5 ;
The normalized GGX distribution function with a being the roughness:
D = a^2 / ( PI * N.H^2 * ( a^2 - 1.0 ) + 1.0 )^2
The Geometric factors I´m using:
G1 = 1.0 + sqrt( 1.0 + a^2 *( ( 1.0 - N.L^2 ) / ( N.L^2 ) ) ) ; G2 = 1.0 + sqrt( 1.0 + a^2 *( ( 1.0 - N.V^2 ) / ( N.V^2 ) ) ) ;
And the full BDRF:
nSpecular = D * F * G1 * G2 / ( 4.0 * N.L * N.V )
I have seen this setup used widely. But even with the N.L factor it returns values over way 100.0 in the hotspot of the light reflection. I have tryed other Geometric terms with no luck. The BDRF is always overburned. It seems that I´m missing some important point here. Any idea?
Thanks for the answer. So for area lights using representative points energy conservation is only an aproximation, wich explains why with low intensity lights the reflection can be still a lot brighter than the light source itself, wich is a pitty, and does not look right at all. I will try to look for another method. Any suggestion?
Returning to the original question about point lights with GGX and energy conservation, there is a thing I´m still missing. As the NDF returns a density probability function, wich can have values way over 1, that means that you can´t use the value as returned from the NDF directly in the shader, can you? As the specular component is later multiplied by the light source power, it should be really in the range 0-1, or you will have specular reflections 400 times brighter than the light source itself, with has no sense. Tell me only about one real life situation when a reflection in a dx returns 400 more energy than it receives and we can do business. The density probability function should be weighted or interpreted somehow to return it to a propper 0-1 range? If so, why nobody does that?