Skip to content

Height Layer

Height Layer
Texture

Height Layer stacks height maps, each with its own placement, into one signed height, plus a Top Weight mask of which row owns each pixel. Use it to assemble raised or engraved pieces into one surface: rivets on a plate, lettering cut into a base, stones sitting in sand. Wire in a base height (from Bevel, an imported height map, or a generated grayscale image) and add pieces above it; the stack composes bottom to top. To stack whole materials with every map following the height, use Texture Layer instead.

The stack works like Layer and Normal Layer: the same drag to reorder, visibility and lock toggles, and an on-canvas gizmo per row for translation, pivot, rotation, scale on either axis, skew, and Mirror X / Mirror Y. Connecting the trailing empty pin adds another row.

A row’s alpha is its coverage and nothing else. A single-channel row is a literal height covering its whole frame; an RGBA row is read as red for height and alpha for coverage, with green and blue unused. There is no per-row mask input: to narrow a row’s footprint, attach one upstream with Mask Apply. Coverage and Amount are applied exactly once, in the row’s own step.

Every row starts on Higher Surface, the first one included. An empty canvas is no surface, so a Higher Surface row wins outright wherever nothing is below it, and the first row you wire in defines the base with no special mode.

  • Add Detail and Subtract Detail add or cut this row’s height, measured from its Detail Neutral, into the surface below, keeping the relief below. Detail Strength scales the detail (1 keeps the authored amplitude). A byte value of 128 is 0.50196, slightly above 0.5, so a source that treats byte 128 as neutral wants Custom rather than Midgray.
  • Higher Surface and Lower Surface keep whichever surface is higher or lower, so they never lower or raise the result respectively.
  • Replace becomes the result outright, mixed in by coverage and Amount.
  • On those three surface operations, Height Scale multiplies the row’s height and Height Offset then lifts or drops the whole row (black areas included, unless alpha limits its footprint) before it is compared.
  • Transition (Higher and Lower Surface only) is measured in height, not pixels, and does not blur a coverage edge: raising it trades a sharp crease where two surfaces cross for a wider, shallower valley.
  • Amount fades the row’s effect on top of its coverage. At 0 the row changes nothing, though it can still own Top Weight.

Background Height is the elevation reported wherever no row has landed. It is never itself a surface, so a Higher or Lower Surface row wins outright over bare canvas. Once a row has landed on a pixel, later rows compare against or build on that result.

Coverage is a fraction of a pixel, so on a soft edge a Higher or Lower Surface row lands outright on the bare part of the pixel and is compared against the surface only on the covered part. That keeps the outline of a stamped piece smooth rather than stepped.

Top Weight marks the topmost visible, connected surface row at each pixel (one set to Higher Surface, Lower Surface, or Replace), so you can drive a matching color, roughness, or normal row with exactly the ownership Height Layer used. Detail rows only add relief to whichever surface won beneath them, so they never own a pixel; a stack of only detail rows publishes an empty Top Weight.

The Parameters panel names the owner: Top Weight: (row name), or Top Weight: no surface row. Hiding or disconnecting the owning row passes ownership to the next surface row down. To see the mask, select the node and click Top Weight in the Preview’s tool row; Height puts the surface back (see Views).

To use it, attach Top Weight to the receiving image with Mask Apply set to Cut Out, which assigns the weight once rather than multiplying the image’s own coverage in again. Top Weight is already in the output canvas’s coordinates, so wire it straight in without transforming it. On a receiving Normal Layer, use a Blend Surfaces row at Amount 1 with no placement; on a receiving Layer, use Normal blend at full opacity with no placement.

There are two ways to keep a normal in step with a stacked height, and Height Layer does not pick for you.

  • The height leads. Feed the Height output into Normal Map to derive the matching normal. This is the default path, and it keeps height and normal in agreement by construction.
  • An authored normal leads. When a piece’s normal was hand-painted or baked independently, compose it in Normal Layer with the same placement values as the matching Height Layer rows. The two stacks never sync automatically: move a row in one and move its partner in the other by hand.

Height is signed and can run past 0 to 1: a sunken rivet, an engraved letter, or pieces at different elevations all need values outside that range. A 32-bit (Float) document, the default for new projects, keeps them through the whole stack. In an 8-bit document the result is stored in 0 to 1, and the node warns when its own output clips.

To export a height, pick a format and depth that can hold its real range: a signed or over-one result needs a float container, and OpenEXR at 32-bit float rather than 16-bit half when fine steps matter.

To write a height as part of a whole material, Export Texture picks the container for you.

Pins

Image 1, Image 2, ...Pixels
InputOptionalVariable count
HeightMask
Output
Top WeightMask
Output

Output

Output SizeChoice
Default: Deepest Visible Range: Deepest Visible / Max W&H / Topmost Visible

Which rows set the canvas size.

  • Deepest Visible: the lowest visible row.
  • Max W&H: the largest width and height across visible rows.
  • Topmost Visible: the highest visible row.
Output AnchorChoice
Default: Center Range: Top-Left / Center

How rows are positioned on the canvas when their dimensions are smaller than the canvas size

Background HeightNumber
Default: 0.000 Range: -16.000–16.000

The height reported where no row covers the canvas.

Rows never compare against it: a Higher Surface or Lower Surface row always wins over empty canvas. Heights below 0 or above 1 need 32-bit (Float) Mode.

RowsData

Per-row state (operation, amount, height controls, visibility) plus each row's placement (translate, rotate, scale, mirror, skew, pivot, filter). Edited in the stack

Row

OperationChoice
Default: Higher Surface Range: Add Detail / Subtract Detail / Higher Surface / Lower Surface / Replace
Per row, in the stack

How this row combines with the surface below.

  • Add Detail: adds the row's height on top of the surface below.
  • Subtract Detail: cuts the row's height into the surface below.
  • Higher Surface: keeps whichever surface is higher.
  • Lower Surface: keeps whichever surface is lower.
  • Replace: the row's surface replaces the one below, by its coverage and Amount.

Add Detail and Subtract Detail rows never own Top Weight.

AmountNumber
Default: 1.00 Range: 0.00–1.00
Per row, in the stack

How much of this row's effect reaches the result, on top of its alpha coverage.

0 = no effect. A partial Amount blends toward the surface the Operation selected.

Detail StrengthNumber
Default: 1.000 Range: 0.000–16.000
Per row, in the stack (Add Detail and Subtract Detail)

Scales how tall this row's detail is on the surface below. 1 = as authored, 0 = no change

Detail NeutralChoice
Default: Black Range: Black / Midgray / Custom
Per row, in the stack (Add Detail and Subtract Detail)

The height in this row's source that means "no change".

  • Black: 0. For a Bevel height or any map that starts from nothing.
  • Midgray: exactly 0.5.
  • Custom: the Custom Neutral value below.

A map whose neutral is the byte 128 wants Custom at 0.50196.

Custom NeutralNumber
Default: 0.00000 Range: -16.00000–16.00000
Per row, in the stack (Detail Neutral set to Custom)

The exact source height that means "no change", used when Detail Neutral is set to Custom

Height ScaleNumber
Default: 1.000 Range: 0.000–16.000
Per row, in the stack (Higher, Lower and Replace)

Multiplies this row's source height before it is compared with, or written over, the surface below

Height OffsetNumber
Default: 0.000 Range: -1.000–1.000
Per row, in the stack (Higher, Lower and Replace)

Lifts or drops this row's whole surface after Height Scale.

It moves the row's black areas too, unless its alpha already limits the row to a footprint.

TransitionNumber
Default: 0.000 Range: 0.000–16.000
Per row, in the stack (Higher and Lower)

Blends the two surfaces across a band this many height units wide where they cross, which reads as a shallow valley.

0 = exact, which leaves a crease at the crossing. The band is measured in height values, not pixels.

  • Leave rows on Higher Surface for pieces that sit on a base, switch to Lower Surface for pieces that cut in, and use Add Detail for fine relief that should ride on whatever is underneath.
  • Use Height Offset to sink a stone into sand or lift a rivet off a plate without editing the source map.
  • A missing Top Weight is reported as an error naming the row. It is never silently replaced by the Height output.
  • Lanczos filtering is not offered on rows, because its ringing would invent ridges in a height.
  • Search the node library for “height blend”, “heightmap”, “stack”, “top weight”, “relief”, or “elevation”.