E N D
Image Synthesis Photon Mapping
Motivation “Today ray tracing is one of the most popular and powerful techniques in the image synthesis repertoire: it is simple, elegant, and easily implemented. [However] there are some aspects of the real world that ray tracing doesn’t handle very well (or at all!) as of this writing. Perhaps the most important omissions are diffuse inter-reflections (e.g. the ‘bleeding’ of colored light from a dull red file cabinet onto a white carpet, giving the carpet a pink tint), and caustics (focused light, like the shimmering waves at the bottom of a swimming pool).” Andrew Glassner 1989
Overview Generating a Photon Mapped Image: Two pass approach • Generate Photon Map“from the light source into the scene” • Render Image; e.g. with ray tracing“from the eye into the scene”
Ray tracing • The basic ray-tracing method • Recursive search for paths to the light source • Interaction with matter • Point-wise evaluation of an illumination model • Shadows, reflection, transparency N: surface normals R: reflected rays L: shadow rays T: transmitted rays T2 R2 R3 T1 N2 R1 N3 L3 L2 L1 N1 Point light source Viewpoint
Light sources Types of light sources Point Spherical Area General
From light source into the scene T2 R2 R3 T1 N2 R1 N3 L3 N1 Point lightsource Photon Mapentries
Excursion: Path tracing So far „recursive Raytracing“ “wastes most computationson little contribution”
New idea: „Path Tracing“ Consider only a single path through the tree at a time ... and use Russian roulette to compute multiple paths
Back to Photons N1 N1 N1
Why path-tracing for photons? Constant photon energy Well defined number of Photons in map Problem: Aliasing
What to store in the photon map? struct photon { float x,y,z; // position char phi, theta; // incident direction char p[4]; // color } // phi = 255 * (atan2(dy,dx)+PI) / (2*PI); // theta = 255 * acos(dx) / PI;
How to store photons? • in a list / an array • simple • search operations O(n) • in a grid • memory intense • search operations O(1) • in a tree / kd-Tree • memory efficient • search operations O(log n)
A “balanced” kd-Tree pointList = [(2,3), (5,4), (9,6), (4,7), (8,1), (7,2)] tree = kdtree(pointList)
Pass 1 Shooting: Summary • For every light source • For a given number of photons • Choose random position (not for point lights) • Choose random direction • Start path tracing from light source • Stop in diffuse or absorbtion cases • If diffuse: store position and direction in list • Convert list to kd-tree
Pass 2 Rendering Photon Map per se can not be rendered
Splitting up the RE Direct illumination from LS Specular from caustics and diffuse illumination Diffuse from caustics illumination Diffuse from diffuse incoming illumination
Splitting up the RE Direct illumination from LS Specular from caustics and diffuse illumination Diffuse from caustics illumination Diffuse from diffuse incoming illumination Raytracing: ShadowCaster
Splitting up the RE Direct illumination from LS Specular from caustics and diffuse illumination Diffuse from caustics illumination Diffuse from diffuse incoming illumination Raytracing: Shadow Caster Raytracing: Monte-Carlo Raytracing
Splitting up the RE Direct illumination from LS Specular from caustics and diffuse illumination Diffuse from caustics illumination Diffuse from diffuse incoming illumination Raytracing: Shadow Caster Raytracing: Monte-Carlo Raytracing Photon Map: Direct Radiance Estimate
Splitting up the RE Direct illumination from LS Specular from caustics and diffuse illumination Diffuse from caustics illumination Diffuse from diffuse incoming illumination Raytracing: Shadow Caster Raytracing: Monte-Carlo Raytracing Photon Map: Direct Radiance Estimate Photon Map: Indirect Radiance Estimate
Irradiance Cache Instead of computing the Indirect Radiance Estimate, compute the irradiance of a given pixel from the irradiance values of its neighbors; „if possible“.
More Images 1 000 000 Photons, 100 Photons forradianceestimate, 11 Minutes
Realtime Photon tracing on GPUs 0.05 Seconds http://wwwcg.in.tum.de/Research/Publications/Photons/