Takua Renderer is a physically-based photorealistic 3D renderer I am writing from scratch in C++. Takua is built from the ground up as a global illumination renderer supporting global illumination through several different light transport algorithms, including unidirectional pathtracing with direct light sampling, Veach-style bidirectional pathtracing with multiple importance sampling, progressive photon mapping, and vertex connection and merging. The renderer is still a work in progress, but already supports a large number of features, which are fully listed here. The ultimate objective of this project is to learn about building an advanced production-ready renderer.
Takua Renderer has a highly modular, extensible architecture supporting plugins for many renderer subsystems. The architecture of the renderer achieves highly efficient parallelism through task-based concurrency and Threaded Building Blocks. Much of this model is inspired by concepts from Rob Pike and the GoLang team, and by Eisenacher et al.'s Sorted Deferred Shading for Production Path Tracing paper. Integrators are written to be re-entrant and broken up into numerous smaller tasks, which are mapped onto the TBB task graph. Partial CUDA acceleration is supported through select plugins.
This project has been under active development since 2012 and is currently my primary focus. Takua Renderer is also currently used at Cornell University's Program of Computer Graphics as a research renderer.
Here is a list of the renders that appear in the reel, in order of appearance, along with notes on each image. Unless otherwise noted, all shading, textures, and models are my own. I also lit and staged every image myself.
Room: A highly complex scene containing many objects and complex materials, rendered using vertex connection and merging. All light sources are behind glass (one light source off-camera behind glass windows, one light source in a glass bulb inside of the lamp), making light transport in this scene extremely difficult. The chess pieces, rainbow notebooks, floorboards, and teacups are all instanced geometry. Almost all objects use layered shading and bump mapping. The poster on the back wall is by Alice Yang, the two main furniture pieces are by ODESD2, the flowers are a heavily modified version of a model by Andrei Mikhalenko, and the Braun SK4 record player model is by Bertrand Benoit.
Still Life: A complex scene featuring numerous complex materials, rendered using vertex connection and merging. The ground glass, chessboard frame, notebook covers, and PBRT book cover all use Takua Renderer's layered material system for complex detail such as fingerprint and dust layers. Many objects are also bump mapped. The notebooks and chess pieces are all instanced geometry. More information can be found in this blog post.
Flowers (three images): A modified version of a model by Andrei Mikhalenko, with baked subdivisions weighing in at nearly a quarter of a billion triangles. Rendered with bidirectional pathtracing and depth of field. The flower petals use a double-sided shader to simulate a translucent effect without the full cost of subsurface scattering, and each flower petal's textures has a random hue offset for variation. Fitting this scene in memory required using a special half-precision float mode for storing geometry information. More information can be found in this blog post.
Venus (three images): A model by Zia Zhu with approximately two million triangles, lit by a single small, distance off-camera light source. Rendered using unidirectional pathtracing with direct light importance sampling. Rendered with Takua Renderer's older CUDA mode. More information can be found in this blog post.
Specular-Diffuse-Specular Bunny: A glass Stanford Bunny containing multiple colored spherical lights and diffuse spheres, rendered with bidirectional pathtracing. This scene is dominated by difficult light transport, as a large quantity of specular-diffuse-specular, or SDS, paths exist in this scene. Everything outside of the bunny is lit with caustics from inside of the bunny. More information can be found in this blog post.
Multiple Importance Sampling Scene: A recreation of the famous Eric Veach thesis multiple importance sampling test scene with several varying-size sphere lights and several varying-gloss metal panels. This scene cannot be rendered efficiently without multiple importance sampling; the first image shows the ground truth render, the second image shows importance sampling by BSDF only, the third image shows importance sampling by light only, and the final image shows the better result achieved with the same amount of computation via multiple importance sampling. More information can be found in this blog post.
Ground Glass Globe: A globe with a complex layered shader consisting of a ground glass base layer, a mirror finish landmasses layer, and a dust/fingerprints/scratches layer. Rendered using bidirectional pathtracing with hierarchical adaptive sampling. Takua Renderer's hierarchical adaptive sampler tracks variance and can redirect samples towards higher variance regions and automatically detect a good stopping point for the render. The 500% crop comparison with a non-adaptive sampler render shows that the adaptive sampler can arrive at the same quality level as a non-adaptive sampler with significantly less computational cost. More information can be found in this blog post.
Ground Glass Globe Closeup: A closeup shot of the ground glass globe with depth of field. Rendered using vertex connection and merging.
Physically Based Rendering Book: The famous Physically Based Rendering book, rendered with my physically based renderer. Rendered using bidirectional pathtracing.
Standing Chessboard: A ground glass chessboard with a wooden frame and mirrored lettering. Rendered using bidirectional pathtracing.
Chessboard and Pieces: The same chessboard as before, in addition to ground glass chess pieces. Adaptive firefly suppression was used to automatically detect, supersample, and clamp fireflies. Rendered using bidirectional pathtracing.
Glass Stanford Dragon in Cornell Box: Two famous rendering test models in the same scene. Note the extremely complex caustics on the floor of the box caused by the glass dragon. These caustics are extremely difficult to resolve with naive unidirectional pathtracing. Rendered using vertex connection and merging.
Blue Metal XYZRGB Dragon in Cornell Box: Another two famous rendering test models in the same scene. Note the caustics cast by the dragon's glossy blue metal material. These caustics are extremely difficult to resolve with naive unidirectional pathtracing. Rendered using vertex connection and merging.
For more information about this project, see the Takua Renderer project page.
Ariel is an experimental fluid simulator I wrote from scratch in C++ to explore the popular PIC/FLIP fluid solver algorithm and to evaluate OpenVDB. Ariel supports arbitrary animated meshes as fluid starting volumes and as solid obstacles, and supports exact fluid-solid boundary finding through an integrated raycasting engine. Meshing can either be done natively in the simulator through OpenVDB, or through Houdini integration via Partio. Ariel is multithreaded using Threaded Building Blocks.
This project has been under active development since 2013, although it is something more of a sandbox/hobby compared to the amount of focus I put into Takua Renderer.
Here is a list of the animations that appear in the reel, in order of appearance. All work is my own.
Waterfall Test: A scenario where fluid is constantly added to the scene and cascades down a wall in a waterfall. This simulation was run on a 64x64x64 grid. Whiter particles indicate faster velocity and lower density, while bluer particles indicate slower velocity and higher density. More information can be found in this blog post.
Dam Break Test: A scenario where starts in a large fixed volume and flows to fill a space. This simulation was run on a 128x64x64 grid. Whiter particles indicate faster velocity and lower density, while bluer particles indicate slower velocity and higher density. More information can be found in this blog post.
Dam Break Test Rendered: The same dam break simulation as before, with meshing through OpenVDB and Houdini and rendered with Vray. This animation was rendered with Vray since at the time, my own renderer was not ready. This animation will be re-rendered using Takua Renderer soon. More information can be found in this blog post.
For more information about this project, see the Ariel Fluids project page.