BRDF Importance Sampling for Polygonal Lights

Christoph Peters

In ACM Transactions on Graphics 40:4 (Proc. SIGGRAPH)

Polygonal light importance sampling

Abstract

With the advent of real-time ray tracing, there is an increasing interest in GPU-friendly importance sampling techniques. We present such methods to sample convex polygonal lights approximately proportional to diffuse and specular BRDFs times the cosine term. For diffuse surfaces, we sample the polygons proportional to projected solid angle. Our algorithm partitions the polygon suitably and employs inverse function sampling for each part. Inversion of the distribution function is challenging. Using algebraic geometry, we develop a special iterative procedure and an initialization scheme. Together, they achieve high accuracy in all possible situations with only two iterations. Our implementation is numerically stable and fast. For specular BRDFs, this method enables us to sample the polygon proportional to a linearly transformed cosine. We combine these diffuse and specular sampling strategies through novel variants of optimal multiple importance sampling. Our techniques render direct lighting from Lambertian polygonal lights with almost no variance outside of penumbrae and support shadows and textured emission. Additionally, we propose an algorithm for solid angle sampling of polygons. It is faster and more stable than existing methods.

Keywords

projected solid angle sampling, solid angle sampling, light sampling, next event estimation, spherical polygons, spherical triangles, polygonal lights, real-time ray tracing, rendering, linearly transformed cosines, LTC, Monte Carlo integration, optimal MIS

Notes

This work has been presented at SIGGRAPH 2021 on 12th of August. The author's version has been published on 11th of June 2021.

Downloads


Author's version

Supplemental document

Code without data and dependencies (0.5 MB)

Code with data and dependencies (374 MB)

Additional scenes (Bistro, 724 MB)

Interactive image viewer

Fast forward video (30 seconds)

5-minute presentation

19-minute presentation

PDF slides

Python code for slides

Links to related blog posts