# How to create a mirror shader?

I would like to know how to create a physically correct mirror material in cycles. How can that be achieved as realistic as possible?

From Wikipedia:

Mirrors are manufactured by applying a reflective coating to a suitable substrate ...

In modern times, the mirror substrate is shaped, polished and cleaned, and is then coated. Glass mirrors are most often coated with silver[20] or aluminium ...

In some applications, generally those that are cost-sensitive or that require great durability, mirrors are made from a single, bulk material such as polished metal ...

• Wouldn't a white glossy shader with a roughness of 0 be enough? What other effects are you looking for? – maddin45 Jan 28 '15 at 11:44
• There is no other way to do it AFAIK. – VRM Jan 28 '15 at 12:30
• Cycles is not very good at rendering caustics. If you are in need of a more accurate render, try rendering in LuxRender. – user1853 Jan 28 '15 at 14:56

## 1. Mirror shader as material with mirror reflection (roughness = 0):

To setup a physically correct material we need to base it on real measured values and setup the nodes so it follows the equations how materials behave (PBR setups). The best source for measured values is refractiveindex.info - we get 2 IOR values: N and K.

IOR is a complex number, most people are familiar with the real part (N), but it has also a complex part (K). For non-conductive materials (dielectrics) the complex part is 0 (or very close to it), so this involves metals mostly.

IOR is also dependent on the wavelength of light, so red, green and blue will reflect differently off of the material. This gives metals their characteristic colors and tinting. To use N and K values in a shader, we'll need the Conductive Fresnel node group, here is a GPU friendly implementation.

So in refractiveindex.info we input 650nm for red, 550nm for green and 450nm for blue and for example we get physically correct gold mirror shader:

It is worth noting that color management also plays significant role how your materials will look. If we enable Filmic and Very High Contrast look we get this, the correct way would be to also setup the lighting for the Filmic color-management (increase light intensities, keep Base Contrast).

Dielectric materials have a diffuse component (unlike metals) and the important part to keep them physically correct is to mix in the reflection through Fresnel. We can also get measured values for IOR, for ceramics it's around 1.8, so here is how a generic setup of mirror reflection on a bathroom tile would look like:

For other materials like wood floor etc. there is just different IOR, the setup is same, unless there is some roughness to the reflection.

For mirror sunglasses shader the effect is made with thin film coating. Measured values for sunglasses are hard to come by, so the artistic approach of mixing shaders through multiple Layer Weight nodes is all there is to it:

There is however an OSL shader available (now also with GPU support) to do the thin-film interference on materials. Use the Thin Film Interference node, don't link the materials, as some of them are not PBR compliant.

Mirror is made from 2 materials: Glass and Silver coated aluminium behind it, so to make physically correct mirror, you will need to model it as such.

It's worth noting that Refractive Caustics option should be turned on to not produce shadow onto the silver plate behind the glass:

For the silver you sample values from refractiveindex.info and you get:

If the mirror is bigger and it's in animation, I suggest putting some slight bump or displacement on it, as nothing is perfectly flat.

For ordinary mirrors made from flute glass and that are not the object of focus this is fine, but fancier mirrors use heavier glass and sides cut in angles so the diffraction of light is clearly visible.

First thing to mention is that Cycles should not be the weapon of choice to render physically correct glass. Bi-directional renderers do much better job at rendering glass with the perfect tool being spectral renderers that can do diffraction and thin-film correctly. With Cycles be ready to set 50k samples and render whole night even on good HW.

Here are some popular glass types and their respective IOR curves. The exact values are again at refractiveindex.info, for the LASF9 it looks like this:

You can notice the glass came to life with color, there is blue tint on edges and warm tint in middle, with diffraction streaks present.

For even more realism we could add a volume absorption shader as that is also not present in Principled or Glass nodes, but on thin glass plane this is only visible on the edges, so I'd say it depends on what type of frame the mirror is in.

This is all correct for roughness = 0, because otherwise we need to account for it. You can find a Fresnel node that takes roughness into account here and use it in place of the standart Fresnel in the right setup, the Glass node in Cycles is equivalent to it:

You can also use the complex IOR node if you need glass that happens to have some small K value.

The test scene is by Robin Marin

• Just out of curiosity, where did you get the material preview model? – PGmath Jan 28 '15 at 15:39
• @PGmath related question: blender.stackexchange.com/questions/21807/… – p2or Jan 28 '15 at 15:52
• In your glass material, why did you mix in an additional Glossy shader? Reflection component is included in each Glass shader already. – Greg Zaal Jan 29 '15 at 9:21
• The glass shader most definitely does take fresnel into account: i.imgur.com/mA55lFz.png - sphere has only glass shader, surrounding cube is emission with ray visibility disabled for camera and transmission (so the render only shows reflection component). Blend file: gregzaal.com/u/glass_fresnel.blend – Greg Zaal Jan 29 '15 at 14:21
• Not sure what you mean by blunt, but each to his own :) to me, your glass is clearly too reflective and starts to look like metal. Perhaps its even do do with calibration of our monitors, i don't know :) – Greg Zaal Jan 29 '15 at 18:35

A simple solution is to use a glossy shader with roughness value of 0.001 or a glossy shader and change its default glossy type GGX to Sharp.