-
Concept: Monte Carlo Integration
-
The Problem
- We need to evaluate:
I = ∫_Ω f(x) dx
- For the rendering equation:
f(x) = f_r(ω_i, ω_o) * L_i(ω_i) * cos(θ_i)
- This integral has no closed-form solution in general
- Monte Carlo: estimate the integral by random sampling
-
Monte Carlo Estimator
- Draw N random samples
x_1, ..., x_N from distribution p(x)
- Estimator:
Î = (1/N) * Σ f(x_i) / p(x_i)
- This is an unbiased estimator:
E[Î] = I
- Proof:
E[f(x)/p(x)] = ∫ (f(x)/p(x)) * p(x) dx = ∫ f(x) dx = I
-
Variance and Convergence
- Variance of estimator:
Var[Î] = Var[f(x)/p(x)] / N
- Standard deviation (noise):
σ = σ_f / √N
- Convergence rate:
O(1/√N) — dimension-independent
- To halve noise: need 4× more samples
- Compare to quadrature (trapezoidal rule):
O(1/N^(2/d)) — degrades in high dimensions
- For d > 2: Monte Carlo beats quadrature — this is why it’s used for rendering
-
- Sample direction uniformly over hemisphere
- PDF:
p(ω) = 1 / (2π) (constant over hemisphere)
- Sampling:
θ = arccos(1 - ξ_1), φ = 2π * ξ_2 where ξ_1, ξ_2 ~ Uniform(0,1)
- Cartesian:
x = sin(θ)cos(φ), y = sin(θ)sin(φ), z = cos(θ)
- Estimator for rendering equation:
L_o ≈ (2π/N) * Σ f_r(ω_i) * L_i(ω_i) * cos(θ_i)
-
Cosine-Weighted Hemisphere Sampling
- Sample proportional to
cos(θ) — matches the cos(θ) factor in rendering equation
- PDF:
p(ω) = cos(θ) / π
- Sampling (Malley’s method): sample disk uniformly, project to hemisphere
r = √ξ_1, φ = 2π * ξ_2
x = r * cos(φ), y = r * sin(φ), z = √(1 - r²)
- Estimator for Lambertian surface:
L_o ≈ (1/N) * Σ (albedo/π) * L_i(ω_i) * cos(θ_i) / (cos(θ_i)/π)
= (1/N) * Σ albedo * L_i(ω_i) — the cos and π cancel!
- This is why cosine-weighted sampling is preferred for diffuse surfaces
-
Variance Reduction
- PathTracer Learning - Concept - Importance Sampling — sample where integrand is large
- Control variates — subtract a known function with same integral
- Stratified sampling — divide domain into strata, sample each
- Quasi-Monte Carlo — use low-discrepancy sequences instead of random
- Halton sequence, Sobol sequence
- Converges at
O(1/N) instead of O(1/√N) for smooth integrands
-
Practical Notes
- Always divide by PDF:
contribution = f(x) / p(x)
- If
p(x) = 0 where f(x) ≠ 0: undefined — ensure support of p covers support of f
- Fireflies: rare samples with very high
f(x)/p(x) — clamp or use better sampling