Blender with OpenVDB Integration

This is work that I started in support of various research projects that my group at Wisconsin were performing with simulated fluids. The challenge was that we needed a modern rendering solution for fluid surfaces that could

We had been using Blender for many of our projects before this point, and had quite successfully integrated it into our toolchain for solids rendering. Rendering fluids, however, posed a unique challenge where the surface geometry was extremely complex, time varying, and would have required topological remeshing every frame, risking the introduction of 'popping' artifacts. We had access to an older renderer which could directly render fluids stored as level sets and smoke volumes, via a ray casting algorithm. However, it was slow (not multithreaded!), and its support for dynamic lighting and shading was poor.

In my attempts to get the best of both worlds, I got in contact with Kevin Dietrich who had worked on integrating OpenVDB support into Blender for the purposes of rendering smoke and meshing particles. Using his changes as a foundation, I moved on to add support for rendering level sets as surfaces within Cycles, including shader support.

Anyone who is interested in checking out the current status of this project can checkout my modified Blender codebase here:
blender-cycles_openvdb @ github

Here are some sample videos created with the OpenVDB enhanced Blender. These simulations were done with our group's own fluid simulation solver and then exported to OpenVDB for rendering within Blender. For more information on the simulations and the solver used to produce them, please take a look at our Siggraph Asia 2016 publication on scalable Schur-complement fluids.
This is a realistic style render, where the fluid is rendered with a clear glass surface shader and a volumetric absorption node for the blue tinting. Total render time was approximately 360 CPU hours, with a frame count of 540 frames.
The same simulation as above, only with a glossy shader colored according to the Z-height of the fluid to highlight detail. Total render time was approximately 346 CPU hours, with a frame count of 520 frames.
In this simulation, water is poured from above into a tray containing sixteen dragon sculptures. Total render time was approximately 213 CPU hours, for a total frame count of 320 frames.
Here, smoke is injected into this model of the human bronchial tubes. The render was produced as an emission render where the emission strength was controlled by an OpenVBD density field and the color was controlled by another OpenVDB field, this time encoding the vorticity of the smoke. Total render time was approximately 378 CPU hours, with a total frame count of 648 frames.
In this last example, thick smoke is injected through a series of angled tubes, creating turbulence. The smoke is rendered using cycles scattering and absorption shaders, whose density and color is controlled, as in the previous example, by OpenVDB fields. The total render time was approximately 5205 CPU hours, with a total frame count of 694 frames. The extreme expense of this render was in part due to trimming computations taken in the cycles shader to remove artifacts near the simulation boundaries, but the absorption and scattering shaders, along with data loading, were the primary culprit. It was for this reason that true smoke rendering was performed for very few scenes in the paper, as we just couldn't afford the time requirements.