Computer Graphics · Shading Models

Fresnel Reflectance for Dielectrics and Conductors

Why reflectance rises to one at grazing angles, how the index of refraction and extinction coefficient determine the normal-incidence value, and how Schlick approximation departs from the exact curves.

Every surface reflects more light at glancing angles than head-on. A glass window seen straight through is nearly invisible; seen along its plane it turns into a mirror. A polished wooden table shows a weak sheen directly above and a strong bright reflection near the horizon. This is Fresnel reflectance, and a shader that ignores it produces materials that look flat and plastic no matter how the rest of the model is tuned.

The exact law is not complicated, but it comes in two forms: one for insulators, where light passes through, and one for metals, where it does not. Both derive from the same boundary conditions on the electric and magnetic fields at an interface.

What the boundary conditions give

Light arriving at a planar interface between two media splits into a reflected and a transmitted wave. The amplitudes of the three waves are fixed by requiring the tangential components of the electric and magnetic fields to be continuous across the boundary. Solving that system yields the Fresnel equations, which give reflectance separately for light polarized perpendicular to the plane of incidence and parallel to it.

For a dielectric, with incident index n₁ and transmitted index n₂, and incidence angle θ_i, the two amplitude coefficients lead to reflectances

$$R_s = \left|\frac{n_1\cos\theta_i - n_2\cos\theta_t}{n_1\cos\theta_i + n_2\cos\theta_t}\right|^2, \qquad R_p = \left|\frac{n_1\cos\theta_t - n_2\cos\theta_i}{n_1\cos\theta_t + n_2\cos\theta_i}\right|^2$$

with θ_t given by Snell’s law, n₁ sin θ_i = n₂ sin θ_t. Unpolarized light reflects with R = (R_s + R_p) / 2, which is what most shading code uses because most scenes are not polarization-aware.

At normal incidence the two expressions collapse to the same value, and the algebra simplifies to

$$R_0 = \left(\frac{n_1 - n_2}{n_1 + n_2}\right)^2$$

For air (n ≈ 1.0) against glass (n ≈ 1.5), that is (0.5/2.5)² = 0.04. Four percent. This is the number that makes glass look like glass when viewed head-on, and it is small enough that a shader clamping specular to a comfortable 0.5 will look wrong in the opposite direction: too shiny at normal incidence and not shiny enough at grazing.

At grazing incidence, θ_i approaching 90°, both R_s and R_p approach one regardless of the indices. The physical reason is that the transmitted wave is squeezed into a vanishingly thin region near the surface, and the boundary becomes effectively impermeable. No material escapes this. Even a black rubber surface reflects nearly everything at extreme grazing angles, which is why the edge of a dark object against a bright background often shows a bright rim.

Metals, where the index is complex

A conductor cannot be described by a real index alone, because the wave is attenuated as it propagates into the material. The index becomes complex, ñ = n + iκ, where κ is the extinction coefficient. The Fresnel equations generalize by substituting the complex index into the same boundary-condition solution, which makes the arithmetic messier but the structure identical.

The practical consequence is that a metal’s normal-incidence reflectance is high and varies with wavelength. Gold has a reflectance near 0.9 or above across the visible with a dip in the blue, which is why it looks yellow; silver is high and flat across the visible with a dip in the deep blue, which is why it looks neutral white; iron reflects less and less evenly, which is why it looks gray with a warm tint. These are not artistic choices. They follow from n and κ tabulated per wavelength.

Two features distinguish conductor curves from dielectric curves. First, R₀ is large, typically 0.5 to 0.99, so a metal has no visible diffuse component; whatever is not reflected is absorbed within a few tens of nanometers. Second, the curve rises to one more slowly in angle for some metals and more quickly for others, so grazing behavior cannot be predicted from R₀ alone.

/* Exact unpolarized Fresnel for a dielectric interface, index n2 over n1. */
static double fresnel_dielectric(double cos_i, double n1, double n2) {
    double sin_t2 = (n1 * n1) * (1.0 - cos_i * cos_i) / (n2 * n2);
    if (sin_t2 >= 1.0) return 1.0;                 /* total internal reflection */
    double cos_t = sqrt(1.0 - sin_t2);
    double rs = (n1 * cos_i - n2 * cos_t) / (n1 * cos_i + n2 * cos_t);
    double rp = (n2 * cos_i - n1 * cos_t) / (n2 * cos_i + n1 * cos_t);
    return 0.5 * (rs * rs + rp * rp);
}

Total internal reflection is the case sin_t2 ≥ 1: when n₁ > n₂ and the incidence angle exceeds the critical angle arcsin(n₂/n₁), no transmitted wave exists and reflectance is exactly one for both polarizations. A shader that evaluates the dielectric formula without checking that branch produces a NaN from the square root, which then propagates through the rest of the frame buffer.

The two polarizations diverge before that point, and the divergence is exact. The parallel component R_p falls to zero at the Brewster angle, θ_B = arctan(n₂/n₁), because the reflected ray is then perpendicular to the transmitted ray and the dipoles in the medium cannot radiate along their own axis. For air against glass that angle is about 56.3°. An unpolarized renderer, which is nearly all of them, never sees this dip directly, but the split matters when the two coefficients are used separately for refraction and for thin-film interference, where the phase shift on reflection differs between them: the perpendicular component flips phase at every interface, the parallel component does not below the Brewster angle and does above it.

Index matching is the other half of the picture. Two media with the same index have zero reflectance at every angle, which is why a glass rod disappears in a liquid of matching index and why optical cements are chosen to sit between the indices of the elements they join. A renderer that stores an index per material and computes Fresnel from the pair, rather than storing a single reflectance value, reproduces this for free; one that bakes F₀ into the material cannot.

The Schlick approximation and where it fails

Evaluating the exact expression per shading point requires a square root and several divisions, plus a table lookup for a conductor’s complex index. Schlick’s approximation replaces all of it with a single power:

$$F(\theta) \approx F_0 + (1 - F_0)(1 - \cos\theta)^5$$

F₀ is the reflectance at normal incidence, which for a dielectric is the (n−1)²/(n+1)² value and for a metal is a color read from a table. The fifth power was chosen because it matches the shape of the exact curve closely for common dielectrics while being one subtraction and one multiplication chain.

The approximation is good in the region that matters and poor at both ends of the parameter range. For dielectric F₀ values near 0.04 the error is a couple of percent across most angles. For a conductor with F₀ near 0.95 the approximation underestimates reflectance at intermediate angles, because the true conductor curve rises earlier. For very low F₀, such as a surface with n ≈ 1.05, the approximation stays too low until quite grazing. None of these errors are large enough to notice in a stylized render, and all of them matter when a material is being matched against measured data.

Varying the exponent is one common adjustment: raising it above five pushes the grazing rise later and makes a surface look less rim-lit. That change breaks the physical interpretation entirely. The exponent is not a free parameter of the material; it is a fitted constant of the approximation, and detaching it from five turns the model into a phenomenological rim term.

Fresnel and the rest of the shading stack

Fresnel is a factor on a reflection lobe, never a lobe by itself. In a microfacet model it multiplies the distribution and the geometric term, so the microfacet distribution and shadowing function decide where reflections go while Fresnel decides how much energy they carry. In a layered material the same factor applies to the specular layer while the transmitted remainder feeds the layer beneath, which is how clearcoat and thin-film models are built.

Because Fresnel is dimensionless, it composes with the energy budget directly: the directional albedo of a specular lobe is bounded by the Fresnel value integrated over the lobe’s directions. A metal with F₀ of 0.9 can reflect at most 90 percent of incident power at normal incidence, and the remaining 10 percent must be absorbed, not scattered.

One subtlety that catches implementers: the cosine in Schlick’s formula is the angle to the surface normal, and it must be computed from the same normal that the microfacet distribution uses. Mixing a shading normal with a geometric normal, or using an unnormalized interpolated normal, shifts the grazing rise and produces a bright seam where the normal length changes.

References

  1. Optics — Eugene Hecht, Addison-Wesley
  2. Specular Reflection — F. E. Nicodemus, in Applied Optics and Optical Engineering
  3. Refractive index database — Mikhail Polyanskiy