Specular in Principled BSDF is (still) broken?

The Specular parameter is pretty much useless at there is no way to ‘fade’ it properly.
Here a comparison between Cycles and Arnold:


The only workaround I have is to plug a value and a gamma with 2.0 behind it into the specular slot - then it behaves more or less ok.

I can only assume that this strange response curve is actually ‘correct’ if you feed in specular maps, but as a direct input value it is quite useless.

Any thoughts?

2 Likes

Seems like it has the same issue that roughness used to have: it’s not internally set to the power of 2.
But this would also mean that the current default 0.5 value is way too high, since if set to the power of 2 it would be 0.25. Is it? I mean what is 0.5 in arnold compared to blender?

One more test with very steep angles - something seems off here

Arnold looks to be cheating? It should not be uniformly colored?

What are you expecting to get from specular? In PBR it is not quite the same as “specular workflow” specular.

Also I know that specular in PBR is treated differently from app to app.

Arnold as a comparison might not be fair. I think Renderman might be a closer comparison.

Just thoughts. Can’t really test anything at the moment.

Does it differ from the paper it is based off of?


The specular 0 is a special case and not part of any interpolation. In Luxcore it’s not even implemented.

I expect an artist friendly and intuitive response to moving sliders.
I know the math (more or less), but it does not help if the math is correct and the sliders useless.

It is user friendly, and it is an artistic control. Between 0.25 (1.33 water) and 0.75 (1.65 some glass types) you’re in the plausible IOR range of what a dielectric material can be, and in a fairly linear fashion which is easy to control.

Principled is a pre-set shader to make plausible normal materials, and if keeping values reasonable will not break physics - it’s NOT to create all materials you can think of. It’s second purpose is a fast audit of textures to be used within PBR metallic workflow based game engines, and for good or bad it has to match those specifications pretty closely - usually the reference specification from Disney.

What is it you’re trying to achieve? I have a suspicion relying on another node setup mixing shaders is the way to go if you’re trying to make something special. Apart from diffuse exit IOR, diffuse roughness implementation, and sheen, all other effects can be made mixing other shaders. I sometimes use Principled only to get access to these exotic features (usually sheen, which has some problems of its own).

2 Likes

When you look at the very first top left image (specular 0.01) - imagine its a about some polished tile floor, and now the client or whoever says - ‘can you make that a bit less reflective, its too strong’ - it becomes a problem as we are already at 0.01

I myself have not a problem with it at all - i can set up my own graphs easily. Its more that i teach blender - and would be happy if the built-in defaults allow for a wide range of control, to not introduce custom solutions for simple problems.

I understand that it actually is correct, and would break pbr worflows if changed, but I also think having three parameters as for example arnold has, would be a way to go.
So having Weight / Specular / Roughness. Weight would be on top and while left at 1.0 would not interfere with any pbr workflow.

For controlling shininess why not leave speculator at default and alter your roughness setting? The principled
node is for metallic roughness workflow.

3 Likes

I’d select the principled node (with spec 0.5 for most dielectrics), ctrl+shift+d to duplicate with connections, then ctrl+shift+right drag them to mix them together. For one of them set specular to 0 and adjust/control the specularity using the mix factor.
Or set it up manually; would look something like this using vanilla Diffuse, basic rough fresnel, and none of the fancy stuff from Principled:


That is similar to Specular portion of the Arnold controls, although I’m not an Arnold user so I can’t verify. If you teach Blender, you should also teach the principles of shading and not limit the students to use Principled only. Keep in mind Principled is not as energy conserving as it should be, and using it for improbable materials may lead to improbable and problematic results.

1 Like

You can do it in Blender.It looks a bit overkill, but if you need your principled workflow this is the solution.
Notice that everything you are change in one of the principled shader,must be changed or connected in the other too,if that makes sence.
Only the 0 specular should be left as is, and the IOR converting nodes in the other spec input for a IOR input workflow.
Now you can Weight the specular like in Arnold,here for example with 0.01 in the mix shader.

1 Like

I’d expect a teacher worth her/his salt to go through(together with students) creating a node group equivalent to the principled BSDF and then have a resource to experiment with and tweak. Thus leaving the students capable of problem solving more esoteric cases.

Don’t get me wrong, it’s fine to start with the principled node as a basis first, to understand the most basic concepts, but one should not assume that it can cover all possible cases every time.

For the future, I’d like to see Cycles approach MaterialX and the new enclosures it encompasses, with “old” nodes (including principled) prefixed with Leg(acy) or something. I believe game engines will start adopting this method as well pretty soon if they haven’t started embracing it already. While a different approach to Principled all-in-one, it enforces proper chaining and mixing, and plausible outcomes that conserves energy (some new shader nodes needed, old ones modified). Maybe making Blender MaterialX compatible would be something to consider for Blender 3.0?

1 Like

“Principled BSDF” limit the values automatically, because Principled BSDF dees not want produce non-physically correct results. If you want use setup freely, you must create your own node setup.

And, two render engine are different. You never produce same result with two render engine.

If you want use setup freely and physically correct, then you can use Vshade.

Yes, i think you are right.Materialx is Opensource and uses for Colormanagment OpenColorIO which is opensource too.And is supported by NVidia with MDL,Pixar USD and more.

I am curios,that the most wanted updates for the Principled shader are allready done by Disney 2017.And i wonder why these updates don’t came to Cycles Principled or single shader.

Well, I don’t think even the GTR issue has been fixed yet (topcoat lobe roughness).

It does already produce non-physically correct results. Just try it in a furnace test.

Exactly as possible as. Principled PBR never can produce 100% physically correct results. An example, Fresnel always be a problem when increase roughness. And if you use some non-pbr parameters, then this will broke.

In Principled PBR, Specular and IOR values are automatically limited in the code.

From “Blender Manual”:

Specular:

Amount of dielectric specular reflection. Specifies facing (along normal) reflectivity in the most common 0 - 8% range.

To compute this value for a realistic material with a known index of refraction, you may use this special case of the Fresnel formula: specular=((ior−1)/(ior+1))2/0.08specular=((ior−1)/(ior+1))2/0.08

For example:

  • water: ior = 1.33, specular = 0.25
  • glass: ior = 1.5, specular = 0.5
  • diamond: ior = 2.417, specular = 2.15

Since materials with reflectivity above 8% do exist, the field allows values above 1.

I created VSHADE system for this reason. For easy use, non-limited and can produce physically correct results.

Spec 0.5 with roughness 0.5 is ok. Set roughness to 0 or 1 and the rim becomes brighter than the surroundings in a furnace test. This is with default base color at 0.8, 0.8, 0.8. Using base color 1, 1, 1 no roughness will survive a furnace test. Using filmic that allows >white, it is easy to observe that a sphere reflects more light than it receives. If Principled was energy conserving like a manual setup can be, the sphere should be the exact same color as the background white (if sphere is white) if all the shading terms conserves energy and are mixed correctly. That said, it’s not something I consider a critical thing, but nice to be aware of. This flawed behavior is noted in the original 2012 papers.

1 Like

When roughness increase, still edges look brilliant, because Blender can not support roughness based fresnel. This is not physically correct. When roughness increase greater than 0.5, looks incorrect. This is GGX phenomenia. Etc. etc.

As I know, only Principled PBR fix this Fresnel issue, but GGX problem still there.

GGX Multiscatter works fine - energy conserving and no energy loss, and it’s not hard to setup roughness based fresnel - I do it in a post further up using roughness to select between incoming normal and regular normal. It was from memory and I didn’t furnace test it, but unless I screwed up it should work ok. Roughness based fresnel is not the source of Principled “problems”, Principled handles that automatically and well.

We need access to it if we need to utilize DisneyDiffuse , Sheen, and the rather uncontrollable GTR secondary lobe. I’d love to have DisneyDiffuse as an optional Diffuse setting, Sheen as an optional Velvet setting (with typical fuzz controls), and GTR (with falloff control) as an additional Glossy/Anisotropic setting.