Author Topic: Dark colors look washed out in the 3D viewport  (Read 254 times)

I am currently working on a project where I need high color accuracy in a real-time engine. My workflow is based on some polarized scans, which I am converting to basecolors and rendering them through the default physically_metallic_roughness shader in Substance Designer's 3D view. The problem I am having is with the reproduction of dark color ranges in the 3D viewport, which is really baffling as lighter colorways display just fine - once they are above a certain luminosity treshold. The most obvious thing that I noticed happening is that the base specular level is interfering with the darker colors making them look faded as the saturation is being washed out by the overall reflectivity. I need to mention that all these basecolors are governed by the PBR sRGB ranges (30-240) and the F0 linear value is 0.4 as the material type is plastic; the lighting conditions are the same and involve a neutral studio HDRI map. Any ideas of how to make these look as their physical sample counterparts and have those darker hues come through?

Below there are 2 examples visualized in the same circumstances, same core maps, only the basecolors are changed (the 2D view in the right side is a preview of the polarized scan, as I am trying to match that):




The bright result probably comes from the f0 driven by the specularLevel.

Our PBR shader follows in most part the Disney model, which has a fresnel component where the f90 (reflection at grazing angle) is always 1. That's probably what you are observing here.
You can indeed control the f0 using the specularLevel but there is no control over the f90.

So, in regard to the shading model and the lighting conditions, the result you get is probably what you are supposed to get.

Keep in mind the end result highly depends on the HDRi you use, so it's better to test your material in various lighting conditions.

Some of the studio HDRi contain very large area lights, which produce a very soft/uniform lighting and it definitely affects how the material is perceived.

Edit: here is an example with a 0.1 specularLevel, 0.5 roughness and the tomocco_studio HDRi

Last Edit: July 23, 2020, 03:00:25 pm
Product Manager - Allegorithmic

Thank you for your fast response.

I am fine with the F90 fresnel as overriding that would most probably break the energy conservation principle. I am just wondering the same for the F0. Trying to mimic the physical material by altering the specular level below 0.5 for plastic, wouldn't that also account as breaking the PBR fundamentals?

Sorry if I misunderstood, I am just trying to figure out what is the variable that I am missing in all of this, as I am curious how would one handle the creation of materials with darker values such as 30-50 sRGB for the basecolor through the use of standard PBR maps, without fiddling with the specular level slider (metal-roughness workflow). Also, if adjusting the specular level is the most optimal solution, should I encode that information in a specular level map, for a universal rendering approach (metal-roughness specifically)? I guess that for the specular-glossiness workflow, altering the specular map would be preferable as it wouldn’t involve any extra maps.

Quote
trying to mimic the physical material by altering the specular level below 0.5 for plastic, wouldn't that also account as breaking the PBR fundamentals?

No: the default value is 0.5, which corresponds to a f0 of 4%. It's been defined as the most common f0 for dielectrics but this value has to be adapted to represents the "others" dielectrics, especially rocks, cloth, rubber...etc (I could not find an exhaustive list).

The specularLevel value will be remapped to the [0, 0.08] range as it corresponds to the maximum range that has been observed for dielectrics (by the people who defined the shading model). 0.5 will therefore become 0.04.

UE4 also have such control (with the same range afair), and it's also usually available on other uber shaders based on metal/rough but maybe behind a different name (and maybe set within a different range).

Quote
I guess that for the specular-glossiness workflow, altering the specular map would be preferable as it wouldn’t involve any extra maps.

The specular/gloss workflow we support encodes the basecolor and specular data entirely in two RGB maps. But the specular/gloss workflow we support still force the use of fresnel (100% reflection at f90). Which might not be the case for all uber shaders in the market. So it's safe to say using this workflow offers less chances to get the same result as in SD.
Product Manager - Allegorithmic

Thank you, that cleared things up for me!