For opaque objects, do you scale the diffuse result by (1-R) since that is the amount of light that enters to do "body reflectance" as real-time rendering calls it? In Real-Time rendering, for their final modified Blinn-Phong equation, they do not multiply by (1-R).
There is a large amount of misconception surrounding how the Fresnel term influences the diffuse term.
Frequently people will tell you to use F( R ) for specular and (1 - F( R )) for diffuse, but this only leads to confusion, because while it is partly true, the Fresnel function takes 2 parameters, not 1, and it is the 2nd parameter that needs attention here.
float SchlickFresnel( float _F0, float _fU ) {
return _F0 + (1.0 - _F0) * Pow5( 1.0 - _fU );
}
When calculating specular, you are interested in how much light is bounced off the surface as a result of Fresnel and into your eye, so you call this function via:
SchlickFresnel( R, VdotH )
This takes a
view (or
eye) vector and the half-vector, which makes it view-dependent.
How much is going into diffuse based on the Fresnel term has absolutely nothing to do with where the eye is. It has only to do with the angle at which the light hits the surface of the object, so diffuse uses the following call:
(1 - SchlickFresnel( R, LdotN ))
See equations 5 and 6 here:
http://research.tri-ace.com/Data/course_note_practical_implementation_at_triace.pdfThat paper also provides a correct physically based Blinn-Phong.
Any BRDF that uses a Fresnel term in the specular should also scale down the diffuse in this same manner. If this is ever omitted in the diffuse term, it is only for performance issues.
L. Spiro