Incremental Instant Radiosity for Real

Download Report

Transcript Incremental Instant Radiosity for Real

Incremental Instant Radiosity for
Real-Time Indirect Illumination
Samuli Laine1,3 Hannu Saransaari3
Janne Kontkanen2,3 Jaakko Lehtinen3,4
Timo Aila1,3
1NVIDIA
Research 2PDI/DreamWorks
3Helsinki University of Technology 4Remedy Entertainment
Motivation
• Indirect illumination looks good
Direct + constant ambient
Direct + 1 bounce indirect
Previous Work
• Instant radiosity [Keller 97]
• Interleaved sampling [Keller & Heidrich 01]
– Hardware implementation [Segovia et al. 06]
• Large-scale interactive indirect illumination
– Ingo Wald’s PhD thesis [Wald04]
– Precomputed transport [Kristensen et al. 05]
• Reflective shadow maps, Splatting indirect
illumination [Dachsbacher&Stamminger 05] x 2
Instant Radiosity Howto
• Trace light paths from light source
• Place virtual point lights (VPLs) at
intersections
• Render scene, use VPLs as 180o spots
• Global illumination ensues
One-Bounce Indirect Illumination
Tabellion and Lamorlette, SIGGRAPH 2004
• Officially close enough to full GI solution
• Terminate light paths at first intersection
Baseline 1-Bounce Instant Radiosity
• Cast a bunch of rays from the light source
– Rays must be distributed according to the
emission function
• At each hit point, construct a VPL
– Render shadow map (paraboloid)
– Yes, that’s a lot of shadow maps to render per
frame
• Gather illumination from all VPLs
– Yes, that’s a lot of shadow map lookups per
pixel
What to do?
The Recipe for Success
Old ingredients
• Instant radiosity with single bounce
• Interleaved sampling
• Paraboloid shadow mapping
New ingredients
• Reuse of VPLs
• ... and that’s about it
VPL Reuse
• Reuse VPLs from previous frame
– Generate as few new VPLs as possible
– Stay within budget, e.g. 4-8 new VPLs/frame
+ Benefit: Can reuse shadow maps!
! Disclaimer: Scene needs to be static
§ Note: Illumination does not lag behind
How To Reuse VPLs
• Every frame, do the following:
– Delete invalid VPLs
– Reproject existing VPLs to a 2D domain
according to the new light source position
– Delete more VPLs if the budget says so
– Create new VPLs
– Compute VPL intensities
2D Domain for VPLs
• Let’s concentrate on 180o cosine-falloff
spot lights for now
• Nusselt analog
Uniform distribution in unit disc
= Cosine-weighted directional distribution
Reprojecting VPLs
•
•
•
•
So we have VPLs from previous frame
Discard ones behind the spot light
Discard ones behind obstacles
Reproject the rest
Spatial Data Structures
• Compute Voronoi diagram and Delaunay
triangulation for the VPL point set
Deleting VPLs
• Greedily choose the ”worst” VPL
= The one with shortest Delaunay edges
Generating New VPLs
• Greedily choose the ”best” spot
= The one with longest distance to existing VPLs
Computing VPL Intensities
• Since our distribution may be nonuniform,
weight each VPL according to Voronoi area
Omni Lights?!
• Perform all 2D domain actions on the
surface of unit sphere
• Blunder in the paper
– Surface of 3D tetrahedralization = convex hull
– Would’ve been a lot simpler and faster 
Interleaved Sampling
• Reduces the number of shadow map
lookups per pixel
• For each pixel, use a subset of all VPLs
• Apply geometry-aware filtering
Results
• 256 VPLs in all scenes
• Budget: 4-8 new VPLs per frame
• GeForce 8800 GTX
Cornell
Triangles:
original
tessellated
32
4.4k
Resolution
1024×7680
1600×1200
Time (ms)
13.9
26.8
FPS
65.1
29.7
Maze
Triangles:
original
tessellated
55k
63k
Resolution
1024×7680
1600×1200
Time (ms)
15.6
28.6
FPS
49.2
28.5
Sibenik
Triangles:
original
tessellated
80k
109k
Resolution
1024×7680
1600×1200
Time (ms)
17.0
30.1
FPS
48.6
25.9
Limitations / Future Work
• Not full GI
– Well, we could use entire light paths, but that
would lead to many faint VPLs
– Feasible at some point in future
• Diffuse surfaces only
– Slightly glossy should work OK
– Truly glossy won’t work
More Limitations / Future Work
• Not view-dependent
– Distributing VPLs should be based on visual
importance
– Insert heuristics here
• Dynamic scenes non-trivial
– The shadows are wrong for less than a
second when the scene changes, but still...
– Predictive VPL generation could help
Strengths
•
•
•
•
No precomputation
Dynamic objects can receive indirect light
Real-time performance
Simplicity
Thank You
• Questions