Skip to content

Texture Folder

Texture Folder
Inputs

Texture Folder imports a folder of map files as a texture set, matching each file to its role by the end of its file name. Point it at a downloaded material and the Base Color, Normal, Roughness, and the rest arrive on one wire, instead of five Image In nodes wired into a Texture node by hand. There is no color space to pick per file: the node decides from each file’s role.

Files that share an asset name are one asset. A folder holding twelve assets publishes a batch of twelve texture sets, a library, in name order, each asset keeping its own size and list of roles.

Asset Name narrows that to one: type an asset’s name and the batch is the one asset that matches, so a library and a single asset are the same node with one field filled in. An asset that cannot be read is a failed frame naming its file, and the others still arrive.

For a library, the node body draws one tile per asset with a badge counting its maps, and the panel summary reads “12 assets, 96 maps”, with ”, 1 failed” when one did not import. For a single asset, the body shows a film strip of the imported maps.

Drag a folder from your file manager onto the graph and ArcBrush reads the file names first. When they look like a texture set, a Which Folder Node? prompt asks, with a headline such as “This folder looks like a texture set” or “This folder looks like a library of 12 texture sets”, and two buttons: Image Folder and Texture Folder. Either way the node lands where you dropped it, with the folder path and label filled in; Escape creates nothing.

A folder that does not read as a texture set (photographs, an image sequence, a single map) creates an Image Folder node without asking. Dropping several folders asks once per folder that matched. Dropping a folder onto this node’s own Folder field never asks.

A folder handed to ArcBrush from the desktop, with the Windows Open in ArcBrush menu entry or on the command line, asks the same question. See Open With.

Source is the naming convention the folder was written in: ArcBrush, Substance Painter, Poly Haven, ambientCG, Megascans, glTF, Unity Built-in / URP, Unity HDRP, Unreal, Godot, and your own saved presets, under Yours. It is the same list, and the same presets, as Export Texture’s Destination, so a folder written by one node is read by the other. Each has a page in the Texturing Guides.

Auto is the default, and it says what it found. Every source’s name table is run over the folder and the one matching the most files wins. The line under the combo names it:

Auto detected Poly Haven: 7 of 7 file names match. Pick a source to override.

When no source wins outright, or none recognizes the names, the line says so and the ArcBrush names are used. Picking a source outright replaces the whole name table.

Names shows the source’s table, one editable row per role. Edit a row and an amber dot and a reset arrow appear beside it: that row overrides the source for this node, and the rest still follow the source.

  • Reset to Source puts every row back.
  • Save as Preset… stores the whole table, the packed files, and their lanes under your own name, under Yours on this node and on Export Texture.

Under the eight role rows, each packed file the source reads has a Packed row of its own (see Packed files), and last comes Ignored: the endings of files that are not maps. Ignored is empty under every built-in source and fills when you pick Not a map under Read as.

A suffix matches a whole word between separators (_, -, ., or a space), never the tail of a name: n matches screw_n.png and never lantern.png. The ArcBrush default suffixes for each role are in the parameters table below.

A name ending in two roles is read from the rest of the folder. _metal_rough can mean a file holding both maps, or the Roughness map of an asset whose name ends in “metal”. brushed_metal_rough.png beside brushed_metal_basecolor.png is the Roughness of brushed_metal, because that asset is already named. The same file on its own is listed as Packed.

Each file the source reads by a recipe rather than by name alone has a Packed row in Names: the name endings that file answers to, editable like a role row with the same amber dot and reset arrow, and a line under it spelling out its lanes, such as arm = R ao, G rough, B metal.

Packed files are unpacked by a declared recipe or by a name that spells its lanes, never by guessing. Under a source that declares a packed file, a matching file is taken apart into its roles, each listed as Unpacked with its file and lane, such as ..._arm_2k.png (B).

A file whose ending spells its lanes unpacks in that order under any source with no row of that name, ArcBrush included:

EndingRedGreenBlue
orm, arm, ormmap, OcclusionRoughnessMetallicAmbient OcclusionRoughnessMetallic
rmaRoughnessMetallicAmbient Occlusion

Each of those lanes says where the order came from: “Lanes read from the file name: …”. A source’s own row of that name, or a Read as pick, always wins over the spelling. A glTF-style mask, or any other packed name that spells nothing, is reported as Packed and left alone until a source declares it or you pick Read as. A file’s pixels never decide which role it holds.

  • A role’s own file beats a packed lane. When a download ships arm beside rough and ao, the separate files are read and the duplicated lanes are listed as Skipped. To read a lane anyway, open its file in the Files section and pick the “read this lane instead” item in that lane’s row.

  • An empty Ambient Occlusion lane is dropped. A declared occlusion lane that is zero everywhere carries no occlusion, and importing it would light the material as fully shadowed. It is skipped with the reason stated. A Metallic or Roughness lane of zero is a real value and is always imported.

  • Two files for one role never stop the import. Downloads often carry both, a Bump beside a Displacement or a PNG beside an EXR, so one file is read and every other is listed as Skipped, naming the file read instead. The order is fixed:

    1. A normal map whose _gl or _dx hint disagrees with Normal Convention always yields to one that does not, so of ..._nor_gl and ..._nor_dx the one matching the convention is read.
    2. The ending listed first in that role’s Names row wins. The default Height row lists displacement before bump, so a Displacement is read over a Bump.
    3. Then the container: EXR, TIFF, PNG, any other format, JPEG.
    4. Then the file name.

    To read the other file, pick Use this file under its Read as. Two packed files feeding one role follow the same order, by the packed row listed first.

  • Base Color and Emissive go through the input color handling like any color image.
  • Normal is always read as packed directions, never as color. Normal Convention’s Auto item says where its answer came from, such as Auto (OpenGL, from the file name) for a _gl or _dx hint, or Auto (DirectX, from the source). A hint in the file name beats the source’s declaration.
  • Height and the single-value roles are literal: the red channel is read as raw values whether the file is grayscale or RGB, so nothing is decoded as sRGB that was not color to begin with.

The cutout comes back where the source says it is. An Opacity file, an Opacity lane of a packed file, or a declared alpha lane all become the set’s one Opacity. Most sources declare their color file’s alpha as a place the cutout can travel; import reads it back and lists it under Opacity with the carrier’s (A) lane named. An Opacity file in the folder wins over the alpha, and with neither the set is fully opaque. An alpha no source declares is never read as Opacity, so a downloaded diffuse with a stray alpha is unaffected.

A 16-bit PNG or TIFF map imports at full precision in a 32-bit (Float) document. In an 8-bit document it loads at 8 bits and the node notes “16-bit file shown at 8-bit”.

A map saved as a PSD or PSB reads its flattened picture, like any other map file; a PSD the node cannot read shows the file and its map with the reason, such as a file saved without Maximize Compatibility. A color map with an embedded color profile is converted through it, while Normal, Height, and the single-value roles are read as the raw values they hold. See PSD Files & Color Profiles.

Fit Maps To repairs maps of different sizes by resampling to the Base Color, the Largest, or the Smallest map. Left Off, a mismatch is an error naming the roles and their sizes.

The Parameters panel lists what it matched: one row per file for a single asset, one row per asset for a library, with each map’s role, size, precision, and status.

StatusMeaning
ImportedA file of its own, or the declared Opacity alpha
UnpackedA lane of a packed file, with the lane named
SkippedA second file for a role that already has one, a lane displaced by a role’s own file, an empty Ambient Occlusion lane, or an Opacity alpha with no cutout in it
PackedA packed file no source declared and no name spells
Not usedA map a texture set has no role for, such as Cavity or Specular, or a glossiness file beside the asset’s own Roughness
UnrecognizedA file whose name carries no recognized ending
IgnoredA file you marked Not a map with Read as
RepairedA size mismatch that Fit Maps To fixed

A file the names read wrong, or not at all, is fixed from the list itself. Each file’s row ends in a Read as combo showing what the file is read as now, or “Read as…” when it is read as nothing. Its items are the eight roles, four packed readings, and Not a map:

  • A role adds the file’s ending to that role’s row in Names and takes it off any other row that held it.
  • Packed (ORM) and Packed (ARM) read red as Ambient Occlusion, green as Roughness, and blue as Metallic; Packed (RMA) reads red as Roughness, green as Metallic, and blue as Ambient Occlusion. Each adds a Packed row named by the file’s ending and opens that file in the Files section so you see its lanes. Packed (custom) adds the row with every lane Unused, for you to fill in under Files.
  • Not a map adds the ending to the Ignored row. The file then reads Ignored and stays out of the set.
  • Use this file, listed first on a Skipped file that lost to another file of the same role, moves its ending to the front of that role’s row in Names, so it is the file read and the other is skipped. Only a file whose ending differs from the one read offers it.

A pick changes the names, not a note on one file, so it fixes every asset in a library that names its files the same way. Each pick is one undo step, Save as Preset… keeps it, ignore list included, and Reset to Source takes it back. A source you picked by name reads Custom afterward, as after any hand edit; Auto stays Auto.

In Files, a packed row that matched no file says so and what to do: “No file matches orm. Add its name in Names, or pick Read as on the file.” Add Packed File adds an empty packed row to fill in yourself. A packed row added that way or by Read as has a remove button beside its name; a row the source declares has none, since the source would only declare it again.

Pins

TextureTexture
Output

Asset

FolderText

Folder of texture map files to import as a texture set. A folder holding several assets imports as a batch, one set per asset name

SourceText
Default: Auto

Which pipeline wrote this folder. A source sets the file names and the packed files this node looks for, and picking one rewrites the Names table below.

Auto uses the source that matches the most file names, or the ArcBrush names when none wins; the line under the combo says what it found. Editing any name below switches the source to Custom, which still imports.

Asset NameText

Which asset in the folder to import, by the part of the file name in front of the map suffix. Leave it empty to import every asset.

Naming one asset of a folder that holds several still outputs a batch, so downstream wiring does not change.

Maps

Normal ConventionChoice
Default: Auto Range: Auto / OpenGL (Y+ up) / DirectX (Y+ down)

Green-channel orientation of the imported Normal map.

  • Auto: a hint in the file name such as _dx or _gl, else what the detected source declares, else OpenGL.
  • OpenGL (Y+ up): the Normal Map node's output and most downloadable assets.
  • DirectX (Y+ down): the other common convention.
Fit Maps ToChoice
Default: Off Range: Off / Base Color / Largest / Smallest

What to do when the asset's maps are not all the same size.

  • Off: a size mismatch is an error.
  • Base Color: resample every map to Base Color's size.
  • Largest: resample every map to the largest one.
  • Smallest: resample every map to the smallest one.
Fit FilterChoice
Default: Bilinear Range: Nearest / Bilinear / Lanczos
When Fit Maps To is not Off

Resampling filter used by Fit Maps To. Bilinear and Lanczos smooth a map as it shrinks; Nearest never filters.

Normal and Height use Bilinear when Lanczos is chosen, because Lanczos ringing distorts a surface map.

EXR AlphaChoice
Default: Associated Range: Straight / Associated
When a color map is an EXR file

How an EXR Base Color or Emissive map stores color where it is partly transparent. Data maps are always read as stored.

  • Associated: color is already multiplied by alpha, the OpenEXR convention and what ArcBrush exports.
  • Straight: color is stored as is. Older documents read EXR files this way.

Names

Base ColorText
Default: basecolor, base_color, albedo, diffuse, diff, col, color

Comma-separated name endings that mark a Base Color map.

An ending matches a whole word between separators, so col matches wood_col.png and never protocol.png.

NormalText
Default: normal, nrm, nor, n

Comma-separated name endings that mark a Normal map

RoughnessText
Default: roughness, rough, rgh

Comma-separated name endings that mark a Roughness map.

Glossiness and smoothness maps are refused by name, not inverted.

MetallicText
Default: metallic, metal, met, metalness

Comma-separated name endings that mark a Metallic map

Ambient OcclusionText
Default: ao, occlusion, ambientocclusion

Comma-separated name endings that mark an Ambient Occlusion map

HeightText
Default: height, disp, displacement, bump

Comma-separated name endings that mark a Height map

OpacityText
Default: opacity, alpha

Comma-separated name endings that mark an Opacity map.

mask is left out by default because a file ending in _mask reads as a packed file. Add it here if your opacity files use that ending.

EmissiveText
Default: emissive, emission, emit

Comma-separated name endings that mark an Emissive map

PackedData

The packed files this source writes, one row per file, and which map each channel holds. A matching file is unpacked into those maps, with any declared inversion undone.

A packed file's name field takes comma-separated name endings, like a map's. Read as on a file adds one, and Add Packed File starts an empty row whose lanes you pick under Files.

A map that also has its own file in the folder is read from that file instead. A color file whose alpha is the asset's cutout is listed here too.

IgnoredText

Comma-separated name endings of files that are not maps. A matching file is listed as Ignored and never read.

Read as on a file in the list above writes these rows: a map adds the file's ending to that map's row, a packed pick adds a packed file, and Not a map adds it here. Every asset whose files end the same way is read the same way.

Use this file on a Skipped file puts its ending first in its map's row, so it is read instead of the other file.

  • Leave Source on Auto first and read the line under it. Pick a source outright only when Auto could not tell.
  • Point the node at a folder of many assets to get a library, then feed it to Scatter, Texture Layer, or Export Texture.
  • Wire the output into 3D Render’s Texture input to check the import on a mesh.
  • Search the node library for “pbr”, “material”, “texture set”, or “library”.