• Definition

    • f_r(ω_i, ω_o) — ratio of reflected radiance to incident irradiance
    • Units: 1/sr (per steradian)
    • Describes how a surface scatters light
    • ω_i — incoming light direction (toward surface)
    • ω_o — outgoing view direction (away from surface)
    • Both directions are defined in the upper hemisphere (above the surface)

  • Physical Constraints

    • Non-negativity: f_r(ω_i, ω_o) ≥ 0
    • Reciprocity (Helmholtz): f_r(ω_i, ω_o) = f_r(ω_o, ω_i)
      • Light path can be reversed — important for bidirectional algorithms
    • Energy conservation: ∫_Ω f_r(ω_i, ω_o) cos(θ_i) dω_i ≤ 1 for all ω_o
      • = 1 for perfectly reflective surface
      • < 1 for absorbing surface
      • Violation → surface creates energy → physically impossible

  • Lambertian BRDF (Diffuse)

    • f_r = albedo / π
    • Constant — scatters equally in all directions
    • The 1/π factor ensures energy conservation
    • Proof: ∫_Ω (albedo/π) * cos(θ) dω = (albedo/π) * π = albedo ≤ 1
    • Rendering equation contribution: L_o = albedo * (1/π) * ∫ L_i * cos(θ) dω
    • With cosine-weighted sampling: simplifies to L_o ≈ albedo * L_i
    • No real surface is perfectly Lambertian — but it’s a good approximation for matte surfaces

  • GGX Microfacet BRDF (Specular)

    • See PathTracer Learning - Concept - Microfacet Theory for full derivation
    • f_r = D(h) * G(ω_i, ω_o) * F(ω_o, h) / (4 * NdotL * NdotV)
    • Components
      • D(h) — Normal Distribution Function: density of microfacets with normal h
      • G(ω_i, ω_o) — Geometric term: shadowing and masking by microfacets
      • F(ω_o, h) — Fresnel: reflectance as function of angle
    • GGX NDF
      • D(h) = α² / (π * (NdotH² * (α² - 1) + 1)²)
      • α = roughness² (perceptual roughness remapping)
      • α = 0 → perfect mirror, α = 1 → fully rough
    • Smith G term
      • G(ω_i, ω_o) = G1(ω_i) * G1(ω_o) (separable approximation)
      • G1(ω) = NdotV / (NdotV * (1 - k) + k) where k = α/2 (direct lighting)
    • Schlick Fresnel

  • Disney Principled BRDF

    • Brent Burley (Disney) 2012 — artist-friendly parameterization
    • Parameters: baseColor, metallic, roughness, specular, specularTint, anisotropic, sheen, sheenTint, clearcoat, clearcoatGloss, subsurface, transmission
    • Widely used in production (Unreal, Unity, Godot PBR)
    • Combines diffuse + specular + clearcoat + sheen layers
    • Diffuse term: modified Lambertian with retro-reflection at grazing angles
      • f_diffuse = (baseColor/π) * (1 + (F_D90 - 1)(1-NdotL)^5) * (1 + (F_D90 - 1)(1-NdotV)^5)
      • F_D90 = 0.5 + 2 * roughness * VdotH²

  • BSDF (Bidirectional Scattering Distribution Function)

    • Generalization of BRDF that includes transmission
    • f_s(ω_i, ω_o) — handles both reflection and refraction
    • BRDF: reflection only (ω_i and ω_o on same side)
    • BTDF: transmission only (ω_i and ω_o on opposite sides)
    • BSDF = BRDF + BTDF
    • Used for glass, water, translucent materials

  • BRDF Sampling

    • To importance sample a BRDF, need to sample ω_i proportional to f_r * cos(θ_i)
    • Lambertian: cosine-weighted hemisphere sampling
      • θ = arccos(sqrt(1 - ξ₁)), φ = 2π * ξ₂
      • PDF: p(ω) = cos(θ) / π
    • GGX: sample half-vector from NDF, reflect view direction
      • θ_h = arctan(α * √(ξ / (1 - ξ))), φ_h = 2π * ξ_2
      • h = spherical_to_cartesian(θ_h, φ_h) in tangent space
      • ω_i = reflect(-ω_o, h)
      • PDF: p(ω_i) = D(h) * NdotH / (4 * VdotH)
    • VNDF sampling (Heitz 2018) — better for GGX at grazing angles
      • Sample visible NDF: proportional to D(h) * G1(ω_o) * dot(ω_o, h)
      • Fewer wasted samples for rough surfaces at grazing angles

  • Layered BRDFs

    • Real materials often have multiple layers
    • Clearcoat: thin specular layer over diffuse/specular base
      • f_total = f_clearcoat + (1 - F_clearcoat) * f_base
    • Sheen: retroreflective layer for fabric/velvet
    • Subsurface: light enters and exits at different points (BSSRDF)