Quick answer: Add a Dynamic Parameter node in the material with parameter index 0. Wire its outputs to BaseColor / Emissive. In the Niagara Mesh Renderer, Materials → Material Parameters: bind Dynamic Parameter 0 to Particles.Color. Per-particle color now drives the material.

Sprite renderers respect Particles.Color automatically. Mesh renderers don’t. The bridge is a Dynamic Parameter node in the material plus a binding on the Niagara Mesh Renderer.

The Symptom

Niagara Mesh Renderer renders all particles with the same color regardless of Particles.Color values. Setting per-particle scale, rotation, or other attributes also has no effect even though the values are visible in Niagara’s debug panel.

What Causes This

Sprite renderers have hardcoded support for Color and other per-particle attributes via vertex factory tricks. Mesh renderers can’t do that — meshes have arbitrary vertex shaders. To pass per-particle data into a mesh material, Niagara writes it into a fixed set of Dynamic Parameters (0–3, each a Vector4), and the material reads those parameters via Dynamic Parameter nodes.

The Fix

Step 1: Add a Dynamic Parameter node in the material. Right-click in Material editor → Add Node → search “Dynamic Parameter.” Drop the node. It exposes Parameter Index (default 0) and outputs as four scalars (Param1, Param2, Param3, Param4).

Step 2: Wire to material outputs. Connect Dynamic Parameter outputs to BaseColor, Emissive, or wherever you want per-particle modulation. For colored particles:

DynamicParameter.RGBA  -> Multiply with BaseColor
DynamicParameter.A     -> OpacityMask

Step 3: Bind in Niagara Mesh Renderer. Open the Niagara System. Select the Mesh Renderer. Materials section → Material Parameters. Click + to add a binding:

Dynamic Parameter Index: 0
Source Particles Attribute: Particles.Color

Now Niagara writes Particles.Color into Dynamic Parameter 0 of the material per draw, and the material samples it.

Multiple Bindings

Up to four Dynamic Parameters per material:

Param 0: Particles.Color
Param 1: new attribute Particles.CustomScalars  // (intensity, fade, etc.)
Param 2: Particles.SpriteRotation                    // for arbitrary use
Param 3: Particles.LifetimeNormalized               // 0..1 over life

Verifying

Open the system in editor with the target asset selected. The viewport should show particles with the right per-particle modulation. If still uniform, the binding is missing or the Dynamic Parameter index doesn’t match.

Niagara Editor → Toolbar → Show Bound Variables in the renderer module shows which attributes are being read.

“Dynamic Parameter in material. Binding in Niagara. Per-particle color flows through mesh.”

Related Issues

For Niagara bounds culling, see Niagara bounds. For CPU-GPU emitter handoff, see CPU/GPU readback.

DynamicParameter bridges. Bind once. Particles paint correctly.