Cycles Principled BSDF violating energy conservation?

yep - all 1.0… maybe try it yourself - i can’t see what i could have done wrong…

I can see the same. :thinking:

The effect seems to be only reproducable when using ‘filmic’ color transform.

If you reduce the exposure on the standard transform you can see the same effect, it is just that in the standard transform values over 1 are clipped.

I’d have to dig it up, but if i remember correctly, the original paper from Burley introducing the principled BSDF already mentions that it’s not energy conserving. I believe the clear coat layer is also only adding energy without taking from the other layers.

Regarding the clear coat handling: Principled BSDF - Why is Clearcoat added instead of mixed in?

1 Like

5 Disney “principled” BRDF

5.1 Principles
In developing our new physically-based > reflectance model, we were cautioned by artists that we need our shading model to be art-directable and not necessarily physically correct. Because of this, our philosophy has been to develop a “principled” model rather than a strictly physical one.
These were the principles that we decided to follow when implementing our model:

  1. Intuitive rather than physical parameters should be used.

  2. There should be as few parameters as possible.

  3. Parameters should be zero to one over their plausible range.

  4. Parameters should be allowed to be pushed beyond their plausible range where it makes sense.

  5. All combinations of parameters should be as robust and plausible as possible.

3 Likes

I’ve been getting this with the default startup file for a while, regardless of the roughness and specular values. Even a buildbot build on the default scene did it! Only in the viewport though.

Maybe I have something set up wrong, not sure what that would be though.

At first I thought this was an issue with the filmic lut, but no, it seems to absolutely be an issue with the principled shader because regardless of lut in use you get wrong results. The edge of the mesh is above 1.0 rgb regardless of setup. You can use false color it’s the easiest way to check this - it’s pretty much what that lut was made for.

Diffuse and glossy shader output correctly (as far as I know).

This would explain why the edges of bricks always look so bright for instance, there’s more light being bounced than is being projected at the plane… I always found the results incorrect but never questioned why it might be - I thought I might have my bounces too high and just carried on modeling.

I was adding and removing meshes from the scene and suddenly it started rendering correctly.
The rgb range is normalized now… it’s a legitimate bug.

You are recreating the bug incorrectly.
Use a curved object. A sphere or a chamfered cube.
The outermost part of the mesh will be rendered with values above the 1.0 range.
As if there’s a fresnel node connected to the emission plug.

Well yeah, interesting.

I wasn’t really recreating the bug though, just showing that I’m having a similar problem in an even simpler situation and I thought it might be related.

What??!! adding/removing object and then, bam, Principled is ok??

No. I was probably playing around with the settings as well.
And it wasn’t really fixed. After going over the render even though it looked unifirom - as it should be - there were still overexposed pixels at the edges of the meshes, the effect was just diminished to the point I couldn’t identify it with my eyes.

can anyone reproduce this on any other engine that uses pbr or some variation of it? Vray and arnold have their own shaders which do not exhibit this behavior.
I never posted a bug report, and as @StefanW is on the thread, he maybe could do that if it really looks like a bug?

Also if the implementation is buggy, it would mean a quite radical change in render results - if it gets changed / fixed… not sure if this is even feasible until some future major release?

Arnold exhibits the same behavior.
But it seems to use Oren Nayar for the diffuse instead of Lambert so it looks less wrong.

1 Like

A strange Issue. It seems, that As you move roughness away from 0.5 in cycles, this thing happens and is most visible both at 0 and 1 roughness.

One more intresting thing:

When you change specular to 0 and have a roughness of 0 this happens. :thinking:

In Eevee everything seems to work as expected.

I mean the frenel effect is a thing (https://www.youtube.com/watch?v=CfeBz_8JBL8) and it makes surfaces, that are curved away from the camera more reflective, but the implementation in Cycles seems to have a few Bugs.

It seems like even according to Disney, this isn’t meant to be entirely physically accurate. If you want close to accurate, the specular value shouldn’t change from the default value. The energy conservation isssue is concerning though, the fresnel effect should only change the mix between specular and diffuse reflections.

what is offputting is, thjat is only happens in cycles and the effect isn’t there, when roughness is at 0.5. It only occurs when movint towards 0 or 1 roughness and at 0 specular and 0 roughness, it even makes the rims darker, so there seems to be a bug…

Specular adjusts specular reflectance at F0 for dielectrics, but despite the mapping being linear (0-1) in the UI, it correlates to something like a 2% - 8% raw value being fed into the renderer, as values outside of this range don’t exist for dielectric surfaces found in the real world. If the UI lets you go outside of 0-1, you’ll be getting physically undefined behavior so I wouldn’t be surprised to see energy conservation go out the window.

Energy should be conserved if specular stays within a linear range.

FWIW, specular is really only used in the cases of materials like water, rubies, gemstones, prisms, and other related materials. 0.5 (correlating to ~4%) is very close to correct for the vast majority of dielectrics.

Metals do not use the specular attribute. Since their specular reflectance varies by wavelength, it is controlled through the base color node.

Another note is that default GGX does lose energy at increasing roughnesses if not properly compensated. Multi-scatter GGX fixes this issue. I haven’t tested Blender to see if they are compensating for high-roughness GGX energy loss or not, but try the multi-scatter GGX if you have problems.

Edit: Just tried and regular GGX loses energy like crazy. Full metal, white env, adjust roughness to see. Use multi-scatter. Even though multi-scatter seems to lose energy as well…