Cycles Principled BSDF violating energy conservation?

Something was not behaving as expected, so i did a simple ‘white furnace test’

Fully white diffuse sphere in fully white environment. Setting the specular to anything above one results in a an image where the sphere is brighter than the background!
That should never happen, right?
Eevee is the same… so i guess it is either a flaw in the pbr definition or meant to be like that?

Setting a mix between a diffuse and a glossy does not lead to that result (but specular to zero and metallic only in principled is also fine…)

here on blenderartists there is the thread with even more questions from other users:

e.g. setting the roughness on a fully diffuse shader leads to darkening and brightening in cycles. (Not so in Arnold)

here the screenshot:

2 Likes

Don’t have Blender around to try myself atm, but I’m curious what the actual pixel values are in the rendered image for your testcase? Is the sphere full white (1,1,1) and the background something lower?

Sphere is full white, background too.
The rim goes up to 1.5 units (not color mapped). Actually it is everywhere above 1.0, center is ~1.05

IIRC ‘Specular’ is like a glossy multiplier. If you want it to be energy conserving, use the default 0.5. From reading up on it, it seems it was used by Disney artists would use it to make something look more glossy than what was ‘correct’. Does it look better with the default value?

you also get wrong results without specular. here is only diffuse with roughness:

I thought the default value was 0.5? Maybe that wouldn’t impact it, but the fact that the background is darker than the rim is indeed concerning. Base colour is 1.0, 1.0 ,1.0?

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.