150 likes | 330 Views
Optimally Combining Sampling Techniques for Monte Carlo Rendering. Eric Veach and Leonidas J. Guibas Computer Science Department Stanford University SIGGRAPH 1995. Roughness. Specular. Highly specular surface and large light source. Very rough surface and small light source. Variance.
E N D
Optimally Combining Sampling Techniques for Monte Carlo Rendering Eric Veach and Leonidas J. Guibas Computer Science Department Stanford University SIGGRAPH 1995
Roughness Specular Highly specular surface and large light source Very rough surface and small light source Variance Sampling the light sources Sampling the BRDF
,where Multi-sample Model Weighted combination of all the sample values An example of wi ci: relative number of samples taken from pi (balance heuristic)
Theorem 1 wi: any non-negative functions with No choice of the wi can improve upon the variance of the balance heuristic by more than (1/minini – 1/N)F2
Weighting Heuristics (a) balance (b) cutoff (c) power (d) maximum
variance roughness
Combine Sampling With power heuristic
A simple test scene One area light source and an adjacent diffuse surface. (a) (b) (c) (a) Sampling the light source (b) Sampling the hemisphere according to the projected solid angle (c) Combination of samples using the power heuristic
Bidirectional Sampling Strategies • Standard MC path tracing. • Standard MC path tracing with direct lighting. • Depositing light on a visible surface (photomap). • Depositing light when a photon hits the camera lens.
Bidirectional Path Tracing 25 samples per pixel 56 samples per pixel Standard path tracing using the same amount of work (same computation time) Combines samples from all the bidirectional techniques
Conclusion • Power heuristic (with beta=2) gave the best results. • These techniques are practical, and the additional cost is small – less than 10%
PBRT PBRT define balance and power heuristic in “mc.h” inline float BalanceHeuristic(int nf, float fPdf, int ng, float gPdf) { return (nf * fPdf) / (nf * fPdf + ng * gPdf); } inline float PowerHeuristic(int nf, float fPdf, int ng, float gPdf) { float f = nf * fPdf, g = ng * gPdf; return (f*f) / (f*f + g*g); }