Articles

How to Create a Growing Rust and Corrosion Effect in Houdini

Includes one exclusive complete course

The exclusive course — a full production tutorial you won't find anywhere else, never sold alone.

Best Seller
Most Loved
Tutorial Camera Rig

ADVANCED CUSTOM CAMERA RIG

ANIMATION · CONSTRAINTS · CUSTOM UI

BUILD A FULLY CUSTOM CONSTRAINT-BASED CAMERA RIG IN HOUDINI WITH A CUSTOM UI PANEL. DESIGN FLEXIBLE SYSTEMS FOR PRECISE, CINEMATIC CAMERA ANIMATION ON ANY PROJECT.

€29.99

Freebies
Free Studio HDRI Pack box by Artivoxa showing 60 studio lighting setups with softboxes wrapped around the packaging

Studio HDRI Collection

ASSETS · EXR & HDR · 60 HDRIS

DOWNLOAD 60 STUDIO HDRIS CAPTURED IN A REAL PHOTO STUDIO. LIGHT YOUR PRODUCT AND BEAUTY RENDERS LIKE A PHOTOGRAPHER — SOFTBOX, LANTERN, STRIP AND GRID SETUPS, READY FOR ANY RENDERER.

FREE

ARTILABZ™

Everything You Need to master Houdini.

ARTILABZ™ gives you unlimited access to all Houdini courses, 3D assets, simulation files, textures and tools. updated every month.

01

Premium Houdini Tutorials

Full access to every course — fluid simulation, procedural FX, brand visuals and more.

02

Monthly New Content

Fresh tutorials and assets added every month — your library grows with you.

03

Instant Access to Everything

The moment you join, the full library is yours — no drip-feed, no waiting.

04

Project Files Included

Every tutorial comes with the full Houdini scene file — open every node, learn every detail.

FROM 14.99€/MONTH

How to Create a Growing Rust and Corrosion Effect in Houdini

Ever struggled to simulate realistic metal decay, only to end up with flat smudges rather than authentic growth? Frustrated by faded textures or disjointed procedural setups that refuse to mimic real-world rust behavior?

If you’ve wrestled with VEX snippets that don’t produce creeping stains, or particle solvers that scatter corroded patches incoherently, you’re not alone. Advanced Houdini users often find themselves stuck between modeling, texturing, and simulation without a clear path.

In this guide, we’ll walk you through a concise workflow to generate a dynamic growing rust and corrosion effect step by step. We’ll tackle everything from mask generation and attribute transfer to noise-driven growth and shader blending.

By the end, you’ll understand how to control growth over time, optimize your setup for speed, and integrate the result into a polished look. Ready to leave static paint splatters behind and embrace a true procedural decay pipeline?

What prerequisites, scene scale, and asset preparation are required before simulating growing rust?

Before diving into the procedural rust growth, ensure your Houdini scene follows a consistent scene scale. Working in real-world units (1 unit = 1 meter) lets you calibrate growth rates, diffusion distances, and noise frequencies accurately. If your model is off by tenfold, the simulation could exhibit unrealistic spread or require extreme parameter tweaking.

Next, validate your base geometry: it should feature clean topology, uniform quads or tris with consistent edge lengths under the subdivisions you plan to use. A Measure SOP can help detect irregular areas. Use a UV Unwrap SOP to generate a non-overlapping UV layout that preserves proportional scale—this is crucial for painting masks and reading attribute maps reliably throughout the sim.

  • Run a PolyDoctor SOP to fix non-manifold edges, zero-area faces, and overlapping points.
  • Apply Subdivide or Remesh to achieve target edge length, e.g., 1–5 cm in world units.
  • Generate an AttributeUV or UV Flatten SOP for uniform pixel density if you plan to bake masks or use texture inputs.

Asset preparation also includes baking curvature and ambient occlusion into vertex attributes. Use an Attribute Wrangle with a VEX snippet like @curvature = curvature(0, @P, 0.01); to drive rust initiation points. An Attribute From Volume SOP can project an AO volume onto the mesh, providing sheltered crevices where corrosion tends to accumulate faster.

If your object comprises multiple pieces, group them logically or pack them into a Geometry ROP for caching. Packing allows per-primitive attributes (like growth start time or seed ID) that the rust solver can reference. Be sure to name groups and packed primvars clearly—e.g., “metal_surface” or “edge_masks”—to prevent lookup errors in subsequent SOPs or DOPs.

Finally, organize your asset in a subnet with exposed parameters for scale, base roughness, and initial moisture level. This modular setup not only streamlines iterations but also maintains a clean network where your rust simulation can plug in seamlessly.

How to generate robust procedural corrosion seeds and surface masks (edges, pores, chemical hotspots)?

Creating believable rust growth starts with high-quality procedural masks that isolate regions prone to corrosion. By combining curvature-driven edge masks, micro-pore noise, and simulated chemical hotspots, you gain control over where rust initiates and how it evolves. This approach leverages Houdini’s SOP context without baking to textures, keeping the entire system fully procedural.

First, derive an edge mask using a Measure SOP on >primitive curvature or a PolyFrame SOP to compute normals and curvature. Feed curvature into an Attribute VOP or Wrangle to remap values so that high-curvature edges get values near 1 and flat areas approach 0. This ensures rust accentuates corners and weld seams.

Next, generate a pore mask by scattering micro-noise across the surface. Use an Attribute Noise SOP with a low-frequency Voronoi or Cellular noise type, then bias the output with a Fit SOP or `fit()` VEX call. Threshold the result to isolate pockets, simulating tiny cavities that hold moisture. Blend this mask softly into your edge mask for transitional regions.

  • Measure SOP: curvature or ambient occlusion mask
  • Attribute Noise SOP: pores with Voronoi noise
  • Attribute Wrangle: bias and threshold masks via VEX
  • Attribute VOP: combine and remap multiple channels

Finally, introduce chemical hotspot seeds by teraining a third mask based on procedural distributions. In an Attribute Wrangle, use a Poisson disk scatter over the surface, assign each point a random “reactivity” value, and blur it with a VDB Smooth SDF to avoid hard edges. Merge all masks with weighted blend nodes or a simple VEX expression, creating a final seed attribute that drives your procedural rust growth solver downstream.

How can I simulate time-dependent rust propagation — which solver/approach should I use and what is the step-by-step workflow?

SOP Solver / attribute propagation workflow for surface-preserving growth

Start by seeding an initial rust mask on your mesh via a group or scatter points, storing a rust_level attribute on primitives. Dive into a SOP Solver inside a Geometry node or DOP network. This solver runs each frame, allowing incremental updates to the attribute based on neighbor connectivity.

Step-by-step:

  • Initialize: Use a Attribute Create to set rust_level = 0 on all primitives, then assign rust_level = 1 on seed faces.
  • SOP Solver setup: Wire the original mesh into the first input and the feedback into the second. Inside, drop an Attribute Wrangle.
  • Neighbor sampling: In the wrangle, call primneighbors() to loop over adjacent faces, fetching their rust_level. Compute a growth factor as dotproduct of neighbor average and a noise‐driven threshold.
  • Time integration: Multiply the growth factor by @TimeInc to keep the propagation frame-rate independent, then add to rust_level and clamp between 0 and 1.
  • Post-processing: Use a VOP SOP or another wrangle to modulate detail with fBm noise, simulating pitting and uneven edges.

This surface-preserving approach keeps the mask on the mesh itself and gives tight control over edge shapes and per-face attributes.

Volume advection + diffusion (VDB/Pyro style) for spreading and saturation effects

When you need organic spread and smooth saturation transitions, convert the rust mask into a VDB volume and leverage a Gas Solver. This treats rust as a scalar field that advects and diffuses over time.

Workflow outline:

  • Convert mask to VDB: Use VDB From Polygons to rasterize rust_level into a fogvolume.
  • Create DOP network: Drop a Geometry VDB container and a Gas VDB Advect node. Connect a curl noise velocity field or a custom volume velocity SOP for directional bias.
  • Diffusion: In the DOP, add a Gas VDB Diffuse solver. Set diffusion coefficient based on desired spread speed. Higher values yield blobby growth; lower values preserve sharper fronts.
  • Time stepping: Ensure your DOP network uses substeps to stabilize high diffusion rates. Tune substep count and timestep scale.
  • Reconversion: After the DOP sim, use VDB Convert back to a fogvolume, then Volume Rasterize Attributes or Convert VDB to mesh for shading masks.

This volume-based method excels at simulating saturation limits and soft edges, especially useful when rust bleed interacts with water or chemical runoff effects.

How do I convert simulation output into baked masks, displacement, and texture layers for shading?

Once your rust and corrosion growth sim is complete, you want to lock in that procedural detail for your shading workflow. Baking allows you to export per-frame masks, height data and color layers into 2D maps, so your renderer doesn’t need to evaluate costly per-point simulations at render time. In Houdini, the Bake Texture ROP (or a third-party bake) is your bridge from DOPs/SOPs to usable texture files.

Start by ensuring your geo has a clean UV layout. Use the UV Texture SOP or UV Flatten SOP to pack islands efficiently. If your sim runs on multiple connected pieces, merge them into a single UV set to avoid projection seams in your masks. Then transfer simulation attributes—rust density, corrosion age, surface curvature—onto the final mesh using Attribute Copy or Stamp expressions.

  • Place a Bake Texture ROP in the /out context and reference your UV’d geometry.
  • Under Bake Textures > Output, add channels for each map: rust density as a grayscale mask, height (displacement) in float EXR, and any color variation as layered RGBA.
  • Link attributes: enter “Cd” for your color map, “age” or “mask_rust” for procedural masks, “P” with Parametric “height” for displacement.
  • Set output resolution and file format (EXR for linear displacement, PNG/TIFF for masks).
  • Trigger the bake. Houdini will ray-trace sample each UV pixel, writing the 2D textures to disk.

After baking, import these maps into your Material Network. Use the mask layers to drive lerps between the bare metal shader and a corroded metal shader. Feed the displacement map into the height or micro-displacement input of a principled shader. This workflow decouples heavy DOP sims from render time, grants precise control over mask blending, and produces crisp, production-ready texture layers for any renderer supported by Houdini.

How to author layered, physically plausible rust/corrosion shaders for Mantra/Redshift/Arnold (maps, layering order, and renderer tips)?

Building a believable rust or corrosion shader starts with energy-conserving layering: metallic base, oxide deposit, and surface grime. Each layer requires dedicated texture maps controlling color, roughness, displacement and mask blending. By structuring masks through curvature, ambient occlusion and procedural noise, you drive wear patterns that react naturally to edge highlights and crevice shadows.

Layering order matters. A typical stack (bottom to top) uses:

  • Metallic base coat: low roughness, high specular.
  • Primary rust deposit: mid roughness, red-brown albedo.
  • Secondary oxidation: fine green or black patina.
  • Dust and micro-grit: high roughness, subtle normal variation.

Each mask should be generated by combining a curvature map (to target edges) with ambient occlusion (to preserve crevices) and noise-based variation. Multiply curvature by procedural noise, then lerp between layers so that rust appears first along sharp edges, then blooms outward.

Renderer-specific tips:

  • Mantra: use a Material Blend VOP network. Feed base and rust layers into a layer shader, drive blend with a mask ramp. Enable micropolygon displacement for fine pitting—adjust the Shading Displacement Bound to avoid clipping.
  • Redshift: leverage the RS Material Blender. Assign each coat as an RS Standard Material and blend via the RS Layered Material node. Use RS Curvature and RS AO nodes to author masks in the shader graph, feeding them into Blend Weight slots. Enable adaptive subdivision for displacement maps.
  • Arnold: employ aiLayeredShader or stack AiStandardSurface materials. Generate masks via aiCurvature and aiAmbientOcclusion utility nodes. Feed those into the weight inputs of each layer. For displacement, drive AiDisplacement by a height map and set proper disp_height and disp_padding to prevent artifacts.

Final calibration: always validate under your scene’s HDRI lighting. Render shader AOVs—base color, roughness, mask—to confirm logical mask coverage and energy conservation across layers. This ensures your rust and corrosion hold up under any camera angle or light setup.

What caching, optimization and export strategies make growing rust simulations production-ready (USD/LOPs, packing, and memory management)?

Growing rust sims generate heavy per-point data over time; unoptimized caching leads to I/O bottlenecks and memory exhaustion. In SOPs, leverage the File Cache and Geometry ROP to write incremental frames. For massive parameter sweeps, switch to a PDG TOP Network, dispatching separate tasks per frame and parallelizing writes while throttling disk usage.

  • Stream minimal attributes: position plus rust_mask only
  • Cleanup SOP to drop unused channels before caching
  • Convert to Packed Primitives to shrink memory footprint
  • Limit concurrent TOP tasks with maxConcurrentTasks for stable RAM usage

In Solaris LOPs, import the sequence via the USD ROP and organize rust levels with Variant Sets. Use Payloads and Instances to avoid duplicating geometry in memory. When exporting, enable compression on the USD stage and preserve instancing metadata. This achieves a lean, production-ready USD asset for lookdev or lighting pipelines.

— FOREVER FREE —

Free Studio HDRI Pack box by Artivoxa showing 60 studio lighting setups with softboxes wrapped around the packaging
  • Blender
  • Cinema 4D
  • Houdini
  • Maya
  • 3ds Max
  • Unreal
  • Redshift
  • Octane
  • Karma
  • Cycles
  • Arnold
  • V-Ray
  • Corona

60 studio lighting HDRIs in one free pack — softboxes, lanterns, strip boxes, grids, top-light and three-point setups, all shot in a real photo studio.