Look at any surface at a grazing angle and it becomes more reflective. That is Fresnel. It is in every PBR shader, and getting it wrong is one of the clearest signals a material is not physically based.
What Fresnel Is
Pick up any object near you. Look at it straight on, then tilt it away until you're viewing nearly parallel to the surface — it gets brighter. Every surface does this, no matter the material. That's the Fresnel effect.
The physics: a surface is an interface between two media. When light hits it, some reflects and the rest refracts. The fraction that reflects depends on the angle. At normal incidence it's at its minimum — that minimum is called F0. At grazing it climbs toward 1 for every surface at every frequency. No exceptions.
F0 - The Anchor
F0 is the specular reflectance at perpendicular viewing. For a dielectric in air:
Most dielectrics are low: water at 0.02, skin at 0.028, plastic and glass around 0.04–0.05. The specular is achromatic — surface color comes from the diffuse response, not reflection.
Metals are different. Their F0 is high (0.5 or above) and tinted across the spectrum. Gold's F0 is (1.02, 0.78, 0.34) in linear — that warm characteristic reflection is F0, not a tint on top of it. Day 21 - 🔬 Deep dive - PBR Compliant Work covers what that physically means.
Schlick's Approximation
The full Fresnel equations aren't practical per pixel. In every PBR shader I've worked in, the Schlick approximation handles it:
At n·l = 1 (straight on) you get exactly F0. At n·l = 0 (grazing) you reach 1. The pow(5) keeps the curve near F0 across most angles and only kicks hard near 90°. The n·l here is the same dot product from Day 43 - 🔬 Deep dive - Dot Product in Rendering.
float3 FresnelSchlick(float NdotL, float3 F0)
{
return F0 + (1.0 - F0) * pow(1.0 - NdotL, 5.0);
}
Practical Takeaway
Fresnel isn't only an artistic choice, it's a physical constraint every real surface follows. A PBR shader handles it automatically if F0 is set correctly.
- Dielectrics: F0 between 0.02 and 0.05 covers almost everything. Values outside that range need a reason.
- Metals: F0 is the specular color. It goes in the albedo map with metalness at 1.0. Not 0.9, not 0.5.
- The forbidden zone: Linear F0 between ~0.2 and 0.45 doesn't correspond to any real substance. Flag it.
- The grazing rise is free: You don't paint it in or control it. Set F0 correctly and Schlick handles the rest.
© 2026 Stefan Groenewoud - All views are my own, not those of my employer.
