-
What Is the Fresnel Effect?
- At any interface between two media, light is partially reflected and partially transmitted
- The ratio depends on the angle of incidence
- At grazing angles (θ → 90°): almost all light is reflected
- At normal incidence (θ = 0°): only a small fraction is reflected
- This is why water looks like a mirror when viewed at a shallow angle
-
Exact Fresnel Equations (Schlick’s Approximation)
- Full Fresnel equations (from Maxwell’s equations) are expensive
- Schlick (1994) approximation — used in virtually all real-time renderers
F(θ) = F0 + (1 - F0) * (1 - cos(θ))^5
cos(θ) = dot(V, H) — angle between view direction and half-vector
F0 — reflectance at normal incidence (0° angle)
-
F0 Values
- Dielectrics (non-metals: plastic, glass, skin, wood)
F0 ≈ 0.04 (4%) for most dielectrics
- Range: 0.02 (water) to 0.08 (gemstones)
- Formula from IOR:
F0 = ((n - 1) / (n + 1))²
- Glass (n=1.5):
F0 = ((1.5-1)/(1.5+1))² = 0.04
- Metals (conductors: gold, silver, copper, iron)
F0 = base color of the metal (RGB values)
- Gold:
F0 ≈ (1.0, 0.71, 0.29)
- Silver:
F0 ≈ (0.95, 0.93, 0.88)
- Copper:
F0 ≈ (0.95, 0.64, 0.54)
- Metals absorb transmitted light — no diffuse component
-
metallic parameter in [0, 1]
F0 = lerp(vec3(0.04), baseColor, metallic)
diffuse_color = baseColor * (1 - metallic) — metals have no diffuse
- This is the Disney/Unreal/Godot PBR convention
- Why: real materials are either dielectric (F0=0.04) or metal (F0=baseColor)
- Values between 0 and 1 are for blending (e.g., dirty metal, oxidized surface)
-
Energy Conservation with Fresnel
- Fresnel tells us how much light is reflected vs transmitted
- For opaque surfaces:
transmitted = 1 - F(θ) → absorbed or diffusely scattered
- Specular contribution:
F(θ) * f_specular
- Diffuse contribution:
(1 - F(θ)) * f_diffuse
- This ensures total reflectance ≤ 1
- In code:
-
Exact Fresnel (for Reference)
- For dielectrics (real IOR):
rs = (n1*cos(θi) - n2*cos(θt)) / (n1*cos(θi) + n2*cos(θt))
rp = (n2*cos(θi) - n1*cos(θt)) / (n2*cos(θi) + n1*cos(θt))
F = (rs² + rp²) / 2
cos(θt) from Snell’s law: cos(θt) = sqrt(1 - (n1/n2)² * (1 - cos²(θi)))
- For conductors (complex IOR
n + ik):
- More complex formula involving absorption coefficient
k
- Schlick with measured
F0 is a good approximation
-
Total Internal Reflection
- When light travels from dense to less dense medium (e.g., glass to air)
- At angles beyond the critical angle: all light is reflected, none transmitted
- Critical angle:
θ_c = arcsin(n2/n1) where n1 > n2
- In GLSL refract: returns
vec3(0) when TIR occurs
- Check:
1 - eta² * (1 - NdotI²) < 0 → TIR