Skip to content

Filter Nodes

Filter nodes take a texture on their Input port, change it, and pass the result out through Output. They are listed under the Filters category in the Node Library. Twenty-three nodes live in the category; twenty-one of them are documented on this page.

  • Input is required on every filter. Until something is wired into it, the node produces nothing.
  • Mask is an optional grayscale input present on every filter in this category. Where the mask is white the effect applies at full strength; where it is black the node’s own Input shows through unchanged; values in between crossfade. Masking a filter therefore always means “less of this effect here”, never “black here”.
  • Quick Blur, Detail Blur, Directional Blur and Non-Uniform Blur filter color premultiplied by alpha, and so does the mask composite. Blurring or masking a cut-out therefore does not ring its soft edges with a dark halo. Fully opaque work renders identically either way.
  • Three filters take an extra required second input: Slope Blur (Slope), Non-Uniform Blur (Blur Map) and Vector Morph (Vector Map). Those ports have no fallback; leave one unconnected and the node stays blank.
  • Two filters have two outputs: Edge Detect (Magnitude, Direction) and Frequency Split (High Pass, Low Pass).
  • Port types are informational: they color the wire and socket so data flow reads at a glance, and all texture types interconnect freely. “Grayscale” means single-channel data (height, roughness, masks), “color” means RGB data (albedo, normals), “any texture” means the node passes whatever it was given straight through.
  • Parameter names in the tables below are the labels shown in the Properties Panel. Enum parameters are shown as a dropdown; whole-number and decimal parameters get a slider plus a typed field.
  • Two nodes in this category (Distance Field and Erosion) run an iterative GPU compute simulation and require the native render core; they are documented under Simulation & Compute Nodes. Bevel uses the compute path when it is available and falls back to a cheaper approximation when it is not.

Type id: quick_blur

A cheap blur that stays responsive at large resolutions at the cost of edge quality. Reach for this while you are building and tuning a graph, then swap in Detail Blur on the branch that actually feeds an output.

Inputs

  • Input (any texture, required): the texture to soften.
  • Mask (grayscale, optional): restricts the blur.

Outputs

  • Output (any texture): the blurred result.
ParameterTypeDefaultRange / OptionsNotes
RadiusDecimal4.00.0 to 64.0Measured in pixels at the node’s current render resolution, so the same value softens less at a higher export size. 0 passes the input through untouched.

The node is a nine-tap kernel. At a radius of 8 or below that is a single pass, which is what it has always rendered. Past 8 the taps would sit far enough apart to read as nine ghosted copies rather than a blur, so the node runs two or three passes at shrinking radii instead, scaled so the overall strength is the same. That chaining needs the native render core; without it the node stays one pass and large radii ghost.

Type id: blur

A high-quality gaussian blur. Slower than Quick Blur, but clean enough for large radii and for final output. Use it on anything that reaches an output map.

Inputs

  • Input (any texture, required): the texture to soften.
  • Mask (grayscale, optional): restricts the blur.

Outputs

  • Output (any texture): the blurred result.
ParameterTypeDefaultRange / OptionsNotes
RadiusDecimal4.00.0 to 64.0Measured in pixels at the node’s current render resolution. 0 passes the input through untouched.

Detail Blur is internally a separable two-pass gaussian (horizontal, then vertical), which is why it is both slower and cleaner than Quick Blur. The tap count follows the radius rather than being fixed, so the spacing stays near one pixel instead of widening into a comb as the radius grows.

Type id: directional_blur

Smears the image along a single axis instead of in all directions: motion streaks, brushed metal, fabric weave, and the anisotropic feel of a machined surface.

Inputs

  • Input (any texture, required): the texture to smear.
  • Mask (grayscale, optional): restricts the smear.

Outputs

  • Output (any texture): the streaked result.
ParameterTypeDefaultRange / OptionsNotes
AngleDecimal0.00.0 to 360.0Degrees. Sets the axis the blur runs along.
DistanceDecimal0.050.0 to 0.5How far the smear travels in each direction along that axis, as a fraction of the image. Resolution-independent.

The tap count follows the streak length so the taps stay about a pixel apart rather than spreading into a ladder of ghosted copies. The count runs to 128 per side, and past that the spacing widens again.

Type id: non_uniform_blur

Blurs by a per-pixel radius read from a second map, so some areas stay razor sharp while others smear. The workhorse for depth-of-field looks, selective softening, and melting only the worn parts of a surface.

Inputs

  • Input (any texture, required): the texture to soften.
  • Blur Map (grayscale, required): white blurs at the full radius, black leaves the pixel untouched, grays scale in between.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Output (any texture): the selectively blurred result.
ParameterTypeDefaultRange / OptionsNotes
RadiusDecimal0.050.0 to 0.5The maximum blur radius, as a fraction of the shorter image edge. The Blur Map scales it per pixel.

Unlike Detail Blur this cannot be split into two cheap passes, because neighboring pixels want different kernels. The sampling density is set by Radius, the same for every pixel: deriving it from the per-pixel radius put a step in the sampling pattern along every contour of the Blur Map, which drew onion-ring lines through the result. Pixels the Blur Map leaves black still exit before sampling, so a mostly black map is still cheap.

Type id: slope_blur

Marches samples downhill along the slopes of a second, driving texture instead of blurring in a fixed direction. This is the classic weathering and run-off effect: rust streaking down a panel, dirt collecting in crevices, paint melting off an edge. The march re-reads the slope at every step, so the path curves along the terrain the way water would.

Inputs

  • Input (any texture, required): the texture being smeared.
  • Slope (grayscale, required): the height field whose gradient steers the march.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Output (any texture): the smeared result.
ParameterTypeDefaultRange / OptionsNotes
IntensityDecimal0.10.0 to 0.5How far the march travels, as a fraction of the image. The response is not linear: the slider is squared so the low end is fine-grained, and 0.5 still means half the image.
SamplesWhole number321 to 64Steps requested along the march. The node samples up to four times denser than asked, to a ceiling of 128 steps, so a step never lands further apart than the features it is marching over. The total is still capped at one step per marched pixel: more steps than pixels only resamples the same pixels. Samples remains the cost and quality knob.
ModeChoiceBlurBlur, Min (Erode), Max (Melt)Blur averages the samples (a smear). Min (Erode) keeps the darkest, carving the input away. Max (Melt) keeps the brightest, growing it.
FalloffDecimal1.00.0 to 1.0How the reduction weighs distance. At 1.0 a sample counts for less the further along the march it sits, so one distant extreme cannot decide the pixel; raising Samples then adds detail. At 0.0 every sample counts in full, which is the plain running minimum or maximum other tools compute: a harder, more aggressive carve, where raising Samples mostly adds reach.

The Slope input is read through a small averaging filter and measured over a baseline that scales with the march length, so the march reads the shape of the driver rather than the dither the generators lay over it. Where the gradient falls to the level of 8-bit rounding (the flat areas of a soft driver), the march fades out and the pixel passes through untouched, instead of streaking off in a direction that is really just rounding noise.

Slope Blur is not Erosion: it smears pixels along a gradient, which reads as wear but conserves nothing. Erosion actually transports material.

Type id: median

Removes speckle and isolated stray pixels while keeping edges sharp: a denoiser that does not soften structure the way a blur does. Reach for it after a scatter or noise pass has left salt-and-pepper dots.

Inputs

  • Input (any texture, required): the texture to clean up.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Output (any texture): the despeckled result.
ParameterTypeDefaultRange / OptionsNotes
RadiusChoice5×5 (fast)3×3 (exact), 5×5 (fast)Kernel size.

Each color channel gets its own median, so color input is handled per channel rather than by luminance; alpha passes through. 3×3 is the exact median of its nine pixels. 5×5 is a separable approximation (the median of five row medians) which clears the same speckle for a fraction of the work.

Type id: sharpen

Boosts local contrast to bring fine detail forward. Overdo it and you get bright halos along every edge.

Inputs

  • Input (any texture, required): the texture to sharpen.
  • Mask (grayscale, optional): restricts the sharpening.

Outputs

  • Output (any texture): the sharpened result.
ParameterTypeDefaultRange / OptionsNotes
AmountDecimal1.00.0 to 8.0Unsharp-mask strength. 0 passes the input through.

The reference blur the sharpen subtracts is scaled to hold a constant footprint as the output grows, so the node has the same character at 512 as at 4K.

Type id: high_pass

Separates fine detail from broad shape so you can edit one without disturbing the other: strip the lighting and large-scale drift out of a photo-sourced map, keep only surface detail, then recombine. Both halves come out of one node, so their cutoffs can never drift apart.

Inputs

  • Input (any texture, required): the texture to split.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • High Pass (any texture): detail finer than the radius, centered on mid-gray (0.5 means “no deviation from the local average”), which drops straight into an Overlay or Add blend.
  • Low Pass (any texture): the broad structure that was subtracted; this is the blur the high pass removed.
ParameterTypeDefaultRange / OptionsNotes
RadiusDecimal0.050.0 to 0.5Cutoff, as a fraction of the shorter image edge. Larger keeps more of the broad structure in the high pass, because the low pass it subtracts is wider.
AmountDecimal1.00.0 to 8.0Scales the retained detail around mid-gray.

High Pass plus Low Pass recombine to the original input, which is what makes this a genuine split rather than two independent effects.

Type id: edge_detect

Finds edges in the input and outputs them as a mask: outlines, wear masks, panel seams, and anything that needs to know where the silhouettes are.

Inputs

  • Input (any texture, required): the texture to analyze; color is reduced to luminance first.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Magnitude (grayscale): bright where the input has an edge, dark on flat areas.
  • Direction (color): the direction each edge runs, encoded in red and green centered on 0.5 exactly like a normal or flow map, so it feeds Warp, Vector Morph and Rotate’s Vector mode unchanged. It is normalized, so a faint edge still reports a usable direction; strength is Magnitude’s job.
ParameterTypeDefaultRange / OptionsNotes
IntensityDecimal1.00.0 to 8.0Gain on the edge magnitude. Affects the Magnitude output only.
SmoothingDecimal0.00.0 to 1.0Widens the detection stencil from one pixel to four and pre-averages each tap. Reads one smooth line where a hard stencil turns small features and dithered areas into single-pixel speckle and doubled edges. Affects both outputs.
WidthDecimal0.00.0 to 0.1Thickens the detected line into a band, as a fraction of the shorter image edge, the same units as Dilate / Erode’s Amount. 0 leaves the line one stencil wide. Affects the Magnitude output only.
RoundingDecimal0.00.0 to 0.1Fillets the corners of the thickened line instead of leaving sharp miters. Affects the Magnitude output only.

Width and Rounding are morphology passes run over the Magnitude output: the line is dilated by Width plus Rounding and then eroded back by Rounding. That overshoot and return is a morphological close, which is why concave corners round as well as convex ones. Rounding on its own, with Width at 0, rounds the line without thickening it.

Edge detection wraps around the image borders, so it stays seamless on tiling maps. The response is calibrated against a 1024-pixel reference so the same content yields the same edge strength at any output size.

Type id: levels

Remaps the input black point, white point and gamma onto a new output range: the workhorse for setting contrast precisely rather than by feel.

Inputs

  • Input (any texture, required): the texture to remap.
  • Mask (grayscale, optional): restricts the remap.

Outputs

  • Output (any texture): the remapped result.
ParameterTypeDefaultRange / OptionsNotes
In BlackDecimal0.00.0 to 1.0Input value that becomes fully black.
In WhiteDecimal1.00.0 to 1.0Input value that becomes fully white.
GammaDecimal1.00.1 to 4.0Biases the midtones between the two input points.
Out BlackDecimal0.00.0 to 1.0Low end of the range the result is written into.
Out WhiteDecimal1.00.0 to 1.0High end of the range the result is written into.
ChannelChoiceMasterMaster, Red, Green, BlueWhich channel the five sliders act on. Master remaps all three; the others remap only their own and pass the rest through untouched. Chain a second Levels to grade a second channel.

Neither pair is constrained to keep its low end below its high end. Drag In White below In Black, or Out White below Out Black, and the ramp inverts: an invert and a remap in one node instead of two. Dragging the handles across each other stays continuous rather than collapsing to a hard threshold.

Type id: brightness_contrast

Shifts overall lightness and stretches or compresses the tonal range: the quickest way to strengthen or calm a map when you do not need Levels’ precision.

Inputs

  • Input (any texture, required): the texture to adjust.
  • Mask (grayscale, optional): restricts the adjustment.

Outputs

  • Output (any texture): the adjusted result.
ParameterTypeDefaultRange / OptionsNotes
BrightnessDecimal0.0-1.0 to 1.0Negative darkens, positive lightens. 0 is no change.
ContrastDecimal0.0-1.0 to 1.0Negative flattens toward mid-gray, positive stretches away from it. 0 is no change.

Contrast pivots around mid-gray on a slope that steepens toward the ends of the slider. The top of the range is a decisive contrast wall, at roughly fourteen times the input slope, and it stays monotonic: brighter input still means brighter output. Before 1.2.2 the last stop of the slider overshot into a hard-thresholded negative.

Type id: curves

Reshapes the tonal response through a draggable curve. Finer control than Levels when only part of the range needs moving: lifting the shadows without touching the highlights, or pinning the midtones while crushing both ends.

Inputs

  • Input (any texture, required): the texture to remap.
  • Mask (grayscale, optional): restricts the remap.

Outputs

  • Output (any texture): the remapped result.
ParameterTypeDefaultRange / OptionsNotes
(curve pad)Control-point listIdentity (two points, at the bottom-left and top-right corners)Unlimited control points, each anywhere in 0.0 to 1.0 on both axesThere are no numeric parameters. The curve editor in the Properties Panel is the entire interface: add, move and remove points freely, including horizontally.

The curve is interpolated with a monotone cubic that never overshoots, so a dialed-in curve cannot produce values outside the range its points span. Beyond the first and last points the curve extends flat, matching Photoshop. The same curve is applied to each color channel independently; alpha passes through untouched. A malformed or missing curve falls back to the identity curve rather than failing the render.

Type id: hsl

Rotates hue and scales saturation and lightness: recolor a material without touching any of its structure.

Inputs

  • Input (any texture, required): the texture to recolor.
  • Mask (grayscale, optional): restricts the shift.

Outputs

  • Output (any texture): the recolored result.
ParameterTypeDefaultRange / OptionsNotes
Hue ShiftDecimal0.0-0.5 to 0.5A full turn of the hue wheel is 1.0, so ±0.5 is a half turn; the full range reaches every hue.
SaturationDecimal1.00.0 to 2.00.0 removes all color, 1.0 is unchanged, 2.0 doubles it.
LightnessDecimal0.0-1.0 to 1.0Negative darkens, positive lightens.

Type id: grayscale

Collapses a color input to luminance. Use it before any node that expects a height map or a mask.

Inputs

  • Input (any texture, required): the texture to reduce.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Output (grayscale): single-channel luminance.

No parameters.

Type id: invert

Flips the input so light becomes dark. It has dedicated normal-map modes because a plain inversion of a normal map also negates the Z component and lights the surface inside-out.

Inputs

  • Input (any texture, required): the texture to flip.
  • Mask (grayscale, optional): restricts the inversion.

Outputs

  • Output (any texture): the inverted result.
ParameterTypeDefaultRange / OptionsNotes
ModeChoiceColorColor, Normal Y, Normal X, Normal XYColor is the ordinary inversion. The three normal modes flip the named slope axes in signed space and leave Z alone, so the map still lights correctly.

Type id: gradient_map

Replaces each input value with a color sampled from a gradient: the standard way to turn a height map into an albedo. Accepts grayscale or color input; color is reduced to luminance before the ramp is applied.

Inputs

  • Input (any texture, required): the values to remap.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Output (color): the gradient-mapped result. Alpha passes through.
ParameterTypeDefaultRange / OptionsNotes
(gradient bar)Color-stop listA four-stop rust ramp: near-black #0D0A08 at 0.0, dark brown #592E1A at 0.35, orange #CC7326 at 0.70, cream #FFF2D9 at 1.0Unlimited stops, each with a color and a position 0.0 to 1.0Edited on the gradient bar in the Properties Panel; stops can be added, removed and moved. A malformed or missing ramp falls back to the default four stops.
MidDecimal0.50.01 to 0.99A gamma-style bias on the lookup: the input value set here is what lands in the middle of the ramp. 0.5 is linear; lower values push more of the image toward the ramp’s bright end, higher values toward its dark end.

Levels, Curves, Gradient Map and Brightness/Contrast all add a ±1 step dither before writing their 8-bit result. Compressing a range squeezes the input’s own dither below one output step, which would otherwise make smooth ramps re-band on export. The dither is seamless, so tiling is unaffected.

Type id: morphology

Grows or shrinks bright regions by a radius. Thicken a mask, close small gaps, or eat away at edges. The general-purpose counterpart to Flood Fill’s Region Modify, which only reshapes flood-filled regions.

Inputs

  • Input (any texture, required): the mask or height field to reshape.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Output (any texture): the reshaped result.
ParameterTypeDefaultRange / OptionsNotes
AmountDecimal0.02-0.5 to 0.5Signed, as a fraction of the shorter image edge. Positive dilates (grows bright regions), negative erodes (shrinks them), 0 passes through. One control instead of two nodes pointing opposite ways.
ShapeChoiceDiscDisc, Square, DiamondThe structuring element the radius is measured with.

Open and Close are deliberately not options here. Each needs two full passes over the neighborhood, so chain two of these nodes with opposite Amounts.

The structuring element is sampled densely enough to catch any feature out to about 32 pixels of radius. Past that the node splits the work into as many passes of 32 pixels or less as it takes, up to eight. Dilations compose exactly, so the passes add up to the radius you asked for without the dropout speckle a single sparse pass leaves on thin lines. That splitting needs the native render core; without it the node stays one pass and large radii speckle.

Type id: bevel

Rounds the edges of a mask into a soft height ramp: chamfers, panel edges, chiseled tiles and raised lettering. Feed it a mask, take the height into a Normal node. Bevel runs as GPU compute where the native render core is available and falls back to an approximation without it.

Inputs

  • Input (any texture, required): the mask to shape; anything above the threshold counts as “inside”.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Output (any texture): a height ramp running inward from the silhouette.
ParameterTypeDefaultRange / OptionsNotes
Bevel WidthDecimal0.030.0 to 0.5How far inward from the silhouette the ramp runs, as a fraction of the shorter image edge.
ProfileChoiceChamferChamfer, Round, RidgeChamfer is a straight ramp, Round is a smooth shoulder, Ridge peaks and comes back down.
ThresholdDecimal0.50.0 to 1.0Mask cutoff; what counts as inside the shape.

With the native render core present, Bevel is driven by the same jump-flooding distance field the Distance Field node uses, run in Inside mode, with the profile shaping applied on top. That makes the ramp exact at any width. Without the native core it falls back to a bounded outward search capped at the bevel width, whose accuracy is limited by its sample budget; a wide bevel can visibly step. A Bevel Width of exactly 0 always uses the fallback, which fills the shape solid white and leaves everything outside it black.

Type id: vector_morph

Displaces the input along a vector field in repeated small steps, re-reading the field at each new position, so pixels follow a curved path: material flowing around a form rather than sliding past it. Set Steps to 1 and the walk becomes a single straight jump, which is what Warp does.

Inputs

  • Input (any texture, required): the texture to displace.
  • Vector Map (color, required): the direction field, encoded in red and green centered on 0.5, the same convention Flow Map, Edge Detect’s Direction output and normal maps use.
  • Mask (grayscale, optional): restricts the displacement.

Outputs

  • Output (any texture): the displaced result.
ParameterTypeDefaultRange / OptionsNotes
IntensityDecimal0.05-0.5 to 0.5Total displacement, as a fraction of the texture. Negative values follow the field backwards. A unit of Intensity here displaces twice as far as it does on Warp, so the two nodes’ defaults move a pixel the same distance.
StepsWhole number41 to 64Integration steps. 1 is a plain Warp and is the cheap setting, not a broken one; more steps follow curvature more faithfully. The ceiling reaches 64 because at 16 a full-strength morph on a 2K texture jumped 64 pixels per step and the “curved” path came out as a kinked polyline no setting could smooth.
AngleDecimal0.00.0 to 360.0Rotates the vector field before it is followed, in degrees. Lets one vector map drive several directions without re-authoring it.

Steps changes the path taken, not the distance traveled: the total displacement is split across them, so raising quality does not also strengthen the effect. The Vector Map is read through a small averaging filter, which keeps the dither a generated field carries from jittering hard edges as the walk integrates it.

Type id: normal_adjust

Scales, flips or re-normalizes an existing normal map: the place to fix a green channel pointing the wrong way. Export already converts orientation per preset, so this node is for mid-graph conversion: bringing an OpenGL-convention map in through an Image node and matching it to the rest of the graph before blending.

Inputs

  • Input (color, required): the normal map to fix.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Output (color): the corrected normal map.
ParameterTypeDefaultRange / OptionsNotes
OperationChoiceNormalizeNormalize, Flip Y (OpenGL ↔ DirectX), Flip X, Rebuild ZNormalize only re-normalizes. Flip Y converts between the two handedness conventions. Rebuild Z recomputes the blue channel from the red and green slopes.
IntensityDecimal1.00.0 to 4.0Slope multiplier applied before the vector is re-encoded. 1.0 leaves the strength unchanged; below 1 flattens, above 1 exaggerates.

Maps inside the graph use the DirectX convention.

Normal Adjust is filed under Filters because it edits a map in place rather than deriving one. The nodes that produce surface data from a height field (Normal from Height, Curvature / Cavity, Surface Detail, Directional Occlusion, Flow Map and Roughness from Height) are under Normal & Surface Nodes.

Type id: normal_to_height

Integrates a normal map back into an approximate height map. For rebuilding displacement from art you only have as normals, and for feeding Height Blend or the Normal & Surface nodes from normal-only source material.

Inputs

  • Input (color, required): the tangent-space normal map.
  • Mask (grayscale, optional): restricts the effect.

Outputs

  • Output (grayscale): the recovered height.
ParameterTypeDefaultRange / OptionsNotes
RadiusDecimal0.10.0 to 0.5Integration reach, as a fraction of the shorter image edge. Raise it for large forms, lower it for fine detail and speed.
IntensityDecimal1.00.0 to 8.0Output contrast around mid-gray.

The recovery averages many bounded integrations fanned out from each pixel, and the step count along each of them follows Radius, so the integration never strides past forms finer than its own step and reaches its whole radius at full detail. Below one pixel of Radius the node outputs flat mid-gray.

This is an approximation by construction. Two consequences are worth knowing: absolute height is meaningless, only relative shape survives, and forms broader than Radius are not recovered at all, because the integration never reaches far enough to see them.

The two remaining Filters-category nodes, Distance Field and Erosion, run as iterative GPU compute simulations and are documented under Simulation & Compute Nodes.