If you have a dielectric (non metallic) sphere with a large roughness value (say, 0.95), and put it in a lighting environment that has a constant onmidirectional lighting value (such as 0.5) Cook-Torrance ggx PBR renderers seem to be missing a darkening at glancing angles.

I thought this was a bug in my PBR implementation at first when comparing vs a mitsuba ggx render, but I've found the same issue in google filament (https://github.com/google/filament) as well as in substance.

For instance, below is the iray version from substance compared to the opengl version from substance. 0 metalness, 1 roughness, omnidirectional ibl of 0.5, albedo of (1,1,1).

enter image description here

Is this a known limitation of cook-torrance ggx based PBR? Can anyone explain why this limitation is here, and the reason for the difference?

I've noticed that it's much closer to the path traced "ground truth" at lower roughness values (like up to around 0.5-0.75), and that the most commonly interesting roughness values are near the lower end of roughness. 0.5 even looks almost "completely rough" for instance. Is the issue that the approximations used don't really try to make these less important higher roughness values look correct?

  • $\begingroup$ it's odd to see that in substance, the IBL color is interpreted different between the path traced and rasterized version, but that's unrelated :P $\endgroup$
    – Alan Wolfe
    Commented Sep 12, 2018 at 18:35
  • $\begingroup$ couldn't that be a result of some tonemapping postprocessing step? $\endgroup$
    – ivokabel
    Commented Sep 20, 2018 at 12:45
  • $\begingroup$ Nope, it doesn't have anything to do with tone mapping or any other post processing. Verified by doing other furnace tests, and comparing between different renderers which have explicit controls for those things. $\endgroup$
    – Alan Wolfe
    Commented Sep 20, 2018 at 14:04
  • $\begingroup$ That's strange. $\endgroup$
    – ivokabel
    Commented Sep 21, 2018 at 15:18

2 Answers 2


The problem is in the diffuse term, which can be seen by making the specular portion of IBL not be added into the result. The diffuse only render will not have the darkening, and of course, the specular can't make the diffuse darker. (Note, fresnel vs no fresnel is not the issue here).

The core problem is that lambertian diffuse is being used, which is view independent. There are other view independent diffuse terms which give results closer to the ground truth.

Two example diffuse terms are Burley (Disney) and Oren-Nayar.

Burley is talked about here: https://google.github.io/filament/Filament.md.html#toc4.5

An approach used in Titanfall is described here: https://www.gdcvault.com/play/1024478/PBR-Diffuse-Lighting-for-GGX

  • 1
    $\begingroup$ it's actually unclear if this is the whole story, and some thoughts that the path traced version may actually be incorrect. there is a twitter conversation here: twitter.com/Atrix256/status/1039943676552568832 . $\endgroup$
    – Alan Wolfe
    Commented Sep 12, 2018 at 20:36
  • $\begingroup$ Burley has an entire paper about the Disney Diffuse Model: disney-animation.s3.amazonaws.com/library/… However, the Disney Diffuse BRDF is not energy conserving. This might not be a problem in the questioners case but should be mentioned. The Titanfall approach is good, but I want to add a blog post series by Stephen Hill ( blog.selfshadow.com/2018/05/13/multi-faceted-part-1) which explains a different way to handle this problem $\endgroup$
    – Tare
    Commented Sep 13, 2018 at 11:33
  • $\begingroup$ @Alan Wolfe - Although Oren-Nayar may give a closer look to the ground truth, I think the main problem is in fact the Fresnel Issue. Fresnel issue guarantees that at glancing angles, more light reflects, this would mean at glancing angles we have more specular part and very low diffuse part thus giving the black ring. Atleast that's what makes sense to me. $\endgroup$ Commented Sep 14, 2018 at 14:06

This is not related to the edge but in https://eheitzresearch.wordpress.com/240-2/ you can clearly see that energy is lost for the microfacet stuff when roughness is increased. The issue is that the rougher the surface is, the more occlusion you get from the shadowing function.

There are a few "hacks" to boost the energy. One can be found in http://www.cs.cornell.edu/projects/layered-sg14/ section 5.3. Maybe the rasterized version uses one of these "hacks" and doesn't have that issue.

Also see 5.1 here https://blog.selfshadow.com/publications/s2015-shading-course/burley/s2015_pbs_disney_bsdf_notes.pdf.


Your Answer

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.