Turns out that most computer graphics conductor materials (metals) don't fit well with their measured real life counterparts. Looks like microfacet models (any reflection node you ever used..) can't fully address the appearance of this kind of materials. Microfaceting theory models the appearance of a material at macroscopic level based on surface micro details. Situation is that when light bounces on micro-facets can travel shorter than wavelengths, this difference in optical path length results in phase variations altering the light wavefront, engaging diffraction effects.
This shader (Reflect Diffraction) is able to model both micro and nano interactions with a two-scale reflectance model. While the micro scale is covered by the Cook-Torrance microfacet model, the nano scale is predicted by Harvey-Shack diffraction theory. The latter is the missing diffraction lobe to better fit with measured reflectances.
So, what to save from all the above ? That microfacet models may not be the best thing to use when wanting to approach specifically the modelling of metals. When we need CG metals that sparkles all their magical energy like gold for example we need something more specialized.
Although we have some more parameters to work with, they remain simple and easy to understand. Take care that here parameters are not standalone on their own, they are all part of a model and they all work together so they are just a bit more difficult to be explained but as soon one starts dealing with them, they feel natural. Also we provide a one-click solution for the main appearance of most metals. The jaguar sculpture for example has been rendered out-of-the-box with the build-in default Gold setup.
Here with the build-in Silver setup and the default Roughness value.
Here instead the default Roughness value has been increased to 2.0 for a more rough material. The Roughness param is available for all build-in appearances and works only when one of them is selected, - ie. not when Custom is selected, there we use all the remaining parameters.
Now, let's say we wanna approach an aluminum material with custom parameters. The great thing about this shader and aluminum materials is that it can simulate the physical blue tint most aluminums have, yep you heard us, aluminum is not mono color but has a slight blue tint in his highlights.
The main parameter that controls the roughness of the material is Reflection Roughness. Below 0.1 and 0.9 respectively. We also see that there isn't any energy drop with the increasing of roughness and that the reflection remains shiny and vibrant.
Now the tricky part. Because we said that the two-scale approach is a full model.. as soon as we start tweaking other params also the previously set roughness will change a bit. Why this happens ? Because diffraction effects are related to microfacets (roughness) and microfacets then depend also on diffraction. For now just increase the Diffraction Roughness to 0.5.. we'll notice that the overall roughness will change just a bit. Below, before and after diffraction roughness has changed. Still intuitive.. if we increase diffraction roughness also the reflection roughness will increase a bit.
Remeber that diffraction effects will be more evident at normal incidence (where the viewing dir is parallel to the object normal) .. ie. no at grazing angles (where it is almost perpendicular and where the Fresnel effect will be more prominent). Also notice that introducing a bit of diffraction our metal starts being a bit more bright and a bit less saturated at normal incidence. In fact, the overall effect of diffraction will be to have increased reflection haziness.
Let's now just introduce a little bit of Diffraction Hazy (0.1). Beside increased haziness, it will start also giving vibrant blue tones to our aluminum. If we want more haziness and more blue tones we gonna increase also the Diffraction Haze Extent.
What if we want less blue tones ? We start increasing the Reflection Slope param which was set to the minimum 0.005. Take care that with some setups like this one even a small increase of 0.001 can make a big difference.
Or we can increase the Reflection Roughness which generally controls the main appearance of diffraction vs reflection.. so increasing it, it is like we say.. less diffraction and more classic microfacet reflection. And bamn we have an incredibly nice aluminum material with some slight shades of blue ;)
Note that doing so we lose a bit of hazing. If we wanna keep more haziness just keep increasing the reflection slope while in tandem increase also diffraction roughness.. we'll keep the main diffraction effects without the blue tones.
Instead if we have a nice overall material but eventually we want a bit more roughness (like here below) we can increase both diffraction and reflection roughness. For any other material that is not aluminum where we don't want the blue tint to come up we'll just keep the reflection slope >= to its default value of 0.1.
The remaining parameters controls the Fresnel effect and the overall brightness of the material. The Core Reflect in a classic PBR metalness workflow (standard material) is the base diffuse color while the Edge Reflect is the specular color. By selecting IOR/K instead of Core/Edge you can input numerically the complex IOR parameters, if you input only one it will be read as a standard IOR and if you input a pair it will be the same for all the channels. If we use build-in appearances Fresnel is already setup for us, we can however still control the overall brightness with Weight and Color.
Also the build-in copper is really nice so we couldn't resist and eventually rendered it.
Although Reflect Diffraction is a tad slower than a classic reflection node because of the added diffraction lobe computation, it is still very fast (with good importance sampling so no fireflies etc.).. all the images rendered here at around 1.5K took less than 3mins to render (AMD Ryzen7).
Keywords :
diffraction, brdf, wave optics, arnold, arnoldrender, arnoldrenderer, shader, material, reflect, reflection, microfacet, arnold shaders, arnold download, arnold materials, arnold renderer materials