Working with complex scenes in Houdini can feel like a maze, especially when you need precise point distributions. Have you ever spent hours tweaking your Scatter SOP only to end up with uneven clusters?
Finding the right approach to control point density and avoid overcrowded areas is frustrating. Juggling attributes like density and relaxation without introducing artifacts often leads to confusion and wasted render time.
Perhaps you’ve tried basic random distribution and still see unwanted noise or patterns. You need a method to fine-tune your scatter patterns, from terrain coverage to object placement, with predictable results every time.
In this guide, we dive into the fundamentals of the Scatter SOP in Houdini. You’ll learn how to balance density maps, apply relaxation techniques, and build custom distribution workflows that give you full control over your point clouds.
How does the Scatter SOP work: point generation, seeds, sampling modes and internal sampling algorithms?
Houdini’s Scatter SOP begins by generating candidate points on the input surface, using either a fixed count or a mapped density attribute. A seed parameter initializes the pseudorandom number generator, ensuring repeatability. Each candidate undergoes a spacing check against existing points to enforce a minimum distance derived from density or user settings.
The SOP offers three core sampling modes: Uniform treats all facets equally; Weighted reads a point or vertex attribute (for example Cd or density) to bias placement; Relaxed applies Poisson disk principles, iteratively pushing points apart until an even distribution meets the target count or radius criteria.
- Seed: controls random stream for reproducible patterns or variations.
- Poisson disk sampling: enforces minimum spacing, preventing clumping.
- Dart-throwing algorithm: proposes random points, accepts those meeting spacing rules.
- Relax iterations: fine-tune distribution by moving points along local density gradients.
Internally, the SOP indexes existing points in a grid or k-d tree for efficient neighbor queries. When evaluating a new candidate, it only checks nearby cells to confirm no point lies within the forbidden radius. For a density-based distribution, this radius scales inversely with the attribute value, translating painted maps directly into localized scatter control.
Altering the seed or switching modes produces distinct layouts—from tightly clustered clusters in Weighted mode to evenly spaced networks in Relaxed. In production pipelines, combine the Scatter SOP with nodes like Copy to Points, Point Jitter, or Attribute Wrangle to sculpt complex vegetation, debris fields, or instanced geometry setups. Mastering these internal algorithms unlocks precise, procedural placement at scale.
How do I control density precisely using density attributes, texture maps and masks?
Density attribute vs Density parameter: when and how to use each
The Density parameter inside the Scatter SOP offers a quick, uniform control: it multiplies point count by a single value per primitive. In contrast, a density attribute lets you vary point count locally. Create it via an Attribute Wrangle (e.g., @density = noise(@P*3);) or Attribute Create SOP. When the SOP detects a float “density” attribute, it overrides the global slider, distributing points based on your custom map. Use attributes for organic variation, radial falloffs or masks driven by procedural noise.
Using texture maps, UVs and COPs for procedural density and fine detail
To combine image-driven masks with UV layouts, first ensure your geometry has valid UVs. Import a grayscale map in a COP2 network to adjust contrast and tile patterns. Back in SOPs, sample the COP output with a Texture VOP or VEX:
- Use a Bind Map node or texture() function in a Point VOP to read pixel values at @uv.
- Assign the result to @density or remap it with fit() for tighter control.
- Feed that attribute into the Scatter SOP; uncheck “Use Density” on default to let your map drive distribution.
This workflow gives pixel-level control over scatter density. You can paint masks in external tools, tweak them in COPs, then procedurally scatter points exactly where you need detail or sparseness.
How can I apply relaxation: Poisson-disk sampling, iterative relax and constraints to reduce clumping?
When you scatter points over a surface, pure random sampling tends to produce unwanted clusters. By applying relaxation techniques you enforce a more uniform distribution. Houdini’s native Scatter SOP offers built-in Poisson-disk options, but you can also chain SOPs or write VEX for custom control.
Poisson-disk sampling ensures a minimum distance between points. In the Scatter SOP set Distribution Type to “Poisson Disk”, then adjust the Relax Radius and Relax Iterations. A larger radius enforces wider spacing, while more iterations push points to satisfy that spacing across the whole surface.
- Enable Poisson Disk in Scatter SOP’s Distribution tab.
- Set Relax Radius to your target minimum separation.
- Increase Relax Iterations until points converge (typically 5–20).
- Lock the seed for reproducible tiling patterns.
If you require finer control or adaptive relaxation, an iterative SOP workflow lets you drive point positions via VEX. Use a Point Wrangle after scattering:
- pcopen() to gather nearby points within a target radius.
- Compute the centroid of neighbors and move each point fractionally toward or away from it.
- Loop this wrangle in a For-Each loop (or use the Attribute VOP with Iterate Blocks) to simulate relaxation over multiple passes.
- Tweak a relaxation strength attribute (e.g., @relaxScale) to control displacement per iteration.
Finally, real production setups often require constraints to protect features or vary point density. You can:
- Use groups or painted attributes to mask regions where relaxation is disabled or reduced.
- Transfer a volume or edge-distance attribute to drive per-point relax radius via the Density Attribute field in Scatter SOP.
- Blend multiple relaxation passes—first global Poisson, then localized VEX relax within masks—to preserve hard surface breaks or organic clusters.
By combining Poisson-disk sampling, iterative VEX-driven relaxation and constraint masks, you can eliminate clumping while retaining design intent. This procedural chain scales from small props to massive environments without sacrificing control.
How do I create custom distributions: weighted sampling, rule-based masks, and layered scattering workflows?
To achieve precise control over point placement in Houdini’s Scatter SOP, you can combine three core techniques: weighted sampling, rule-based masks, and layered scattering workflows. Each method caters to different distribution needs, from organic noise-driven spreads to strict region-based placements and complex multi-layered assemblies.
- Weighted Sampling: drive density with attribute maps or VEX functions
- Rule-Based Masks: carve the surface with groups, painted masks, or bounding primitives
- Layered Scattering: stack multiple Scatter SOPs and merge for species-specific distributions
Weighted sampling leverages per-point attributes—often named “density” or “dscale”—to bias where points appear. Start by generating a noise field in an Attribute Wrangle: @density = fit(noise(@P*3), -1, 1, 0, 1);. Then enable the Density Attribute parameter in Scatter SOP. The SOP reads your density attribute and spawns more points in high-value regions, creating organic clusters without manual masking.
With rule-based masks, you explicitly define where scattering is allowed or forbidden. Create groups via Group SOPs (Bounding Region or Expression) or paint a mask using Paint SOP targeting a custom color attribute. Reference that group or mask in the Scatter SOP’s Group or Density Mask fields. This approach is ideal when architectural or hard-surface scenes demand strict placement boundaries.
In layered scattering workflows, you combine multiple Scatter SOPs in series or parallel and merge their outputs with a Merge SOP. For example, run one Scatter for large rocks using a low point count and high-scale noise, then a second for pebbles with a denser count on the same surface. Optionally, drive each layer’s mask or density attribute differently to avoid overlap. This modular setup lets you fine-tune each “species” independently, ensuring a balanced, production-ready fill.
How do I optimize Scatter SOP performance and maintain render-quality for large point counts and instancing?
When you push the Scatter SOP to millions of points, both viewport interactivity and final render times can skyrocket. The first step is to minimize unnecessary geometry in the upstream chain. Convert dense meshes into low-resolution proxy versions or use VDBs for scattering. This reduces triangulation overhead and speeds up point generation.
Once you have a manageable point cloud, leverage packed primitives and Houdini’s native instancing workflow. Insert a Pack SOP before your Copy to Points node, enabling “Packed Primitives” and “Pack and Instance” options. Packed instances carry only transform attributes, cutting memory use dramatically. Set the instance file path via an attribute (e.g., instancepath) instead of copying full geometry, so Houdini references the same disk cache for every copy.
Maintaining render-quality at high densities often comes down to judicious use of point attributes and LODs. Store per-point normals or use attribute blur sparingly to avoid flattening detail. If you need variation, drive scale, rotation, and even shader parameters with custom attributes on the point level. At render time, switch between high- and low-resolution instances based on camera distance using a simple if-statement in a detail wrangle.
- Pre-filter your surface with a Group SOP to limit scattering to only essential regions.
- Use Relax iterations selectively: run fewer iterations on dense areas to save compute.
- Leverage Houdini’s procedural caching (ROP Geometry Cache) for point clouds and packed instances.
- Implement camera-based culling by deleting points beyond a defined frustum or distance threshold.