Overview
The core batch-production node for generating parameter variations from the same
graph. It applies candidates from a list produced by nodes such as variant_range
one at a time, evaluates the graph, and combines images with different colors, seeds,
or angles into a single sprite sheet. This is where PixPipeline's strength in
batch-producing variations takes shape.
Read this first
- This node applies each candidate received through
itemsand creates one image. - Unlike
AnimationRender, which iterates over time, this node iterates over candidates.
What happens
The process is:
- Select one item from
items. - Apply its snapshot to the graph.
- Render one result from the
imageinput. - Repeat for every item.
- Commit
framesandspritesheetonly after every item succeeds.
If any one item fails evaluation, the batch fails without returning a partial result.
Understanding the outputs
| Output | Contents | Use |
|---|---|---|
records |
Candidates that were actually used | Review candidate records |
frames |
One image for each item | Inspect individual frames |
spritesheet |
A sheet combining frames |
Playback, saving, and export |
count |
Number of normalized candidates (when all succeed) | Check the total count |
frame_count |
Number of frames in the sheet | Check metadata |
Start with this example
Build the following graph:
PixelCanvasBrightnessVariantRangeBatchRender
Settings:
VariantRange.key = strengthVariantRange.start = 0VariantRange.end = 1VariantRange.count = 5- Bind the strength parameter of
Brightnessto thestrengthvariable. PixelCanvas.image -> Brightness.image -> BatchRender.imageVariantRange.variants -> BatchRender.items
The candidates from VariantRange are:
[
{ "snapshot": { "values": { "strength": 0.0 } } },
{ "snapshot": { "values": { "strength": 0.25 } } },
{ "snapshot": { "values": { "strength": 0.5 } } },
{ "snapshot": { "values": { "strength": 0.75 } } },
{ "snapshot": { "values": { "strength": 1.0 } } }
]
BatchRender applies them to the graph one at a time, producing five images with
different brightness levels.
records
[
{ "name": "strength=0.000", "snapshot": { "values": { "strength": 0.0 } } },
{ "name": "strength=0.250", "snapshot": { "values": { "strength": 0.25 } } },
{ "name": "strength=0.500", "snapshot": { "values": { "strength": 0.5 } } },
{ "name": "strength=0.750", "snapshot": { "values": { "strength": 0.75 } } },
{ "name": "strength=1.000", "snapshot": { "values": { "strength": 1.0 } } }
]
frames
[
"<Image strength=0.0>",
"<Image strength=0.25>",
"<Image strength=0.5>",
"<Image strength=0.75>",
"<Image strength=1.0>"
]
count / frame_count
count = 5
frame_count = 5
Two-axis combination example
Place CartesianProduct before this node to batch candidates across two axes directly.
Example:
VariantRange(key=strength, start=0, end=1, count=3)SeedRange(key=seed, start=10, count=2, step=1)CartesianProductBatchRender
This produces 3 x 2 = 6 combinations.
BatchRender collects the snapshots inside CartesianProduct and treats them as
candidates shaped like this:
{
"snapshot": {
"values": {
"strength": 0.0,
"seed": 10
}
}
}
Where snapshot keys are applied
Snapshot keys can target the graph in these forms:
- variable id or name for a variable-bound parameter
- node id, variable id, or variable name for a
variable_refnode - a direct parameter in exact
nodeId:paramIdform
For beginners, matching the variable name is the clearest approach. For a direct parameter, both the frontend node id and parameter id must exist in the graph and match exactly, including case.
Common pitfalls
- Every frame has the same image: the snapshot key does not match anything in the
graph. Check that the variable name (or
nodeId:paramId) matchesVariantRange.key. - Confusing it with
animation_render: that node iterates over time (all frames with the same settings), while this one iterates over candidates (one candidate per image). Combine them when you need both, such as batch-producing palette variants of a walk animation. - Frame sizes vary: if the upstream graph contains
solid_renderor a similar node, setframe_mode = FixedCanvasto fix the dimensions (see the eight-direction asset example). - Only one item fails: Batch Render is all-or-nothing. It does not return the successful subset; fix the failed candidate and evaluate the complete batch again.
Notes
- Each item is normalized to a
VariantRecordbefore use. - A
Mapreturned byListZip/CartesianProductcan be passed directly. - Bookkeeping keys such as
index/a_index/b_indexare ignored automatically. - If different combination axes contain the same snapshot key, Batch Render reports an error instead of choosing an implicit overwrite order. Merge the value explicitly.
Solid eight-direction assets
When batch-producing Solid Render camera azimuths in 45-degree increments, the
shortest setup is to create a direct param key with VariantRange.
Example settings:
Solid Rendernode ID:renderVariantRange.key = render:azimuthVariantRange.start = 0VariantRange.end = 315VariantRange.count = 8Solid Render.frame_mode = FixedCanvasSolid Render.camera_angle_snap = 45BatchRender.columns = 8
Because BatchRender applies each snapshot to the graph individually, it can combine
all eight directions with a consistent frame size.
Related nodes
variant_range/seed_range— generate candidate lists (almost always paired with this node)cartesian_product— creates two-axis candidate combinations such as color × seedbatch_export— exports the frames as filesanimation_render— use this for iteration over time (animation)