AcademySoftwareFoundation / OpenPBR

Specification and reference implementation for the OpenPBR Surface shading model
Apache License 2.0
425 stars 18 forks source link

Splitting specular_color between dielectric tint and metallic edge color #78

Open lukasstockner opened 1 year ago

lukasstockner commented 1 year ago

Currently, the specular_color parameter serves two purposes: It acts as a multiplier on top of the Fresnel term for the dielectric reflection, and it acts as the F82 parameter for the metallic component.

I'm not sure if this is a good idea, since these two purposes seem quite different to me:

portsmouth commented 1 year ago

The Fresnel multiplier affects all angles, while the metallic parameter only affects near-grazing angles

Sharing the parameter makes it impossible to create a half-metallic material which matches a real metal, but doesn't tint the dielectric reflection (of course, this sort of half-metallic half-dielectric material is not really physical, but users will do it anyways)

That sharing is a legacy of Standard Surface. I guess the idea was that the base substrate is a mixture of metal and dielectric, both of which produce a specular lobe (due to the metallic or dielectric Fresnel, respectively).

I do agree that it's potentially confusing that specular_color specifies the F82 grazing edge tint of the metallic lobe (with F0 specified by base_color), while specular_color specifies the tint of the dielectric lobe applied at all angles.

Arguably this overloading of meaning is reasonable to sacrifice some precision/expressivity for simplification of the parameter set. We also do this overloading for base_color, which controls the diffuse lobe albedo and the metal F0.

Your example of a mix of metal and dielectric would come up practically in cases where one is blending from a metallic region to a dielectric region, e.g. modelling flaky metallic paint on shiny plastic. Then if the plastic has the default white specular_color but the metal doesn't, currently artists would need to manually blend the specular_color using the metalness weight otherwise the plastic areas would look wrong with non-white highlights.

The Fresnel multiplier is a non-physical tweak, while the metallic parameter models a physical effect

In #66, Brecht notes that these more non-physical / artist-driven effects are referred to as "tints" in Blender, to distinguish from physical parameters.


So a tentative proposal is to have:

This then:

but at the expense of adding two new parameters.

Though note the F0 of metals will depend on both base_color and specular_tint (probably just the product of the two, depending on how this is implemented).

portsmouth commented 6 months ago

Probably not doing this, suggest to close.