Attributes
Attributes are the named bits of data every point, vertex, or shape carries — position, colour, size, and more.
When you make geometry in DNA — points, a mesh, some text, a swarm of shapes — each element travels with a little bundle of named values. Those named values are attributes. One element might know where it is (@P), which way it faces (@N), what colour it is (@Cd), and how big it should be (@pscale). Add them all up across a thousand points and you have a rich, editable dataset flowing down your graph.
Every attribute name starts with @. That @ is how you refer to it everywhere — in node parameters, in the Expression language, on the spreadsheet. Read more about the underlying value shapes in Fields.
The standard attributes
These are the ones you'll meet constantly. They follow well-known conventions, so the same name means the same thing across every node.
| Name | What it holds | Example use |
|---|---|---|
@P | Position in space | Move points around, scatter, animate |
@N | The direction a surface faces (its normal) | Lighting, aligning instances |
@Cd | Colour | Tint by height, paint, randomise hue |
@pscale | Size / scale | Grow and shrink instances |
@orient | Orientation (which way it's turned) | Rotate copies, point shapes along a path |
@id | A stable unique number per element | Keep identity across frames, group by id |
@uv | Texture coordinates | Place an image onto a surface |
@v | Velocity | Motion blur, simulation, trails |
@analytic | Which Analytic shape this row is | Tell DNA to draw a crisp circle vs a baked one |
@id is your friend in animation. Because every element keeps the same id from frame to frame, you can colour element 7 red on frame 1 and trust it's still element 7 on frame 100 — even if the order changes.
@analytic — crisp shapes
@analytic is special to DNA. When a shape carries @analytic, DNA draws it with Analytic shapes — perfectly sharp at any zoom, because the shape is described mathematically rather than baked into pixels. A circle stays a circle whether it fills your screen or sits at one pixel wide.
You usually don't set @analytic by hand. Nodes like shape.circle stamp it for you, and the "Analytical" toggle lets you switch a shape between crisp analytic drawing and a baked version when you need it.
Not every operation can keep a shape analytic — some effects have to bake it down first. DNA handles the conversion automatically when that happens.
Where attributes live
Most attributes ride along with points — @P, @pscale, @id, @orient. A few live at a finer level so a surface can carry extra detail:
On a mesh,
@N(normals) and@uv(texture coordinates) live per corner, so a hard edge can have two different normals where two faces meet.@Cdcan live per point on a point cloud, or per corner on a mesh.
You don't have to think about this most of the time — DNA puts each attribute where it belongs. It matters mainly when you want a sharp crease or a seam in a texture: those need per-corner data.
Open the spreadsheet to see every attribute on your geometry laid out as a table — one row per element, one column per attribute. It's the fastest way to confirm what data is actually flowing through.
The bridge into Expressions
Attributes are the whole reason the Expression language exists. Inside an Expression node you read and write attributes directly by name:
@Cd = {1, 0, 0}; // paint everything red
@P.y += sin(@P.x); // ripple along X
@pscale = rand(@id); // random size per element, stable by id
Read an attribute to drive something; assign to it to change it. Anything you can name with @ you can shape with an Expression — that's where the per-element creativity really opens up.
Assigning to a non-standard name like @myValue creates a brand-new attribute. That's powerful, but watch your spelling — @hieght won't error, it'll just make a new attribute nobody reads.