Appearance
M-mat-C3: Schlick Fresnel + F0 Derivation
Taught: 2026-05-04 Milestone: Phase 1 M-mat — Disney BRDF Result: PASS on retry, after re-teach via elevator/journey analogy + F0 terminology fix
Why this concept matters here
Fresnel is the term in the Disney BRDF that determines how reflectance changes with viewing angle. It's the one that produces the visible "rim" on plastic balls and water surfaces. Getting the F0 derivation right (dielectric ≈ 0.04 grey, metal = base_color, Disney mix-by-metallic) unlocks the principled metallic-roughness parameterization and sets up the M-mat → OpenPBR → MaterialX progression. Conceptually it's also the cleanest fix for a misconception the user had carried in from M-mat-C2 ("Fresnel falls off at the silhouette" — backwards; it rises).
The walkthrough
Step 1 — What Fresnel actually is
The skipping-stone analogy. Throw a stone straight down at water (steep angle, head-on view) — it plunks through, most energy enters the water. Throw it nearly parallel to the water (grazing angle) — it skips, almost all energy reflects. Same water, same stone. The angle decides reflect-vs-transmit.
Fresnel is the proportion of incoming light reflected at the boundary between two media (air/material), as a function of angle. It is NOT the specular-vs-diffuse energy split (M-mat-C4). It's purely about what happens at the interface — the moment a photon hits the surface boundary.
Key fact: every material — copper, plastic, concrete, water, gold — has Fresnel approaching 1.0 at grazing angles. At 90° of incidence, EVERYTHING is a perfect mirror. The materials differ at facing angles.
Step 2 — The shape of the curve
x-axis = angle from facing (0 = head-on, 90° = grazing), y-axis = reflectance (0 to 1):
- Flat-ish from 0° to ~60°
- Sharp ramp from ~70° to 90°
- Always lands at 1.0 at exactly 90°
So every sphere has a highly reflective silhouette. That's the rim on a plastic ball under a window. That's why water looks like a mirror viewed from a low angle.
Step 3 — Schlick's polynomial approximation
wgsl
fn fresnel_schlick(cos_theta: f32, F0: vec3<f32>) -> vec3<f32> {
let one_minus_cos = 1.0 - cos_theta;
let pow5 = one_minus_cos * one_minus_cos * one_minus_cos
* one_minus_cos * one_minus_cos;
return F0 + (1.0 - F0) * pow5;
}At cos_theta = 1 (head-on): F = F0. At cos_theta = 0 (grazing): F = 1. The polynomial smoothly interpolates between F0 and 1.0, biased heavily toward grazing thanks to the ^5.
Critical WGSL gotcha: for analytic lights, cos_theta = dot(V, H) (half-vector formulation), NOT dot(N, V). Many older tutorials use NdotV which is correct only for IBL flows.
Step 4 — F0: where the material identity lives
Dielectrics (plastic, water, glass, concrete, skin, wood): F0 ≈ 0.04 regardless of base color. The base color is the diffuse color — light that penetrated, scattered, came back out tinted. The 4% specular is a colorless grey reflection of the environment.
Metals: no diffuse — light either reflects off the surface or gets absorbed. F0 IS the metal's color. Copper reflects coppery; gold reflects gold.
Disney's principled trick: F0 = mix(vec3(0.04), base_color, metallic). Single parameter metallic ∈ [0, 1] interpolates between dielectric and metal regimes. Both endpoints physically correct.
Step 5 — Worked numbers (representative materials)
Copper sphere base_color = (0.85, 0.55, 0.25), metallic = 1.0, F0 = (0.85, 0.55, 0.25):
- VdotH = 0.95: F ≈ F0 = (0.85, 0.55, 0.25)
- VdotH = 0.1: F = (0.939, 0.816, 0.693) — rim is whiter (low channels lifted more)
Concrete pedestal metallic = 0.0, F0 = (0.04, 0.04, 0.04):
- VdotH = 0.95: F ≈ 0.04 (almost no specular at facing)
- VdotH = 0.1: F = 0.606 — 15× brighter than facing
The concrete's rim is dramatic; copper's is subtle. Both reach 1.0 at 90°, but the journey from F0 to 1.0 differs hugely.
The mental model in one sentence
Fresnel rises toward 1.0 at grazing angles for every material; F0 (the head-on reflectance) is grey-4% for dielectrics and is the actual color for metals; the visual drama of the Fresnel rim is proportional to (1 − F0), so dielectrics show dramatic rims and metals show subtle ones.
First explain-back attempt — FAIL
On a chrome ball which is whitish. Schlisk fresnel would make it visibly brighter at glazing angle-off center. FOr a polished concrete pedestal, it would be dimmest when viewed head-on and more brigter when viewed from an angle. F0, the fresnel coeffecient will be highest at grazing angles and the 1-F0 factor makes it more normlaized!
Two issues:
- Terminology slip: "F0 will be highest at grazing angles" — F0 is not angle-dependent. F0 is a fixed material constant (head-on reflectance). The angle-varying value is F (no subscript), which goes from F0 at head-on to 1.0 at grazing.
- Didn't articulate the WHY: said "(1−F0) normalizes" without explaining what work it does. The question was specifically about why the rim is more dramatic on concrete than on chrome.
Re-teach via elevator/journey angle
Reframed F0 as a starting floor and 1.0 as the penthouse. Every material rides the elevator to the same penthouse, but starting floors differ:
- Concrete (F0 = 0.04): starts on floor 4, climbs 96 floors
- Chrome (F0 ≈ 0.95): starts on floor 95, climbs 5 floors
The (1 − F0) factor IS the elevator's travel distance. 0.96 vs 0.05 = 19× difference in journey length. Same destination, wildly different journeys, that's why concrete's rim is dramatic and chrome's is subtle.
Also fixed terminology directly: F0 is constant per material; F is the angle-varying value.
Re-test prompt
- For each object, what's its (1 − F0) value? (The elevator travel distance.)
- Which object's rim climbs more, and by how much?
- Synthesis: a junior engineer says "Both materials reach Fresnel = 1.0 at grazing, so they should both have equally bright rims." Correct them using the journey/climb framing.
User's answer (PASS)
- for chrome ball 1-F0 is much smaller compared to for concrete
- concrete climbs higher
- No, chrome is bright by default so the rim brightness is not visibly strong. But concrete is dull by default and the rim brighness is more obvious.
Judgment
PASS. Got:
- Elevator math (chrome (1-F0) small, concrete (1-F0) big)
- Concrete climbs higher
- Synthesis nailed: "chrome is bright by default so rim isn't visibly strong; concrete is dull by default so rim is more obvious." That's the contrast-based intuition. The drama is in how much the brightness changes relative to where it started, not in the destination.
The terminology error from the first attempt (F0 highest at grazing) didn't recur — F0 as a constant material property landed.