Hubbry Logo
OpenVDBOpenVDBMain
Open search
OpenVDB
Community hub
OpenVDB
logo
7 pages, 0 posts
0 subscribers
Be the first to start a discussion here.
Be the first to start a discussion here.
OpenVDB
OpenVDB
from Wikipedia
OpenVDB
DevelopersDreamWorks Animation, Academy Software Foundation
Initial releaseAugust 3, 2012; 13 years ago (2012-08-03)
Stable release
13.0.0[1] Edit this on Wikidata / 4 November 2025; 3 months ago (4 November 2025)
Written inC++
TypeSoftware library
LicenseMozilla Public License 2.0
Websiteopenvdb.org
Repositorygithub.com/AcademySoftwareFoundation/openvdb

OpenVDB is an open source software library for working with sparse volumetric data. It provides a hierarchical data structure and related functions to help with calculating volumetric effects in CGI applications. Volumetric effects apply to volumes, as opposed to just on surfaces. An example is fog.

Specifically catering for feature film production, the library was originally developed by DreamWorks Animation and is currently maintained by the Academy Software Foundation (ASWF). The primary authors are Ken Museth, Peter Cucka, Mihai Aldén, and David Hill. OpenVDB is written in C++ and has Python bindings.

OpenVDB is supported in a wide range of CGI software, such as Blender (since April 2016), Cinema 4D, Houdini, and RenderMan. It was first used in the films Puss in Boots (2011)[2] and Rise of the Guardians (2012).

What does VDB stand for?

[edit]

Over the years VDB has been interpreted to mean different things, none of which are very descriptive: "Voxel Data Base", "Volumetric Data Blocks", "Volumetric Dynamic B+tree", etc. In early presentations of VDB even a different name was used, "DB+Grid", which was abandoned to emphasize its distinction from similarly named, but different, existing sparse data structures like DT-Grid or DB-Grid. The simple truth is that "VDB" is just a name.[3][4]

References

[edit]
[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
OpenVDB is an open-source C++ library that implements a novel hierarchical and a suite of tools for the efficient storage, compression, and manipulation of sparse, time-varying volumetric data on 3D grids. Developed initially at for volumetric effects in production, it enables fast to voxels with constant-time , making it ideal for large-scale simulations and rendering tasks in . The library's development began in 2007 under the leadership of Ken Museth, evolving through internal tools like DB-Grid and VDB before being released as open-source software in August 2012. In 2018, governance and maintenance transitioned to the Academy Software Foundation (ASWF), an organization backed by the Academy of Motion Picture Arts and Sciences and the Linux Foundation, ensuring sustained community-driven evolution. Key contributors have included Peter Cucka, Mihai Aldén, David Hill, and teams from studios like DNEG and NVIDIA, who have added features such as particle support (OpenVDB Points in 2016), a high-level shading language (OpenVDB AX in 2018), GPU-optimized variants (NanoVDB in 2020), and interfaces like OpenVDBLink for Mathematica (2022). Recent developments as of 2025 include the release of OpenVDB 12.1.0 in August, enhancing GPU tools and performance. OpenVDB has earned multiple Scientific and Technical s for its innovations: a Technical Achievement in 2014 to Museth, Cucka, and Aldén for its creation, and a Scientific and in to Museth, Cucka, and Aldén for its ongoing impact in the motion picture industry, alongside a Technical Achievement to Jeff Lait, Dan Bailey, and Nick Avramoussis for its continued feature expansions. Its core strengths include support for various grid types (e.g., level sets, volumes, and vector grids), advanced operations like morphological and topological , mathematical transforms, and integration with rendering pipelines, all while handling massive datasets that traditional dense arrays cannot efficiently manage. Widely adopted in visual effects pipelines at studios like DreamWorks, , and Weta Digital, OpenVDB also extends to real-time applications, scientific simulations, and tools like Houdini and through bindings in Python and other languages, with recent enhancements in 's Nodes for volume as of October 2025.

Overview

Definition and Purpose

OpenVDB is an open-source C++ library designed for the efficient storage and manipulation of sparse, volumetric data discretized on three-dimensional grids, employing a hierarchical data structure particularly suited for level-set representations. Developed initially at DreamWorks Animation, it provides a suite of tools for handling high-resolution, time-varying volumes while supporting dynamic topology changes. The primary purpose of OpenVDB is to enable memory-efficient representations of 3D voxel grids in applications requiring large-scale simulations and rendering, such as (VFX) production, where traditional dense grids become computationally and storage-prohibitive due to their uniform allocation of memory across empty space. By focusing on sparsity, it facilitates operations like numerical simulations, , and voxelization without the overhead of fully populated arrays, making it indispensable for industry workflows involving complex phenomena like fluids, smoke, and clouds. The acronym VDB stands for "Voxel Data Base," highlighting its database-like organization for managing data hierarchically. Key benefits include a dramatically reduced for sparse data—for instance, storing data equivalent to 228 million voxels in approximately 1 GB, compared to 14 TB for a dense grid of similar effective resolution—and constant-time to individual voxels. This efficiency stems from its sparse hierarchical node structure, which allocates storage only where data is present.

Core Principles

OpenVDB's design is fundamentally driven by the principle of sparsity, which addresses the inefficiency of traditional dense volumetric representations in handling large-scale 3D data with vast empty regions. By storing only non-zero or active voxels—those containing meaningful values—OpenVDB minimizes memory usage while enabling efficient manipulation of high-resolution volumes that would otherwise require prohibitive resources. This approach is particularly suited for sparse data sampled at high spatial frequencies, such as those encountered in simulations, where dominates the domain. At the heart of this sparsity is a based on a multi-level , typically comprising a root node, internal nodes, and leaf nodes arranged in fixed depths to achieve logarithmic access times. The root and internal nodes manage coarser representations of the volume using sparse indexing mechanisms, while leaf nodes store dense arrays of fine-grained data. This B-tree-like ensures cache-coherent, near-constant-time to any , regardless of the grid's overall size, by traversing only the relevant branches of the tree. A key application of these principles lies in the representation of level sets and signed distance fields (SDFs), which implicitly define surfaces through the distance from the nearest surface point, with positive values outside and negative inside the surface. OpenVDB stores these as narrow-band level sets, confining active voxels to a thin band around the surface (typically three voxels wide) to exploit sparsity, while inactive regions are represented by constant background values. This enables efficient modeling with dynamic changes, such as those during fluid simulations. OpenVDB further distinguishes itself by supporting both bounded and unbounded grids, allowing representation of infinite domains through adaptive refinement without fixed spatial limits. Unbounded grids leverage the hierarchical to extend dynamically into index , constrained only by coordinate precision (e.g., 32-bit integers), while bounded variants map to finite world spaces via affine transforms. This flexibility accommodates diverse applications, from localized effects to expansive environments.

History and Development

Origins and Initial Release

OpenVDB originated at DreamWorks Animation, where it was developed to overcome memory and performance limitations in processing large-scale volumetric effects, such as smoke, fire, and water simulations, which are common in feature film production. The project addressed the challenges of handling sparse, high-resolution voxel data that traditional dense grid formats struggled with, enabling more efficient storage and manipulation for visual effects pipelines. This need was particularly driven by the demands of animated films requiring dynamic topology changes in volumetric elements, as seen in productions like Puss in Boots (2011) and Madagascar 3: Europe's Most Wanted (2012). The primary creator was Dr. Ken Museth, a principal research lead at , who led the development alongside key contributors including Peter Cucka, Mihai Aldén, and David Hill. Museth's work built on earlier research into sparse volume representations, motivated by the growing complexity of volumetric simulations in films like How to Train Your Dragon 2 (2014), where expansive effects demanded scalable s. The team's goal was to create a hierarchical that provided compact storage, fast , and support for time-varying data, while fostering across VFX tools to move away from proprietary formats. OpenVDB was first released to the open-source community on , 2012, under a custom DreamWorks that encouraged adoption in the VFX industry. This initial version emphasized tools for representations and sparse volumetric processing, aiming to standardize data interchange in production pipelines and enable broader collaboration. The project later transitioned to more permissive governance under the Academy Software Foundation in 2018, enhancing its accessibility and long-term maintenance.

Major Milestones and Versions

OpenVDB achieved early adoption milestones shortly after its open-source release in , with integration into SideFX Houdini version 13 in November 2013, allowing artists to leverage its sparse volumetric tools directly within the software's node-based workflow. This facilitated its uptake in production environments, including by leading studios such as (ILM) and Weta Digital, where it became essential for simulating and rendering complex effects like fluids and smoke in feature films. Version 3.0, released in January 2015, marked a significant technical advancement by introducing multi-threaded operations in core tools such as prune, signedFloodFill, changeBackground, and LevelSetTracker methods, enabling scalable processing of large datasets on multi-core systems. It also added delayed loading for .vdb files to reduce memory usage during I/O and incorporated Blosc LZ4 compression. In August 2018, OpenVDB transitioned governance from to the Academy Software Foundation (ASWF), the first project hosted by this Foundation-backed organization, which broadened collaboration across the VFX industry. Subsequent releases built on this foundation, with version 6.0 in December 2018 providing performance optimizations for mesh-to-volume conversion and point data handling, alongside improvements to tools for point grids. Version 7.1.0 in August 2020 introduced the FastSweeping class for signed distance fields and SDF/fog conversion tools. Version 9.0 in October 2021 integrated NanoVDB, a GPU-optimized variant supporting for accelerated rendering and computation on hardware, while version 10.0 in October 2022 extended this with tools like OpenVDBLink for Mathematica integration and further ValueAccessor performance gains. Updates in version 11.0, released in November 2023, improved Python bindings with expanded support for point data modification and tree hierarchy access, simplifying scripting and integration in diverse workflows. To further encourage community contributions, OpenVDB relicensed from the 2.0 to 2.0 with version 12.0 in October 2024, aligning with ASWF standards for permissive use and redistribution. As of November 2025, subsequent minor releases included version 12.1.0 in August 2025, which added new level set constructors such as createLevelSetCapsule, and version 13.0.0 on November 3, 2025, introducing Half Grid support and enhancements to NanoVDB for dynamic topology.

Technical Architecture

Sparse Hierarchical Data Structure

OpenVDB employs a sparse hierarchical data structure based on a B-tree-like architecture to efficiently represent volumetric data, where the root node serves as the top-level index for the entire volume and subdivides the index space into 3D child nodes. This root node has no fixed size limit and uses a dynamic table to manage child nodes, enabling scalable storage for large volumes while only allocating nodes for regions containing relevant data. The structure achieves adaptive resolution by refining detail only in areas with non-zero or active data, utilizing a three-level beneath the : the first internal level covers blocks of 32³ voxels per node, the second internal level covers 16³ voxels per node, and leaf nodes store 8³ voxels each. This configuration, with log₂ dimensions of 5, 4, and 3 for the internal and leaf levels respectively, allows for high-resolution sampling in sparse regions without wasting memory on empty space, as inactive tiles propagate constant values down the tree. Access to individual voxels occurs through traversal of this , yielding constant of O(1) due to the fixed and efficient node lookup mechanisms. Value accessors facilitate cached, bottom-up traversal for rapid queries, while thread-safe alternatives ensure concurrent access without caching overhead. The data structure supports multiple data types through templated grids, including FloatGrid for scalar densities, Vec3SGrid for short vector fields like velocities, and BoolGrid for masks, all sharing the same hierarchical framework. Compression techniques, such as bitmasks for active states and quantized values in nodes, further optimize storage but are applied at the node level without altering the core hierarchy.

Node Types and Levels

OpenVDB employs a multi-level hierarchical composed of distinct node types that enable efficient sparse representation of volumetric . The typically consists of a root node at the highest level, one or more levels of internal nodes, and nodes at the lowest level. Each node type serves a specific role in indexing and storing , with the designed to balance memory efficiency and access speed. The default configuration uses four levels, where the log2 dimensions of nodes are parameterized as 5 for the upper internal level, 4 for the lower internal level, and 3 for the level, corresponding to table sizes of 32×32×32, 16×16×16, and 8×8×8 respectively. Leaf nodes, positioned at level 0, store the actual in a dense 8×8×8 grid, where each holds a value and an active state. These nodes encode using a bitmask for active/inactive states and store values in a dense direct access table (buffer) of 512 entries, one for each in the 8×8×8 grid. While memory is allocated for all s in an existing leaf node, inactive s return the background value on access, and overall sparsity is maintained by allocating leaf nodes only in regions with active . Internal nodes, at levels 1 and 2 in the default setup, act as branching indices, each maintaining a fixed-size table of pointers to child nodes or uniform tile values for unoccupied regions; for instance, a level 1 internal node indexes 16×16×16 possible child leaf nodes or tiles. The root node, at the highest level (level 3 by default), is a specialized internal node without a fixed table size, instead using a hash map to manage pointers to its child internal nodes, effectively defining the global index space without imposing hard bounds. The hierarchy supports active and inactive states not only at the level but also propagating upward: a node is considered empty (and can be ) if all its descendants are inactive or uniform, replacing the subtree with a single tile value to maintain sparsity. This mechanism ensures that only regions with meaningful data are allocated, with tools like the prune method optimizing the by removing such inactive branches. Levels and node dimensions are configurable through C++ template parameters, such as in tree::Tree4<ValueType, Log2Dim1, Log2Dim2, Log2Dim3>, allowing users to adjust branching factors for different resolutions or performance needs, though the default is optimized for typical workflows. Leaf nodes optionally support multiple buffer layers within their value tables to facilitate operations like numerical time integration, where separate buffers store states at different timesteps—for example, three buffers for a third-order Runge-Kutta scheme in simulations—without requiring additional node allocation. This buffering aids boundary handling in dynamic simulations by preserving temporal data locally, though it does not introduce explicit beyond the fixed 8×8×8 extent.

Storage and Compression Mechanisms

OpenVDB employs a combination of hierarchical sparsity and specialized compression techniques to minimize memory usage for volumetric data, particularly in scenarios with large empty regions typical of and simulations. The core storage relies on bitmasks within nodes to encode active efficiently, avoiding allocation for inactive voxels, while additional codecs handle value data. These mechanisms enable substantial reductions in both in-memory footprint and on-disk size, with the sparse structure alone providing orders-of-magnitude savings for datasets where active voxels constitute a small fraction of the total volume. For leaf nodes, which store the finest-level 8×8×8 grids, Blosc compression is applied to the value buffers containing floating-point data, offering faster encoding and decoding than traditional ZIP while achieving competitive ratios for sparse floats. Blosc operates by chunking data and applying a combination of shuffling, bitshuffle, and LZ4 or compression, tailored for numerical arrays, and is enabled via the COMPRESS_BLOSC flag during file I/O. In practice, this yields significant size reductions for sparse datasets, with reported improvements in compression ratios and write times through larger block sizes in recent versions. OpenVDB distinguishes between topology-only and full compression modes to suit different use cases. Topology-only storage, activated via the COMPRESS_ACTIVE_MASK option, encodes solely the bitmask of active voxels (a 64-bit or 512-bit structure per node indicating which child tiles or voxels are present), omitting value data entirely; this is ideal for applications focused on surface extraction or operations where values can be reconstructed later. Full compression extends this by including compressed value arrays for active elements, using Blosc or ZIP on the buffer of non-uniform values, while uniform tiles are represented by a single scalar to exploit spatial coherence. The bitmask approach alone provides lossless topology compression, with further gains from value codecs in full mode, as demonstrated in early VDB implementations where combining bitmasks with reduced file sizes by 13-25% beyond sparsity alone. Quantization further optimizes storage by reducing precision for auxiliary data channels, such as velocities or attributes, where full 32-bit floating-point accuracy is unnecessary. The RealToHalf mapping truncates values to 16-bit half-floats during , halving the per-voxel size without altering the tree topology, and is particularly effective for secondary grids in simulations; this can be combined with Blosc for compounded savings, though it introduces minor lossiness. The .vdb encapsulates these mechanisms in a custom binary structure, beginning with a header containing a magic number, version identifiers, and a unique UUID for versioning and integrity. Metadata, such as grid names, active counts, and bounding boxes, precedes the serialized grids, which are stored as trees with optional instancing to avoid duplication of shared content; compression flags and offsets enable and partial loading. This design supports both in-core and out-of-core workflows, with grids written in a self-describing manner akin to hierarchical containers, though it is a format optimized for volumetric data rather than a general-purpose library like HDF5.

Operations and APIs

Data Access and Iteration

OpenVDB provides efficient mechanisms for accessing and iterating over data within its sparse grids, leveraging the hierarchical structure to minimize unnecessary traversals of empty regions. Data access is primarily achieved through the ValueAccessor class, which enables fast random lookups of values at specific integer coordinates in index space, achieving up to three times the performance of direct tree access by caching traversal paths from common ancestors. This accessor supports both read-only and read-write operations, with thread-safe variants available for concurrent modifications, though the latter incurs overhead from internal locking. Iteration over grid is facilitated by specialized iterators that respect the sparse , ensuring constant-time complexity per active . The ValueAllIter provides read/write access to all voxels and tiles within a leaf node, including inactive ones, allowing comprehensive traversal without skipping background values. In contrast, the ValueOnIter iterates solely over active (non-background) values across the entire tree or grid, enabling efficient processing of sparse by visiting only the populated regions in O(1) time per active . These iterators use a to check for completion rather than conforming to standard STL interfaces, optimizing for the hierarchical nature of the as described in the foundational OpenVDB . Coordinates in OpenVDB operate in two primary spaces to balance discrete addressing with continuous spatial queries. Index space employs unit-less integer coordinates (i, j, k) to directly reference voxels, with a continuous extension for sub-voxel during operations like sampling. World space, in turn, provides physical context by transforming index coordinates via a grid-embedded Transform object, which maps between the two spaces using methods such as indexToWorld and supports affine and nonlinear mappings for applications requiring real-world positioning. For local neighborhood queries, OpenVDB's ValueAccessor supports efficient access to the 26-connected neighbors (face, edge, and vertex adjacent voxels) in 3D without loading the entire grid, by exploiting inverted traversal from shared ancestor nodes to retrieve values in constant time relative to the local density. This approach is particularly advantageous for sparse volumes, where full grid loading would be prohibitive, and aligns with the structure's design for high-resolution data. To leverage multi-core processors, OpenVDB supports parallel iteration through integration with , allowing multiple threads to concurrently process disjoint portions of the grid using independent ValueAccessor instances for read-only access, thereby scaling performance linearly with core count on active workloads.

Mathematical Operations

OpenVDB provides a suite of built-in mathematical operations for processing sparse volumetric data, particularly focused on representations using signed distance functions (SDFs). These operations leverage the library's hierarchical structure to efficiently handle large-scale computations while preserving sparsity. Key algorithms include (CSG) operations for combining level sets, filtering techniques for smoothing, advection methods for dynamic simulations, and tools to refine the data structure post-processing. Level set operations in OpenVDB support CSG primitives such as union, , and (difference) on SDF grids. The union of two level sets ϕA\phi_A and ϕB\phi_B is computed as ϕAB=min(ϕA,ϕB)\phi_{A \cup B} = \min(\phi_A, \phi_B), the as ϕAB=max(ϕA,ϕB)\phi_{A \cap B} = \max(\phi_A, \phi_B), and the as ϕAB=max(ϕA,ϕB)\phi_{A \setminus B} = \max(\phi_A, -\phi_B). These are implemented via threaded, sparse traversal functions in the tools::csgUnion, tools::csgIntersection, and tools::csgDifference utilities, which modify the input grid in place for efficiency and require deep copies of inputs to avoid . While fast marching methods are referenced in the library's level set filtering for reinitialization and interface tracking (drawing from Sethian's foundational work on level set methods), the CSG operations themselves rely on direct min-max evaluations rather than explicit marching solvers. Filtering operations enable smoothing of level set densities and surfaces, with built-in support for Gaussian blur and Laplacian diffusion. The Gaussian filter approximates a 3D Gaussian kernel G(x)=1(σ2π)3exp(x22σ2)G(\mathbf{x}) = \frac{1}{(\sigma \sqrt{2\pi})^3} \exp\left(-\frac{|\mathbf{x}|^2}{2\sigma^2}\right)
Add your contribution
Related Hubs
User Avatar
No comments yet.