The material node editor is ArmorPaint’s primary tool for building procedural PBR textures. Every material slot is backed by a node graph that the shader compiler (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/armory3d/armorpaint/llms.txt
Use this file to discover all available pages before exploring further.
parser_material) traverses at paint time, translating connected nodes into GPU shader code. Outputs from the graph feed directly into the PBR pipeline — base color, roughness, metallic, occlusion, normal, emission, height, and subsurface — so every change you make in the node canvas is reflected immediately on the 3D viewport.
Opening the Node Editor
Press Tab to toggle the material node editor open or closed over the current canvas. The editor always opens inCANVAS_TYPE_MATERIAL mode when invoked from the material slot panel.
| Action | Shortcut |
|---|---|
| Toggle node editor | Tab |
| Search for a node | Space |
| Zoom to fit all nodes | Z (node overview) |
Material Output Node
Every material graph must contain exactly one Material Output node (typeOUTPUT_MATERIAL_PBR). It is the terminal node that drives the PBR shader. All other nodes feed into its input sockets.
| Input Socket | Type | Default | Description |
|---|---|---|---|
| Base Color | RGBA | (0.8, 0.8, 0.8, 1.0) | Albedo / diffuse color |
| Opacity | VALUE | 1.0 | Alpha transparency |
| Occlusion | VALUE | 1.0 | Ambient occlusion factor |
| Roughness | VALUE | 0.1 | Surface micro-roughness |
| Metallic | VALUE | 0.0 | Metallic factor |
| Normal Map | VECTOR | (0.5, 0.5, 1.0) | Tangent-space normal map |
| Emission | VALUE | 0.0 | Emission intensity |
| Height | VALUE | 0.0 | Parallax/displacement height |
| Subsurface | VALUE | 0.0 | Subsurface scattering factor |
Node Categories
Input
Input
Nodes that provide geometry, UV, and layer data as inputs to the graph.
- Geometry (
geometry_node) — Exposes world position, normal, and tangent vectors of the surface being shaded. - Texture Coordinate (
texture_coordinate_node) — Provides UV, object, camera, and world-space coordinate outputs. - UV Map (
uv_map_node) — Outputs a named UV map channel from the mesh. - Attribute (
attribute_node) — Reads a named vertex attribute (color, etc.) from the mesh. - Object Info (
object_info_node) — Exposes per-object data such as location and color. - Layer (
layer_node, typeLAYER) — Samples a paint layer’s textures (base color, opacity, occlusion, roughness, metallic, normal, emission, height, subsurface) directly from the layer’s paint textures. Use the Layer dropdown to select which layer slot to read. Outputs include Base Color, Opacity, Occlusion, Roughness, Metallic, Normal Map, Emission, Height, and Subsurface. - Tilesheet (
tilesheet_node, typeTILESHEET) — Computes a UV offset for a specific tile in a sprite/tilesheet atlas. Inputs: Tile X and Tile Y (0–63). Properties: Tiles X and Tiles Y grid dimensions (default4×4). Output: UV vector. - Script (
script_node, typeSCRIPT_CPU) — Evaluates a CPU-side expression (e.g.sys_time()) and passes the result as a scalar Value output. Use the built-in Snippets menu for time-based expressions.
Texture
Texture
Procedural and image-based texture generators.
- Image Texture (
image_texture_node, typeTEX_IMAGE) — Samples an asset image file. Inputs: Vector (UV override). Properties: File (asset picker), Color Space (Auto / Linear / sRGB / DirectX Normal Map). Outputs: Color (RGBA), Alpha (VALUE). Missing textures render as magenta(1, 0, 1). - Noise Texture (
noise_texture_node, typeTEX_NOISE) — Fractional Brownian Motion (fBM) 3D value noise. Inputs: Vector, Scale (default 5), Detail (0–8, default 2), Roughness (default 0.5), Lacunarity (default 2), Distortion (default 0). Outputs: Factor (VALUE), Color (RGBA). - Gradient Texture (
gradient_texture_node) — Linear/quadratic/diagonal/spherical/easing gradient patterns. - Voronoi Texture (
voronoi_texture_node) — Cell-based distance noise with multiple distance metrics. - Brick Texture (
brick_texture_node) — Procedural brick/tile pattern with mortar control. - Checker Texture (
checker_texture_node) — Two-color checkerboard. - Wave Texture (
wave_texture_node) — Sine-based bands or rings. - Magic Texture (
magic_texture_node) — Kaleidoscopic psychedelic color pattern. - Gabor Texture (
gabor_texture_node) — Gabor noise for stochastic texture synthesis. - Tilesheet (
tilesheet_node) — See Input category above; also appears here for convenience. - Tilesheet Animation (
tilesheet_animation_node) — Time-driven tilesheet frame selector for animated sprites.
Color
Color
Nodes that transform, blend, or generate color values.
- Mix Color (
mix_color_node, typeMIX_RGB) — Blends two RGBA colors using one of 19 blend modes: Mix, Darken, Multiply, Burn, Lighten, Screen, Dodge, Add, Overlay, Soft Light, Linear Light, Difference, Exclusion, Subtract, Divide, Hue, Saturation, Color, Value. Inputs: Factor, Color 1, Color 2. Optional: Clamp Factor and Clamp Result checkboxes. - Color Ramp (
color_ramp_node, typeVALTORGB) — Maps a scalar Factor through a multi-stop gradient with Linear or Constant interpolation. The gradient editor lets you add/remove stops and edit each stop’s color and position. Outputs: Color (RGBA), Alpha (VALUE). - RGB Curves (
rgb_curves_node) — Per-channel curve adjustment of RGBA values. - Hue Saturation Value (
hue_saturation_value_node) — Shifts hue, adjusts saturation, and scales value. - Brightness / Contrast (
brightness_contrast_node) — Simple brightness and contrast control. - Gamma (
gamma_node) — Applies a gamma power to a color. - Invert Color (
invert_color_node) — Per-channel1 - valueinversion. - Replace Color (
replace_color_node) — Replaces a target color with another within a tolerance range. - Combine Color (
combine_color_node) — Assembles individual R, G, B channels into an RGBA value. - Separate Color (
separate_color_node) — Splits RGBA into individual R, G, B, A scalar outputs. - RGB to BW (
rgb_to_bw_node) — Converts an RGBA color to a luminance grayscale value. - RGB (
rgb_node) — A constant RGBA color picker node. - Warp (
warp_node, typeDIRECT_WARP) — Offsets UV coordinates by an angle and mask to create swirl/distortion effects. Inputs: Color, Angle (0–360°), Mask (0–1). Output: Color (RGBA sampled at warped UV).
Vector
Vector
Nodes that operate on vector (float3) data, including normals and UV coordinates.
- Mapping (
mapping_node) — Applies translation, rotation, and scale to a vector or UV input. - Normal Map (
normal_map_node, typeNORMAL_MAP) — Decodes a tangent-space normal map texture. Inputs: Strength (default 1.0, range 0–2), Normal Map (VECTOR, default(0.5, 0.5, 1.0)). Output: Normal Map (VECTOR). Internally transforms the input from[0,1]to[-1,1], scales XY by strength, normalizes, and re-encodes to[0,1]. - Normal (
normal_node) — Outputs a fixed normal direction vector and a dot-product value. - Bump (
bump_node) — Generates a normal from a height (displacement) input using finite differences. - Mix Normal Map (
mix_normal_map_node) — Blends two normal map vectors with a factor. - Vector Math (
vector_math2_node) — Applies math operations (Add, Subtract, Multiply, Normalize, Cross, Dot, etc.) to two vector inputs. - Vector Curves (
vector_curves_node) — Applies independent curve remapping to each vector component. - Vector Rotate (
vector_rotate_node) — Rotates a vector around an axis or center point. - Vector Transform (
vector_transform_node) — Transforms a vector between coordinate spaces (World, Object, Camera).
Converter
Converter
Nodes that convert between types or remap value ranges.
- Math (
math2_node) — Single scalar math operations: Add, Subtract, Multiply, Divide, Power, Log, Sqrt, Abs, Round, Floor, Ceil, Min, Max, Modulo, Sine, Cosine, Tangent, Arctan2, etc. - Map Range (
map_range_node) — Remaps a value from one range to another with optional clamping. - Clamp (
clamp_node) — Clamps a value between a minimum and maximum. - Float Curve (
float_curve_node) — Remaps a scalar value through an editable curve. - Combine XYZ (
combine_xyz_node) — Assembles three scalar inputs into a single VECTOR (float3). - Separate XYZ (
separate_xyz_node) — Splits a VECTOR into X, Y, Z scalar outputs. - Quantize (
quantize_node) — Steps a value to the nearest multiple of a given step size (posterization). - Value (
value_node) — A constant scalar float node.
Paint
Paint
Nodes that expose painted layer data and baking utilities.
- Layer (
layer_node) — Reads paint data from a selected layer slot. See the Input category for full details. - Layer Mask (
layer_mask_node) — Samples the mask channel of a paint layer. - Bake Texture (
bake_texture_node) — Bakes a cached texture result back into the graph. - Curvature Bake (
curvature_bake_node) — Bakes surface curvature (cavity/convexity) as a grayscale value. - Camera Texture (
camera_texture_node) — Samples the active camera’s view as a texture input. - Color Mask (
color_mask_node) — Generates a mask from a specified color range in the base color layer. - Picker (
picker_node) — Samples a specific UV coordinate in the current canvas as a constant color.
Material
Material
Nodes related to full material assignments.
- Material (
material_node) — References another material slot, compositing its PBR output into the current graph. - Material Output (
material_output_node) — The required terminal node. See the Material Output Node section above. - Shader (
shader_node, typeSHADER_GPU) — Embeds a raw GPU shader expression. The text field contains a HLSL/WGSL expression that is inlined verbatim into the generated shader, producing a scalar Value output.
Script
Script
- Script (
script_node, typeSCRIPT_CPU) — Evaluates a CPU-side expression and passes the result as a constant float shader parameter. Use the Snippets button to insert built-in expressions such assys_time()for time-animated effects.
Blur
Blur
- Blur (
blur_node) — Applies a screen-space blur to the input color, useful for creating soft/blurry material layers.
Group Nodes
The Group node (typeGROUP) lets you encapsulate a sub-graph into a reusable node with custom sockets. Groups are stored in the project’s material_groups array and can be referenced across multiple material graphs.
To create a group:
- Add a Group node to the canvas from the Group category.
- Click the Nodes button inside the group node to open the group’s internal canvas.
- Inside, you’ll find a Group Input node (type
GROUP_INPUT) and a Group Output node (typeGROUP_OUTPUT). Click the Add button on each to define input and output sockets — each socket can be typed as RGBA, Vector, or Value. - Build the internal node graph between Group Input and Group Output.
- Return to the parent canvas. The Group node’s inputs and outputs now mirror the sockets you defined.
Node Previews
Whennode_previews is enabled in the application config, ArmorPaint bakes a small preview thumbnail for each node after every shader compilation pass. These thumbnails appear directly on the node card in the canvas, giving you an at-a-glance view of what each node produces.