Page MenuHome

New volume object type
Confirmed, NormalPublicTO DO

Assigned To
Authored By
Brecht Van Lommel (brecht)
Jan 17 2020, 5:07 PM
"Love" token, awarded by skyscapeparadise."Burninate" token, awarded by Draise."Love" token, awarded by IagoMota."Love" token, awarded by marcuspollio."Like" token, awarded by Moamen."Like" token, awarded by DaveDeer."Like" token, awarded by Pipeliner."Love" token, awarded by vklidu."Love" token, awarded by gilberto_rodrigues."Love" token, awarded by kivig."Love" token, awarded by pierogo."Love" token, awarded by shafannazim."100" token, awarded by Dir-Surya."Love" token, awarded by 3di."Love" token, awarded by shader."Love" token, awarded by mistajuliax."Love" token, awarded by eversimo."Love" token, awarded by PiloeGAO."Love" token, awarded by dylanneill."Love" token, awarded by Way."Love" token, awarded by arc4g."Love" token, awarded by corpse."Love" token, awarded by Beckersc."Love" token, awarded by 1D_Inc."Love" token, awarded by juang3d."Like" token, awarded by Fracture128."Burninate" token, awarded by amonpaike."Love" token, awarded by RC12."100" token, awarded by Peine_Perdue."Burninate" token, awarded by Kubo_Wu."Love" token, awarded by bintang."Like" token, awarded by TheRedWaxPolice."Like" token, awarded by sebbas."Like" token, awarded by evilvoland."Love" token, awarded by Shimoon."Love" token, awarded by Bit."Love" token, awarded by ofuscado."Love" token, awarded by MetinSeven."Love" token, awarded by jfmatheu."Love" token, awarded by BlackRainbow."Love" token, awarded by garyo123."Love" token, awarded by CobraA."Party Time" token, awarded by franMarz."Love" token, awarded by Scaredyfish."Love" token, awarded by Ztreem."Like" token, awarded by sng84."Love" token, awarded by wilBr."Love" token, awarded by charlie."Burninate" token, awarded by zinar."Love" token, awarded by xrg."Love" token, awarded by billreynish."Like" token, awarded by EAW."Like" token, awarded by Schamph.


Status: Initial part of milestone 1 merged into master.


Commissioner: ?
Project leader: @Brecht Van Lommel (brecht)
Project members: @Sebastián Barschkis (sebbas) @Jacques Lucke (JacquesLucke)


Big picture: Volumes need their own native datablock type, so Blender can support other use cases like rendering OpenVDB files or procedurally generating volumes.

Use cases:

  • Existing use cases (smoke modifier on mesh).
  • OpenVDB file rendering.
  • Procedurally generating volumes (part of everything nodes).


  • New Volume datablock (similar to Mesh) with an OpenVDB volume data structure with an arbitrary number of attributes.
  • Rendered by Cycles and Eevee, first as dense volume as we have now, and later with native sparse volume rendering.
  • Volume objects would have modifiers (add resolution detail, fluid domain modifier, ...)

Engineer plan: ?

Work plan

Milestone 1
Time estimate: 10 workdays to complete implementation, 5 for review/docs/bugs.

Completed for merge into Master.

  • New volume object data type, based on OpenVDB grids
    • Support reading OpenVDB files from disk
    • Add New material adds principled volume material
    • Solve problem with not enough FILTER_ID bits
    • Show warning when loading VDB points file
    • Auto rotate object from Y-up to Z-up when file was written by Houdini?
  • Rendering of dense grids
    • Cycles
      • Basic integration
      • Use principle volume as default material if no material exists
      • Support different transform per grid
    • Eevee
      • Basic integration
      • Use principle volume as default material if no material exists
      • Support rotation/shear in transform
      • Shader code generation for arbitrary number of grids
      • Support different transform per grid
    • Workbench
      • Basic integration
      • Control over which grids to display (active grid only by default?)
      • Use workbench object color settings
      • Density scale setting
      • Figure out why density changes with object scale
    • Add option to specify volume density in object space
    • D1777: Cycles: implement per shader volume step size.
  • Viewport drawing and selection of volume bounds
    • Wireframe bounds display of tree nodes (at intermediate or leaf levels)
    • Points display type, that shows one point per coarse/fine node
    • Selection support (based on wireframe bounds?)
  • User interface
    • Open file browser immediately from Add menu
    • VDB / volume file type in the file browser
    • Drag & drop VDB files into 3D viewport
    • Finalize properties editor UI layout
  • Python API
    • Grids
    • Transforms
  • File loading
    • Error reporting
    • On-demand loading
    • Global cache
  • Dependency graph copy-on-write integration
    • Refactor mesh runtime storage to be reusable by other objects types
    • Automatic instancing for objects without modifiers, like meshes
    • Fix runtime backup memory leak
  • Volume frame sequences
    • Settings to use single volume or sequence, start, length, offset
    • Dependency graph integration
    • Auto detection of sequences when loading file

Time estimate: ?

  • Viewport selection by rendering fine boxes when drawing for selection (current volumes can't be selected except through the outliner or the origin point if visible)
  • Workbench: additional viewport display options
  • Option to use lower resolution volume for viewport display

Time estimate: ?

  • Option to pick byte/half/float precision for 3D texture in Cycles and Eevee
  • Eevee/workbench
    • Share textures in global volume cache
    • Preserve batch cache through display setting changes
    • Sparse grid rendering using NanoVDB
  • Cycles
    • Optimize mesh bounds creation by using OpenVDB tree
    • Sparse grid rendering using NanoVDB (D8794)
    • Share 3D images like global volume cache
  • Auto complete grid names in shader nodes

Time estimate: ?

  • Mesh to Volume modifier
  • Points to Volume modifier (from PointCloud or Mesh) _as a node_
  • Volume to Mesh modifier
  • Displacement modifier (D9075)
  • Texture modifier with blending modes (add, multiply)
  • Filter modifier (dilate, erode, blur, sharpen, ...)
  • Fluid Simulation modifier, replacing the current modifier on meshes for gasses (not liquids)


  • Mantaflow: output OpenVDB files with multiple grids and standard grid names
  • VDB tree/voxels API using pyopenvdb
  • File packing
  • File saving
    • Python API
    • Operator in the UI (unclear where still)
  • Grid metadata: show in properties editor
    • In the spreadsheet
  • Support other applications overwriting OpenVDB files open in Blender (T75901)
  • Volume edit mode and file saving
  • OpenVDB level sets, perspective transform
  • Cluster support (multiple grids with the same name and different transform) (T86313)
  • VDB files with modifiers are reloaded whenever parameters are changed, revisit this (memory vs. performance)

Relevant links:

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes

While I assume such things to be sth. like the most low-priority of things to consider with this project, I'd still like to know in how far the new volume-object type could serve as groundwork for future support of pointclouds via OSL as per chapter 7.9 (page 72) in

Oh and sorry in advance in case this is the wrong place to ask this. :-)

Point-cloud sampling in OSL would share no code with the volume object, so basically unrelated. The current pointcloud texture converts point clouds to a volume, but really that's too inefficient.

Importing and rendering or shading vdb work fine but not with sequence. That only works in the viewport but the render is empty.

Still such a great addition to blender. Thanks Brecht for the work on it.

We're reviewing an in-house patch right now that's per-object (not per-shader) step size as a user parameter, not determined automatically at the moment. Rationale for per-object is that we tend to reuse the same shader for multiple VDB objects, which may have different resolutions and densities.

We might also have a patch for eulerian motion blur soon.

We have some in-house code for CPU-only sparse grids using OpenVDB directly. It's not necessarily pretty and it comes with performance penalties, not sure how useful this will be for the general audience.

I agree per-object step size makes more sense, I was thinking about changing it to that. Probably also change it from step rate to step size, but still with a way to fill it in automatically.

We wouldn't use OpenVDB directly, since we want it to work on the GPU too, and the OpenVDB implementation in Interpolation.h has poor performance. I'm hoping we can do sparse volume rendering in Cycles for 2.83 since it would be really nice to render complex volumes, but probably I won't have time for it.

Any plans to access voxel data for particle system? Like to control density of VDB animation. Thank you for more info.

One of my goal was to meshing volumes (that could be done with particles generated from density with Metaballs assistance in 2.79 ), but since this way is completely buggy (due the lag of particle refresh and reassigning the Voxel Data issue) it makes voxel animation impossible in 2.79 and inaccessible in 2.83 for now, right?

@filip mond (vklidu) this will become possible with D4960, there is no Blender volume object involved in that.

For some reason this new update D9141 was not posted in here, and the volume to mesh modifier checkbox is still not checked, I was not aware of its existence until somebody told me about this today. I was like, no way, I subscribed to this post, how come I am knowing this later than you, lol.