Hmm... OK , answers /corrections below:
The
"pipe" analogy was just to make the way the new Layers work clearer to visualize.
The Swizzler node doesn't provide anything anywhere close to the node tree I use, or at least a different way to achieve the same result. You can create lots of layers in it, then go one by one choosing which layer from the multilayer EXR you want to use, but the one at the top will be the output always. Whatever pass I choose for that layer (as in layer in the swizzler node), is what I will see in the viewer, if I have it set to default, which is always the case.
That is not it's job.
Swizzler lets you put multiple Images/Masks into a "pipe" OR lets you shuffle Channels around from Image to Image or from Image Layer to Channel OR from Channels to separate Layers OR any combination of these (like a turbo charged version of the
Channel Booleans node). It put Layers into a new or existing "pipe" . It isn't any sort of compositing tool (like Merge or MultiMerge). It just shuffles Layers and Channels.
What seems to be tripping you up is what the default layer is doing... or what that layer shows. In some workflows that are now available - the default image is not even important. But I understand that this jump in thinking about comping is counterintuitive to many people..
but it's too simple, it's missing all the passes separately, which is the great thing about compositing with nodes, I can apply a denoiser to the glossy direct and indirect, usually the passes that show most noise in my experience.
That, and color correctors and so on, all the different things you can do to fine tune the final image to your liking.
But maybe I'm missing something. I know that whether I create the node tree with booleans or merges and multimerges, I need to have all those passes visible, one in each node, to achieve the result I want. Not that I think my NCC1701 video is ILM quality, but I think it looks pretty decent, considering it's my first attempt at multipass compositing.
The passes are all there ... and all separate!
See each of those lines ("pipes" coming from the Loader and off each of the ReRoute nodes? They are each a separate Layer, just like in your layout. The Layer used in each one is defined by the Layer dropdown under the Layer List box in the MultiMerge. So if you stick to the old ways you could put a number of nodes on each of those pipes (but would need to set it up slightly differently from my example)...
But wait! With the layer system there is a more efficient and "easier" way. For your example you can put a node for NoiseReduction (try using the OIDN one from Reactor for Blender renders) immediately after your Loader, then you can set the
Process Layers Dropdown in the
Settings tab of the NoiseReduction node to
Custom and select which Layers will get NR.
One node - multiple Layers at the same time. You can do the same thing with any nodes (ColorCorrect, BriCon, Blur, Glow, etc ) that need the same FX on multiple layers.
Now, the somewhat confusing part... If you use the
Custom Process Layer workflow, it will not affect the default Layer unless you specifically ask it to (but it is ticked on by default). So the Default appearance will not change , while in the pipe multiple Images/Masks can be altered.
So in your example you could put all NR, Color and Glow tweaks after the loader and just specify which Layers are affected. You can use the
Layer selector on the top of the
Viewer to check what is happening to each Layer after each node. You can now just look at the output of the final MultiMerge to see all the effects applied.
Here is a revised example - Note that the Default Image does not change on any nodes until the MultiMerges get involved:
You can repath to the tiny EXR Image in one of the posts earlier in the thread or replace with your own render (but would have to redo or remove the Cryptomatte node)

- Screenshot 2025-05-29 170452.png (912.86 KiB) Viewed 9471 times
- Code: Select all
{
Tools = ordered() {
MultiMerge3_1 = MultiMerge {
Inputs = {
LayerOrder = Input { Value = ScriptVal { {
[0] = 1,
2,
3,
4,
5
} }, },
Background = Input {
SourceOp = "DiffuseMultiMerge1",
Source = "Output",
},
["Layer1.Foreground"] = Input {
SourceOp = "GlossMultiMerge2",
Source = "Output",
},
["Layer1.BurnIn"] = Input { Value = 1, },
LayerName1 = Input { Value = "GlossMultiMerge2 Layer", },
["Layer2.Foreground"] = Input {
SourceOp = "TransMultiMerge2_1",
Source = "Output",
},
["Layer2.BurnIn"] = Input { Value = 1, },
LayerName2 = Input { Value = "TransMultiMerge2_1 Layer", },
["Layer3.Foreground"] = Input {
SourceOp = "EmitPipeRouter10",
Source = "Output",
},
["Layer3.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.Emit" }, },
["Layer3.BurnIn"] = Input { Value = 1, },
LayerName3 = Input { Value = "EmitPipeRouter10 Layer", },
["Layer4.Foreground"] = Input {
SourceOp = "VolPipeRouter11",
Source = "Output",
},
["Layer4.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.VolumeInd" }, },
["Layer4.BurnIn"] = Input { Value = 1, },
LayerName4 = Input { Value = "VolPipeRouter11 Layer", },
["Layer5.Foreground"] = Input {
SourceOp = "VolPipeRouter11",
Source = "Output",
},
["Layer5.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.VolumeDir" }, },
["Layer5.BurnIn"] = Input { Value = 1, },
LayerName5 = Input { Value = "VolPipeRouter11 Layer", }
},
ViewInfo = OperatorInfo { Pos = { -385, 841.5 } },
},
VolPipeRouter11 = PipeRouter {
NameSet = true,
Inputs = {
Input = Input {
SourceOp = "EmitPipeRouter10",
Source = "Output",
}
},
ViewInfo = PipeRouterInfo { Pos = { -330, 709.5 } },
},
EmitPipeRouter10 = PipeRouter {
NameSet = true,
Inputs = {
Input = Input {
SourceOp = "PipeRouter2_1",
Source = "Output",
}
},
ViewInfo = PipeRouterInfo { Pos = { -440, 709.5 } },
},
TransMultiMerge2_1 = MultiMerge {
NameSet = true,
Inputs = {
Background_LayerSelect = Input { Value = FuID { "ViewLayer.TransInd" }, },
LayerOrder = Input { Value = ScriptVal { {
[0] = 1,
2
} }, },
Background = Input {
SourceOp = "PipeRouter2_1",
Source = "Output",
},
["Layer1.Foreground"] = Input {
SourceOp = "PipeRouter2_1",
Source = "Output",
},
["Layer1.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.TransDir" }, },
["Layer1.BurnIn"] = Input { Value = 1, },
LayerName1 = Input { Value = "PipeRouter1 Layer", },
["Layer2.Foreground"] = Input {
SourceOp = "PipeRouter2_1",
Source = "Output",
},
["Layer2.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.TransCol" }, },
["Layer2.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
LayerName2 = Input { Value = "PipeRouter1 Layer", }
},
ViewInfo = OperatorInfo { Pos = { -550, 775.5 } },
},
PipeRouter2_1 = PipeRouter {
Inputs = {
Input = Input {
SourceOp = "PipeRouter9_1",
Source = "Output",
}
},
ViewInfo = PipeRouterInfo { Pos = { -550, 709.5 } },
},
GlossMultiMerge2 = MultiMerge {
NameSet = true,
Inputs = {
Background_LayerSelect = Input { Value = FuID { "ViewLayer.GlossInd" }, },
LayerOrder = Input { Value = ScriptVal { {
[0] = 1,
2
} }, },
Background = Input {
SourceOp = "PipeRouter9_1",
Source = "Output",
},
["Layer1.Foreground"] = Input {
SourceOp = "PipeRouter9_1",
Source = "Output",
},
["Layer1.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.GlossDir" }, },
["Layer1.BurnIn"] = Input { Value = 1, },
LayerName1 = Input { Value = "PipeRouter1 Layer", },
["Layer2.Foreground"] = Input {
SourceOp = "PipeRouter9_1",
Source = "Output",
},
["Layer2.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.GlossCol" }, },
["Layer2.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
LayerName2 = Input { Value = "PipeRouter1 Layer", }
},
ViewInfo = OperatorInfo { Pos = { -715, 775.5 } },
},
PipeRouter9_1 = PipeRouter {
Inputs = {
Input = Input {
SourceOp = "PipeRouter1_1",
Source = "Output",
}
},
ViewInfo = PipeRouterInfo { Pos = { -715, 709.5 } },
},
DiffuseMultiMerge1 = MultiMerge {
NameSet = true,
Inputs = {
Background_LayerSelect = Input { Value = FuID { "ViewLayer.DiffInd" }, },
LayerOrder = Input { Value = ScriptVal { {
[0] = 1,
2
} }, },
Background = Input {
SourceOp = "PipeRouter1_1",
Source = "Output",
},
["Layer1.Foreground"] = Input {
SourceOp = "PipeRouter1_1",
Source = "Output",
},
["Layer1.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.DiffDir" }, },
["Layer1.BurnIn"] = Input { Value = 1, },
LayerName1 = Input { Value = "PipeRouter1 Layer", },
["Layer2.Foreground"] = Input {
SourceOp = "PipeRouter1_1",
Source = "Output",
},
["Layer2.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.DiffCol" }, },
["Layer2.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
LayerName2 = Input { Value = "PipeRouter1 Layer", }
},
ViewInfo = OperatorInfo { Pos = { -880, 775.5 } },
},
PipeRouter1_1 = PipeRouter {
Inputs = {
Input = Input {
SourceOp = "Blur2",
Source = "Output",
}
},
ViewInfo = PipeRouterInfo { Pos = { -880, 709.5 } },
},
Blur2 = Blur {
Inputs = {
ProcessLayers = Input { Value = FuID { ":Custom" }, },
ProcessLayersCustom = Input { Value = ScriptVal { {
[2] = "ViewLayer.Emit"
} }, },
Filter = Input { Value = FuID { "Fast Gaussian" }, },
XBlurSize = Input { Value = 11.8, },
Input = Input {
SourceOp = "ColorCorrector3",
Source = "Output",
}
},
ViewInfo = OperatorInfo { Pos = { -990, 709.5 } },
},
ColorCorrector3 = ColorCorrector {
CtrlWZoom = false,
Inputs = {
ProcessLayers = Input { Value = FuID { ":Custom" }, },
ProcessLayersCustom = Input { Value = ScriptVal { {
"ViewLayer.DiffCol",
"ViewLayer.GlossCol",
"ViewLayer.TransCol"
} }, },
WheelTintAngle1 = Input { Value = 0.131915424783331, },
WheelTintLength1 = Input { Value = 1, },
MasterRGBGain = Input { Value = 3.92, },
ColorRanges = Input {
Value = ColorCurves {
Curves = {
{
Points = {
{ 0, 1 },
{ 0.4, 0.2 },
{ 0.6, 0 },
{ 1, 0 }
}
},
{
Points = {
{ 0, 0 },
{ 0.4, 0 },
{ 0.6, 0.2 },
{ 1, 1 }
}
}
}
},
},
HistogramIgnoreTransparent = Input { Value = 1, },
Input = Input {
SourceOp = "RemoveNoise1",
Source = "Output",
},
EffectMask = Input {
SourceOp = "Cryptomatte3",
Source = "Output",
}
},
ViewInfo = OperatorInfo { Pos = { -1100, 709.5 } },
},
Cryptomatte3 = Cryptomatte {
Inputs = {
Input = Input {
SourceOp = "Loader22_1_1",
Source = "Output",
},
OutputToAlpha = Input { Value = 1, },
MatteOrder = Input { Value = ScriptVal { {
[0] = 0
} }, },
CLC_MatteName_0 = Input { Value = "scene", }
},
ViewInfo = OperatorInfo { Pos = { -1155, 775.5 } },
},
RemoveNoise1 = RemoveNoise {
Inputs = {
ProcessLayers = Input { Value = FuID { ":Custom" }, },
ProcessLayersCustom = Input { Value = ScriptVal { {
"ViewLayer.DiffDir",
"ViewLayer.DiffInd",
"ViewLayer.Noisy Image",
"ViewLayer.Noisy Shadow Catcher",
"ViewLayer.GlossDir",
"ViewLayer.GlossInd"
} }, },
Lock = Input { Value = 1, },
SoftnessRed = Input { Value = 0.00386, },
Input = Input {
SourceOp = "Loader22_1_1",
Source = "Output",
}
},
ViewInfo = OperatorInfo { Pos = { -1210, 709.5 } },
},
Loader22_1_1 = Loader {
Clips = {
Clip {
ID = "Clip1",
Filename = "D:\\Temp\\testshotsbs\\EXRs\\BlenderCartest0000.exr",
FormatID = "OpenEXRFormat",
LengthSetManually = true,
TrimIn = 0,
TrimOut = 0,
ExtendFirst = 0,
ExtendLast = 0,
Loop = 0,
AspectMode = 0,
Depth = 0,
TimeCode = 0,
GlobalStart = 0,
GlobalEnd = 0
}
},
Inputs = {
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
["Clip1.OpenEXRFormat.DeepOutputMode"] = Input { Disabled = true, },
["Clip1.OpenEXRFormat.Channels"] = Input { Value = 1, },
["Clip1.OpenEXRFormat.RedName"] = Input { Value = FuID { "ViewLayer.Noisy Image.R" }, },
["Clip1.OpenEXRFormat.GreenName"] = Input { Value = FuID { "ViewLayer.Noisy Image.G" }, },
["Clip1.OpenEXRFormat.BlueName"] = Input { Value = FuID { "ViewLayer.Noisy Image.B" }, }
},
ViewInfo = OperatorInfo { Pos = { -1320, 709.5 } },
}
}
}
Two different things. [Main] is just what Fusion calls the layer with no name. Ideally, you wouldn't ever see that, as it just means that the layer was unnamed, and best practice would be to reserve that for cases where the layer name is not set because something broke. The default layer is the layer that is first.
Well, actually at this point you must have a Layer explicitly called "[Main]" (using
Swizzler if required) if you want to paint on a particular Layer in a Layered Image pipe using the
Paint tool (but this may be a bug that is resolved at a later date - I have reported it as such).