Physically Based Real-time Ray Tracing Ryan Overbeck
Overview Ray tracing –Broadest success at solving physically based rendering tasks. –But is slower than Z-Buffer (for primary visibility) Real-time Ray Tracing –Recent algorithmic improvements make real-time ray tracing possible –Most of these algorithmic improvements have only been demonstrated for primary visibility w. point light shadows Physically Based Ray Tracing –Uses Path Tracing / Monte-Carlo ray tracing for physical effects –Consistent algorithmic improvements over the years –Very Slow Currently Real-time and Physically Based ray tracing algorithms don’t work well together
Real-time Ray Tracing Ray Packets: Shoot 4 or 4x4 (or more) rays at a time –Neighboring rays take similar paths through the scene –Use SIMD (ie. SSE) instructions to perform one instruction on 4 floating point values at once –Use interval arithmetic to use a single test to represent the entire packet Geometry Proxies: Frustum Traversal, LCTS… –Use bounding geometry to represent a larger group of rays (usually 16x16 – 128x128) Miscellaneous Improvements –Improved Acceleration Structures, –Geometry Intersection tests, –Multi-threading for multi-core architectures, –…
Physically Based Ray Tracing Effects –Image anti-aliasing, Motion Blur –Complex Lighting (soft shadows, hard shadows, environment lighting, ambient lighting, inter-reflections…) –Complex Materials (perfect reflection, glossy reflection, subsurface scattering,…) –Film / Lens effects (depth of field, bloom, …) Tools –Intelligent sampling distributions (Stratified Sampling, Importance Sampling, Low discrepancy sampling, Poisson Disc Sampling, …) –Adaptive / Interpolated Sampling –Image / Film processing (filters, tone mapping,…)
My Goals Long Term: –Design algorithms to marry real-time ray tracing with physically based ray tracing Short Term: –Build a Framework within which I can experiment Where to start? –MLRT – fastest real-time ray tracer »Would need to make it more general »Highly optimized code very difficult to modify –PBRT – Most general Free physically based ray tracer »Would need to make it fast »Very nice design: easy to modify
Progress Started overhaul of PBRT –Tightened up kd-tree traversal code –Added accelerations for ray vs. triangle intersection –Parallelized PBRT -- multi-core processors Tile image space (usually 64x64 tiles) statically assign tiles to threads –Added 4-ray packets for primary rays Shoot 4 rays at a time Use SIMD SSE to accelerate ray traversal
Test Setup 512x512 images 1 sample/pixel PBRT low discrepancy sampling for primary samples 2x2 PBRT box filter for image reconstruction 3.0GHz Pentium 4 (2 cores)
Test Setup Scenes Sponza (66454 Triangles) Sibenik (80479 Triangles) Buddha ( Triangles)
Results SponzaSibenikBuddha 1 rays/ 1 thread 2.778s3.266s3.054s 1 rays/ 2 threads 2.327s2.532s3.489s 1 rays/ 4 threads 2.361s2.534s4.384s 4 rays/ 1 thread 1.055s1.041s1.684s 4 rays/ 2 threads 0.835s0.775s1.656s 4 rays/ 4 threads 0.776s0.819s1.514s
Next Steps Tighten up samplers and image filtering –These two are adding ~.3 s to 512x512 render time (almost as much as ray casting) Larger ray packets (esp. 4x4) Add Frustum Traversal Move to secondary effects –This will mark the beginning of new research territory