Substance, Cycles, and Fresnel

I was working on some textures made in Substance Painter when I noticed some discrepancies between what I was seeing in substance and cycles. In particular, grazing angles were coming out unnaturally white using the GGX Multiscatter model.

So I decided to do some testing, and I thought I would share my results for whatever it’s worth.

The first set is using your most basic PBR metallic roughness setup:

  • Dielectric - Diffuse and glossy shader factored by default fresnel node.
  • Metal - Glossy shader with it’s color mixed between base color and white, factored by a default fresnel node.
  • Dielectric and Metal factored by a metalness texture.
  • All fresnel nodes use IOR 1.45 for simplicity.

The middle set is a direct iRay render from Substance Painter.

The third set replaces the default fresnel node with the technique described by Cynicat Pro. In my research, I’ve come to find that Cynicat is a bit polarizing. I’ve seen equal amounts of people both praising the technique, as well as saying that it’s flat out wrong.
Now I’d like to think that I’m a smart guy, but I can’t be bothered to learn about material physics. I’m an artist. I just want my stuff to work, hence the brute force method of rendering a bunch of shaders.

With all that said, I’ll let the image speak for itself, though I would like to point out that the new GGX Multiscatter reflection model looks way too unnatural. I happen to have here on my desk an object with black plastic and rubber. It looks almost identical to the ashikhmin-shirley model with the Cynicat fresnel technique (The two results at the bottom, right).

Attachments


IMO, your approach is too simplistic, too approximated for the whole range of complex materials in question, that’s why such results. Your material doesn’t absorbs & scatters any photons. Make a test based on true physical concept. At least i’ve found GGX multiscatter much better in representation of such dielectrics & metals.

edit - mind the gap :wink:
also note that PBR concept in visualizations for games is bit different than photo-realistic CGI for film, archviz, product viz… tho it’s getting smaller and smaller…

Multiscatter GGX should give more realistic results if used properly.

The reason why is that it’s a model with also takes multiscattering into account as well as single scattering (normal GGX only computes the latter). Otherwise your rough materials are too dark to be physically correct.

I don’t know what you mean by the material not absorbing and scattering. That’s the essence of color. The renders would be blank if there was no absorbing or scattering.

These shaders are based on true physical concepts. The examples are all correct approximations, and the center column is the control group direct from Substance Painter. What’s up for discussion here is not the shader, but rather, the relationship between fresnel and the various reflection models.

And simplicity is the goal. With a good approximation, you only need one metal rough shader for all materials when using Substancs (with a few exceptions). You just plug in your base color, metallic, roughness, and normal maps, which make up the DNA of any and all materials.

I would highly encourage you (and anyone who hasn’t done so) to research the metal rough workflow in regards to physically based rendering. :slight_smile:

Multiscatter GGX should give more realistic results if used properly.

The reason why is that it’s a model with also takes multiscattering into account as well as single scattering (normal GGX only computes the latter). Otherwise your rough materials are too dark to be physically correct.

Do you have any examples of what the proper usage would be?

I know Multiscatter GGX is not going to fix everything if you use the incorrect fresnal that the specific node gives you (rather it will make the issue more obvious).

To be clear, we are talking approximations here, which is a big reason why there is a lot of misinformation on the internet about PBR. It’s not that there are right and wrong methods. It’s that there are different schools of thought when it comes to how “physically based” PBR shaders should be, and how much to approximate. In the end, they are all still just approximations with various pros and cons. :slight_smile:

Now, I could have looked up IOR curves for brass, paint, and rubber in the individual red, green, and blue bands, but my goal here is not to create the most physically based shader ever made. My goal is to match Substance Painter as closely as possible for maximum consistency across the tools I use. For that reason, I’m using an average IOR of 1.45 because that is the level of approximation Substance’s metal rough shader uses. I’m still trying to find out what IOR they use, however, but I suspect they are using a similar average.

Here is my original project I am working on, which highlights (pun intended :D) the discrepancy I was referring to.

One thing I wasn’t clear on from the beginning is that although I think the ashikhmin-shirley model looks the best, I still think the GGX Multiscatter (with the fresnel roughness fix) looks closest to Substance Painter. With that said, the first row shows GGX Multiscatter with default fresnel. Second Row is Substance Painter. Third row is GGX Multiscatter with the fresnel roughness fix.


If you want results instead of fiddling with nodes try this shader :

I haven’t tested it much, but first renders came out good looking.

Fiddling is how you learn, amigo! :slight_smile:

I did some tests with the Nexus shader. The default shader (far right in image) came out too dark.

Switching it to GGX Multiscatter (3rd in image) improved the results, but it’s still slightly darker. Look closely at the dark reflections on the left rim of the brass shader. They are slightly more washed out in the Substance Painter result.

My results (1st in image) use the GGX Multiscatter model with the Fresnel Roughness Fix. It appears, to my eye, to be a closer match, though the rubber material is slightly brighter and the shading is little tighter. I’ll work on that next.


Since my results and the Nexus shader (with the GGX Multiscatter update) are close, I looked at render times.
In terms of scalability, 5 seconds is huge for this simple scene when you consider a larger project. On the other hand, the Nexus shader is doing a lot of extra work under the hood to allow for easy tweaking.

I know this all seems a bit nit-picky, but A: it’s a good learning experience, and B: I’ve been doing this for a very long time. I’ve learned that when it comes to cloning shaders between renderers, the smallest inconsistencies can really crop up on a more complex project. :slight_smile:

I decided to take a completely different approach in the spirit of exploration. I took a peak under the hood at the metal-rough MDL in Substance Designer.

Their approach uses layer weights instead of fresnel nodes. The dielectric uses an exponent of 5 to blend between 4% spec at facing and 100% at grazing. The metal uses 3, and blends between base color and white. Roughness for the diffuse BSDF is ignored.

The only difference that I still need to figure out how to adjust for is that their node setup uses a Microfacet GGX Smith BSDF where I am using the Glossy Multiscatter GGX BSDF. Theirs is a bit darker, which is why my rubber example above are coming out lighter. You can also see the lighter grazing angles below.


Attachments