"Principled v2" feedback/discussion thread

thin refraction doesn’t distort anything if the surface isn’t curved… The present distortions are due to Suzanne not being flat.

I’m fairly sure if you set the normal to incoming, all you effectively do is turn your refraction shader into a mix of a transparency shader and a “no shader”, mixed according to F0. At that point you might as well switch to that as that’s probably more efficient.

And I don’t think the roughness here is taken care of correctly, especially if you consider there could be IOR differences too (as is the case in my example above)

But anyways, that’s sorta the point: You can’t really do it fully “right” without it being built into shader nodes.


Hilarious timing, there’s mention of Thin Film.

@Jvry Just like you said, watching the changes in OpenPBR

3 Likes

Yes, nested dielectrics is high on my desired list.

No thin wall or nested dielectrics yet, but thin film iridescence has just been merged to main:

15 Likes

That’s fantastic news!

1 Like

@lukasstockner97 do you plan to add separate roughness control for Oren-Nayar or enable it when “main” roughness in Pricincipled is >1?

Diffuse roughness will be a separate control.

3 Likes

Rather than using the term “roughness” to describe diffuse roughness, I think it might be more precise and less confusing to label it “porosity”.

In the context of the Oren-Nayar model, roughness is more accurate since it models lambertian V-cavity microfacets, but I’ll have a look at what others use.

2 Likes

@lukasstockner97 do you have any ETA for thin-sheet mode?

3 Likes

Does Subsurface scatter now only show when a mesh has a volume or is closed?

Prior to Pincipled BSDF v2, it would show some sort effect on single sided meshes. But now it doesnt, am i correct?

Subsurface with Solidify ON

Subsurface with Solidify OFF

So, setting the diffuse roughness to 1.0 is the more physically accurate way of representing diffuse?

I think that in objects where you know they have porosity or micro details, yes

Roughness of 0: Represents a smooth surface using the Lambertian reflection model, ideal for materials like plastics or polished metals.

Roughness of 1.0: Represents a very rough surface using the Oren-Nayar reflection model. This is a good approximation for surfaces like drywall or fabrics.

In reality, most materials fal somewhere in between these two extremes. The ideal roughness value depends on the specific material you’re trying to represent.

Roggii, I think you might of got confused about how some parts of the Principled BSDF work (which is understandable since you have been using a custom build which changes the behaviour of the Principled BSDF a bit over the past few months)

Long explaination

The Principled now has a diffuse roughness, and “normal” roughness slider (I am ignoring subsurface roughness, sheen roughness, coat roughness, etc as it’s not relevant to this part of the conversation).

The diffuse roughness controls the roughness of the diffuse base of the Principled BSDF. This switches between the Lambertian and Oren-Nayar diffuse models based on the roughness value. Although this is only really relevant from a code and performance point of view, because a 0 roughness Oren-Nayer diffuse is equivelant to Lambertian diffuse.

The “normal” roughness value controls the roughness of the specular layer ontop of the diffuse, and the roughness of some other base materials (E.g. transmission and metallic).

Your comment seems to imply that the diffuse roughness, or the “normal” roughness controls both the diffuse and “other base material” roughnesses when they don’t.

A diffuse roughness of 0 will result in the Lambertian diffuse model being used. However, the main feature that makes something look like smooth plastic is the low specular roughness, controlled by the “normal” roughness. As for polished metal, that’s created by using a metallic base and a low “normal roughness”. When using a metallic base, the diffuse roughness option has no impact as it only impacts the diffuse base which isn’t there.

A diffuse roughness higher than 0 will use the Oren-Nayar diffuse model. Whether or not it’s a good representation for things like drywall or fabric, I don’t know. But one thing to keep in mind is that to recreate the drywall and fabric materials, you will need to adjust the “normal” roughness options to change the appearance of the specular reflections.

6 Likes

I think you need to wait for thin-sheet model for this to work or use translucent bsdf as workaround for now.

1 Like

I’ve got question regarding sheen model. I’m looking for option to control “direction of sheen strands”, so it’s possible to simulate effect attached below. Is it possible to do it somehow with normals maybe?


3 Likes

I would second this, having direction control like anisotropic rotation would be amazing!

2 Likes

Assuming it is possible by adjusting the normals, there’s a issue with that. The OpenPBR standard says that the Sheen component shouldn’t have it’s own normal input (And Cycles follows that rules with the Principled BSDF). So to adjust the normals of the sheen component in the Principled BSDF, you need to adjust the normals of the underlying layer, which could ruin the effect.

A custom OSL script can fix this issue (You can add the normal input to the sheen layer of the Principled BSDF), but that’s limited to CPU and OptiX rendering (With OptiX OSL being a bit broken at the moment, with a NVIDIA employee looking into why).

I took a look into OpenPBR specs and here is what is says:

The fuzz shading normal is assumed to inherit from that of the substrate layer, the physical picture being that the fuzz volume settles and conforms to the geometry of the substrate. The substrate is generally a mixture of coat and uncoated base. Thus physically the fuzz model should be evaluated with each of the geometry_coat_normal and geometry_normal separately (if they differ), and the final result blended according to the coat_weight. As a practical approximation, it may be more convenient and efficient to instead approximate the fuzz normal by interpolating the coat and base normal according to coat_weight.

So looks like it depends on coat normal and weight, and this is what I get when I connected normal map into coat normal slot and set coat IOR to 1.0. Left without normal map.

And here’s result with some grunge texture on simple bed model:

12 Likes