Rough Specular reduces specularity amount?

Hey folk, doing an experiment here, and I’m looking for some feedback.

Check out the following photos of a dielectric, Picture 1 is a series of red balls that are reflective and with high glossiness (low roughness).

The IOR of the surface is approx 1.3, notice how the sky reflection is stronger at the edge and less in the middle, this is a perfect example of the fresnel effect.

Now I took sandpaper and made one of the balls rough.

Notice how the reflection of the light is now blurry.

Now lets bring it outside, notice how we can still see a fresnel effect on the surface, with the edge going brighter than the center.

However, note the colors I picked from this photo. On the glossy ball, you get a bright fresnel edge. On the rough ball, the fresnel edge is not as bright.

I assume this is because an identical amount of light energy is hitting each ball. But the rough ball is spreading that energy over a larger surface (hence blurry reflections), so you have less energy in a specific spot, like spreading the same amount of butter over a larger piece of bread, the butter will be thinner.

Here’s a similar setup in vray, with 3 spheres, one with a Glossiness of 1, one with a Glossiness of 0.7 and one with a Glossiness of 0.3. Notice how the amount of energy seems to remain stable.

So if I want more realistic values from vray, should I reduce the overall reflectivity as the surface gets rougher? Would it be possible to get an automatic formula added to the material to do this? Are my results incorrect? Is there already a more automated way of doing this I don’t know about?

Any advice or thoughts are appreciated.

- Neil

What you’re looking for is ‘rough Fresnel’ and from what I know Chaosgroup is looking into this, correct me if I’m wrong.

In the meantime check out this reflection shader I wrote that does exactly that:

http://forums.chaosgroup.com/showthread.php?88138-An-assortment-of-OSL-shaders-for-your-perusal

So to explain, it takes the front facing reflection value, raises it slightly (rgh_darken_brighten param), and then blends between that value and the original Fresnel falloff depending on roughness. Total roughness means a uniform reflection colour, no Fresnel falloff.
This way you keep the overall reflection level, it would look wrong if it would be a simple multiply on the whole reflection falloff as the falloff needs to get spread out into a flat uniform non-angle-dependent value the rougher it gets.

To do this yourself you can blend between a falloff map and a constant (VRay)color. You need to get the correct value every time you change IOR though. So for IOR 1.5 this would be a value of 0.04. Plastic would have an IOR of 1.4-1.5 if I’m not mistaken. The blend amount depends on the roughness.
Then plug that into the reflection input with Fresnel disabled in the mat.

Thanks for the info. However, I’m not 100% convinced that as roughness approaches 1, the fresnel effect flattens out. At least from the real world test I did (and I admit, my test is by no means scientific or in a controlled environment), it seems that a rather rough surface still shows a pronounced fresnel edge effect, even if that effect is multiplied down. Are there any papers that you know of showing a similar experiment in a more controlled environment?

- Neil

It’s not that the fresnel effect flattens out, it’s more that you’ve less faces on the surface perpendicular to your viewing angle. What’s happened is the rougness / microfacet equation that most people are using isn’t good enough anymore. The shading doesn’t fully model a rough surface, it just adds in some biases to try and cull out reflection rays that would have been masked by bumps in front of the surfaces facing towards camera. There’s even some new shading models that are trying to add the lost brightness back into frosted surfaces - energy that bounces from a rough surface back into itself becomes a small amount of sss and should brighten up the surface too.

In your photo example, on the glossy ball all of the edge faces are at 90 degrees so you’ll get full strength fresnel, on the roughened ball, you’ve broken the surface so not all of it of it is at 90 degrees anymore, some of it is facing more towards you and those parts are of course getting less reflection than the 90 degree bits. I don’t think the glossy reflection in vray models this energy loss, it’s maybe more like just spreading out the reflection ray vectors in a fan from the original reflection normal and just averaging in a larger portion of the scene?

Here’s a simple max scene. Both renders use the same 200cm sphere, red material with glossy at 1 and default fresnel. There’s a dome light in full spherical mode set to mult 1 and white. The only difference is the left sphere was rendered with a noise modifier set to 1cm, you can see the roughened edges in the top right viewport showing the wobbling of the normals. When we render this one, some of the faces are pointing more back at us than before so they’re getting a weaker reflection with fresnel.

For a more accurate implementation of this, check out the VRayALMtl material which does glossy Fresnel by default (in fact, there is no option to turn it off). A side effect is that you can no longer map the Fresnel effect with a Falloff texture though. I don’t know how important this is:
https://github.com/ChaosGroup/vray\_al\_surface/releases

Best regards,
Vlado

Thanks for the render Joe, talking to a bunch of people, I have drawn the following conclusions:

the rougher the surface..

- the blurrier the reflection
- the reflection also dims
- the fresnel edge effect is still present

But the amount of dimming is a complex phenomena that’s affected by…

- the phenomena you’re describing, more tiny facets facing always from the viewer at the edges
- self shadowing between the rough microfacets
- because the reflection is blurred (stretched out), the reflection at a given point is darker to retain energy conservation
- the multiple scattering brightens the surface up again a bit

And there’s currently no easy formula to take into account all of those factors. Although we have plenty if pieces to this equation. Sound about right?

- Neil

Cool Vlado. DO you think this will eventually get wrapped into the standard Vray Material?

- Neil

Yes, it’s on the “to do” list. In the meantime I’m curious to hear any feedback for the implementation in the AL materal.

Best regards,
Vlado

Yep - glossiness is a function of surface polish. Fresnel is always present since whether a rough or smooth surface, the object is still made up of the same material with the same material properties. The reflection dims due to less of it pointing back at you and probably some of the energy that would have reflected on a smooth surface being shot back into the material (sss)

Yep indeed - In this year’s physically based rendering talk at siggraph (https://www.youtube.com/watch?v=zs0oYjwjNEo) they mentioned this - there’s a simple bias value added in to deal with some of this energy stuff in shading to try and account for the self shadowing but they’re looking for a better one. That said this wasn’t a chaosgroup talk so Vlado’s probably got ideas :slight_smile:

I guess for Vray to simulate this effect is just a matter of it’s Fresnel to “see” the microfacets of the BRDF. The downside though, as Vlado said we can no longer use a Falloff texture in Fresnel mode to mask reflections. A simple way to test this is creating a sphere with a black reflective material with a low IOR and a white background. As roughness increases, the color becomes more and more flat (but never totally flat, for the reasons described above).

Some renderers I tested which seem to calculate the fresnel term per microfacet include: IRay, ART, Redshift, FStorm and Maxwell. It’s interesting to note that Corona, Octane and Cycles are like Vray. Also, haven’t experimented much but looks like the “flattening” of the fresnel curve is not consistent between renderers. An interesting aspect of Iray and ART is that their BRDF custom curves from Arch & Design or Physical Material are also calculated per microfacet, as the image from ART renderer shows:

left roughness:0 | right: roughness:1

-Eugenio

Or if we still want to use fresnel, perhaps we just raise the facing colour a tiny bit higher than normal and lower the edge colour quite a bit so there’s just less difference between the front on and edge strength of the reflections?

What type of controls are used in Iray to set how rough the microfaceting is? Do they use units of measurement to set how big the high and low value of the facets are?

Hi. Last week i made a quick test to compare the diferences on masking/shadowing of 5 diferent BRDF: Vray GGX, Vray GGX + OSL from Rens, Octane, Corona and FStorm. The curves on the botton represents the reflectivity. Maybe this helps to have some visual reference. ;).

Vray GGX

Vray GGX + OSL from Rens

Corona

Octane

Fstorm

Link to all 4K HR images to compare:

Best.





Can you also make one with the VRayALMtl material in GGX mode?
https://github.com/ChaosGroup/vray\_al\_surface/releases

I’m curious how it compares.

Best regards,
Vlado

I made the 90º planes test, will make the complete chart including visual references son.

Base reflectivity maintain at 4% between 0-0.5 roughness and diminishes between 0.5 - 1 roughness to a minimum of 1.11%
Max Reflectivity diminishes constantly.

I never hear about this VrayALMtl before :open_mouth:

Best.

Ha! Look at that! Thanks Adan. : )
Looks like I need to check the code on the shader, it seems odd that it would lower the base reflection with lowered glossiness.
How did you do the gradient renders and the graphs?

The raising comes from the rgh_darken_brighten parameter. Depending on how you feel what should happen when a surface gets rougher you can raise or lower the base value. If you even out / average the 0-90 degree reflection curve you have a value that is slightly higher than the 0 degree value. Think of it as water in a fish tank with the water on the right higher like in Adan’s graph. After it will slosh down and settle the level will be higher than the original level on the left. That’s why it could be brighter overall. Now the shadowing of the microfacets comes into play with increased roughness, which will darken the reflection overall. You can brighten it with values above 0.5 and darken it with values below 0.5.

The roughness_falloff parameter controls how fast the curve will flatten out with increased roughness / decreased glossiness.

Hi, and thanks for your OSL i will make further test using it. :wink:

To get the gradient i use a very simple scene, 90 planes 1º rotation each and 1.0 on a full Vray dome and orthographic camera. I share the scene in case you want to do some test. It´s not 100% accurate because render noise and because you can´t render 99.99º planes but i like to “visualize” this kind of data.

To get the curves i use Nuke, crop the black border and sampler to sample the gradient.

MAX 2014 Scene Link:
https://drive.google.com/open?id=0Bys9\_iWhCgvfQWZZSmpiMUJGSjQ

Best.

Thanks! : )