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.
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.
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.
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?
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.