Reflection Slope

Reflections are a complex matter. However we don't need to fully understand them to be able to use them in a CG workflow, after all reflection slope for example is just a single parameter we may better grasp just looking at the different results we get while tweaking it. But we can still read the following paragraphs to have some little better overall understanding; if not, just skip to where we start illustrating the power of reflection slope.

Reflections are generally defined by a certain distribution of directions (that a ray will take once hit a surface) which is part of a BRDF (bidirectional reflectance distribution function). The distribution shape is generally a bell-shaped distribution. A roughness parameter controls the distribution width. All of this goes under the term, - NDF (Normal Distribution Function). Thus being able to control an NDF shape is almost mandatory for managing more complex material appearances. The most important NDFs are Beckmann and GGX. Before GGX, Beckmann was the de facto distribution used for reflections.

These distributions are statistical distributions of normals. Statistical here means that a reflection ray will bounce regard to the (micro) normal it is supposed to hit randomly .. however being these normals distributed in a certain way (ie. bell-shaped), a ray will have more chances to bounce in a certain direction than others. Of course this direction is the reflection specular direction. If the width of our distribution tends to zero we have an almost perfect specular reflection because we've shrinked so much our bell-shaped distribution that only very few directions are possible. 

So with a width of 0 with have a single direction available while with increasing width we'll have more and more directions available around the main specular direction. This is what goes under the concept of reflection roughness. The rougher the reflection the more directions a ray can take.

Let's see how all of this can be easily visualized.

Above we've a light ray that hits a surface with a certain normal and reflect back into our view. The manually drawn pink shit ;) is our reflection lobe which is determined by a certain distribution and how wide is this distribution. If the width is zero we'd have only a single blue arrow as reflection ray. This is called a 'delta' distribution and gives back a perfect specular reflection.

When the distribution is instead wider then we have more directions allowed. Because we have many more reflections and all the lookups that belong to those are averaged in one single color this gives back to a 'rough' reflection.

It's easier to see this directly rendered. We have a visible square area light in front of three spheres. The first one has a very narrow reflection that correspond to a narrow distribution width, second and third have wider distribution widths that correspond to wider or rougher reflections (roughness here is respectively 0, 0.2 and 0.5).

Till now we have seen how the roughness parameter (which corresponds to the distribution width) influences our reflections. (Btw .. it's a physical parameter for the simple reason that semantically corresponds to a physical connotation of things .. effectively, roughness is a property we see in the physical world .. that's why we call these PBR reflections .. not because they necessarly behave like in the physical world but because they use a physical connotation to express a certain property).

We have seen initially however that we have also the shape of the distribution that could affect the rendition of a certain material. Let's see how does materialize the shape of our reflection lobe when rendered. Basically it is how the reflection is decaying. With GGX we have a smoother transition than with Beckmann .. this is also called 'reflection tail'. GGX became the de facto reflection model because it has a longer tail than Beckmann that's supposed to match more material appearances. 

The above balls has the same roughness but they have different distribution shapes. The one on the left has a Beckmann distribution, the one on the right has a GGX one. We clearly see that the GGX has a longer tail. This can be seen also as halo or hazing around the reflection and apparently better matches certain metals and has been popularized by some games that were using it to render better skins. However some (classes of) materials are better matched with a Beckmann distribution and some other even need a double reflection lobe to match the wide reflection tail. 

So, how can we control the distribution shape aka the reflection tail ? Generally, we can't. 

That's where rombo reflection nodes come to the rescue. With rombo we have a generalized NDF that can match both Beckmann and GGX distributions and all the in-between shapes and it even extends the GGX tails. (If we need even more control on the reflection tail we can opt for a specialized shader like romboReflectHazy).

For this we have just a single parameter we call, - reflection slope.

Till now it may look that the shape of the distribution of our reflection directions is just a little cosmetic that won't really influence the overall reflection appearance but as soon we give it a try we see it is really the opposite to the point that choosing one over the other may even compromise our whole metal appearance.

Look how in this case a Beckmann distribution is more effective than a GGX one. Beckmann is on the left, well contrasted and vivid; GGX on the right is too less contrasted and exhibits too much hazing for the kind of metal we're try to model here.

Because we have a generalized distribution that works with a single parameter we called 'slope' .. how to match Beckmann and how to match GGX ? Well, Beckmann is approached with high slope values like 20 while GGX is exactly at 2. If we want a longer tail ie. a more hazed reflection, we can go past 2 reaching 1.7.

This also means that in the above example we are able to match visually all the appearances between a Beckmann slope of 20 and a GGX slope of 2. In this case it mainly means we are able to control the metal contrast between the two renditions. We want it like Beckmann but a bit less contrasted .. just low down the slope parameter to 5 for example.

Below we compare Beckmann (slope value at 20) and a reflection distibution with a longer tail than GGX with a slope of 1.7. Differences are even more dramatics.

Take care that the Slope param is just an extra parameter to better refine reflections and does not interfere with a PBR workflow .. it just enhances it. 

For example, let's pretend that for this model we wanna a GGX kind of distribution for where the metal exhibits patina and a nice vibrant Beckmann style distribution for the cutting parts. We use a simple mix2colors with one slot set to 20 and the other one set to 1.7 and the same map we are using for the albedo as mixer factor.

Technically, we're approaching a spatially varying BRDF. Note that the normal map is plugged into the micronormals slot so we have a spatially varying BRDF with micronormal mapping and this is possible only with rombo tools and Arnold renderer. And you see, - it's the usual PBR workflow with super easy extra params for enhanced rendering satisfaction.

Eventually note how the metal ring on the right does exhibits patina due to the different NDFs used (driven by the albedo map in this case). Effectively we can also use a spatially varying BRDF in this way to further model things and that's an added weapon to our arsenal (together with roughness and normal maps) to shot nicer and more realistic renders.

Effectively we can use it on any model where we need a plain reflection like for dieletrics as plastic and coated stuff or for conductors like metals. When the appearance itself works good with both GGX and Beckmann we use it  visually to better control the contrast in the reflections. Below anything shiny uses an high slope (close to Beckmann) while anything rough uses a low slope (wider than GGX) for rougher reflections.

Leave a Reply