Documentation / Node reference / geo nodes

geo/VolumeSmooth

Smooths a volume's voxel values.

Volume

Averages each voxel with its neighbours, which rounds a field off: use it to soften a shape deliberately, or to settle a volume that arrived noisy, from a scan or a file rather than from a clean bake.

**Do not expect it to rescue normals.** A field from geo/VolumeCreate is seeded with exact point-to-triangle distances and propagated exactly, so there is not much left in it to smooth. Measured on a torus at voxel 0.1: the normal error goes from 0.90 degrees to 0.80 at a gradient epsilon of one voxel, and from 2.18 to 2.13 at a twentieth of a voxel. That second number is the one a renderer sees, and it barely moves, because it is the trilinear reconstruction being only C0. Blurring voxel VALUES does not change how they are interpolated between.

**Smoothing shrinks a shape**, because averaging pulls a curved surface toward its own inside, and that effect is not small. Left alone, the same torus loses tube radius: 0.3935 to 0.3880 after one pass, 0.3790 after three. At voxel 0.25 three passes take it from 0.390 to 0.246, which is most of the tube. 'shrink compensation' is Taubin's cure and is ON by default: it follows each smoothing pass with a slightly stronger negative one, so the low frequencies, which is where the shape lives, come back while the high frequencies stay smoothed. With it on, those same runs read 0.3926 and 0.3911 at voxel 0.1, and 0.394 at voxel 0.25. Leave it on unless you want to see what it was doing.

**The output is a smoothed FIELD, not a true distance field.** Smoothing breaks the property that the gradient has length 1, which the raymarch and the ambient occlusion both lean on. In practice a grid field already under-reports (0.948 on the torus above) and one compensated pass leaves that alone (0.948), three take it to 0.943, so at the iteration counts this node is for the change is small. A field that under-reports is safe to march, just slower, and mat/MeshSDF's true-distance-scale param exists to correct the reading. One or two iterations is the useful range; ten is a different shape, not a smoother one.

The attribute is the one to smooth: distance for a field, density for an occupancy volume. Both are just floats per voxel, and both smooth the same way. Iterations of zero passes the volume through unchanged.

Parameters

Name Type What it does
attribute AttributeName Which per-voxel FLOAT attribute to smooth. Distance for a field, density for an occupancy volume.
iterations UInt32 How many smoothing passes. One or two is the useful range; each further pass rounds the shape as well as the noise. Zero passes the volume through untouched.
shrinkCompensation Bool Follow each pass with Taubin's negative pass, which cancels the shrink that averaging causes. Turn it off only to see what it was doing.
allocator UInt8 TEMP · POOL · FLAT_POOL Where the two scratch grids a pass needs come from. They are released as soon as the node is done, but at a large voxel count they are large.

See also

This page is generated from the engine, so it describes the release you can download. The same text is in the editor's Help panel next to the node itself.