Open Sourcing and Customizing Ray Tracing for Efficient Hardware Platforms Support
Posted on May 16, 2016 by Bruno Stefanizzi
A New Milestone
After the success of the first version, FireRays is moving to another major milestone. We are open sourcing the entire library which allows complete integration and contribution from the entire developer community to bring improvements in the rendering world. In fact FireRays 2.0 brings support for Windows, OSX, Linux, AMD, NV, Intel GPUs and CPUs with many back-ends.
We did several integrations into different applications with specific use cases, and decided to provide the best flexibility to developers when integrating FireRays. In fact, they will be able to choose between several low level APIs, OpenCL™ GPU, OpenCL CPU, Embree, etc… (more back-ends like Vulkan™ will come soon, stay tuned!)
Contributions and Multi-Platform Support
In order to encourage contributions and multi-platform support, FireRays has an abstraction layer for the compute part, Calc, to use the intersector API with different low level APIs. It has functionality to create and map buffers, compile and run kernels, synchronize with events, etc. You can create easily your own back-end.
We worked with several rendering engines to bring more performance on the ray casting part of their algorithm. In all applications we were always able to integrate the library in a week or less! We will be able to demonstrate a performance boost in light baking tool for example. Specific path tracers have been using it to bring a performance boost with GPU support quickly. This enabled those studios to focus on their shading algorithm.
The Embree backend has been revisited to support new multithreading decomposition using Embree 2.9.0 as well as ray stream support.
Some Key Features Now Available to Everyone:
• Performance improvements on FATBVH which is binary BVH with staked traversal based on short LDS stack caching.
• Support for geometry and ray masks
• Ray filtering support
Geometry masking is achieved by the Shape::SetMask function, ray mask is set by the Ray::SetMask function. Before doing an intersection test ray and geometry masks are bitwise ANDed and if the result is zero the test is skipped.
Ray filtering is set by Ray::SetActive(true/false). If the ray is inactive it does not participate in intersection and its intersection structure is not updated.
The sample renderer has been improved with better multiple importance sampling and volumetric support to bring a good example of what can be implemented efficiently using FireRays 2.0. It gives you an idea on how easy and quickly you can implement a ray tracing based algorithm or renderer.
We are continuing to improve the performance and back-ends of low level APIs to expand the support and provide new algorithms based on hardware capabilities.