Jump to: Board index » General » Fusion

"Multi layer pipelining for OpenEXR" Where?

Learn about 3D compositing, animation, broadcast design and VFX workflows.
  • Author
  • Message
Offline

Mixolydian

  • Posts: 450
  • Joined: Wed Feb 21, 2024 11:53 pm
  • Location: Planet Earth
  • Real Name: Sebastian Alvarez

"Multi layer pipelining for OpenEXR" Where?

PostWed May 28, 2025 9:28 pm

On the list of new features for Fusion Studio, it says "Multi layer pipelining for OpenEXR, PSD and stereoscopic 3D."

By that I understand that Fusion Studio now has a new feature that allows streamlining the process of importing a multilayer EXR and extract all the layers in it as rendered from a 3D program, like Diffuse, Glossy, Transmission, etc. Something like what the hos_SplitEXR_Ultra script does, but natively.

Is that what it means? Because I can't find anything similar to that anywhere in Fusion Studio 20. I would look in the manual but it's still the manual for 19.1.
Offline
User avatar

goohoobler1

  • Posts: 86
  • Joined: Wed Jul 27, 2022 9:34 pm
  • Real Name: George Port

Re: "Multi layer pipelining for OpenEXR" Where?

PostWed May 28, 2025 10:52 pm

Hi
Have a look at previous posts I contributed to:
https://forum.blackmagicdesign.com/viewtopic.php?f=21&t=219269
https://forum.blackmagicdesign.com/viewtopic.php?f=22&t=222091
https://www.steakunderwater.com/wesuckless/viewtopic.php?t=7460


What do you need to know?

Attached is a tiny EXR file you can experiment with...
Attachments
BlenderCartestMABblurs0014.zip
Tiny test EXR with Cryptomatte - Layers and Channels
(935.69 KiB) Downloaded 200 times
Windows 11 Pro (22H2)
Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz
64.0 GB RAM
Nvidia 4070Ti Super (16GB VRAM)
AMD Ryzen 3970X @ 3.69 GHz
128 GB RAM
Nvidia 3090 (24GB VRAM)
Resolve Studio / Fusion Studio v20.0 Release (Beta 4)
Offline

Mixolydian

  • Posts: 450
  • Joined: Wed Feb 21, 2024 11:53 pm
  • Location: Planet Earth
  • Real Name: Sebastian Alvarez

Re: "Multi layer pipelining for OpenEXR" Where?

PostWed May 28, 2025 11:43 pm

goohoobler1 wrote:What do you need to know?


OK, so here's why I'm asking this. My workflow (and I'm not a VFX professional, I simply learned it from a YouTube video on compositing multilayer EXRs), is this:

Screenshot 2025-05-28 190756.png
Screenshot 2025-05-28 190756.png (348.64 KiB) Viewed 9510 times


Sorry if the screenshot is too large, but to give you an idea of the full workflow I had to include all the nodes. If you can't read the titles of the groups, they are:

- Diffuse (Direct, Indirect and Color)
- AO
- Glossy (Direct, Indirect and Color)
- Transmission (Direct, Indirect and Color)
- Emission (Red, Green and Blue)

These are all combined with Channel Boleans, some of which have a Add function and others Multiply, depending on the formula that you can see here if you scroll down a bit: https://docs.blender.org/manual/en/4.4/render/layers/passes.html

Of course the basic node group is simpler than the one in my screenshot, but once I discovered this, I realized the potential and started adding Color Correctors and many other nodes where needed, which is the great thing about compositing with multiple passes, for example adding a denoiser to just the glossy pass, which usually needs it, rather than to the whole combined image.

That's how I learned to composite and then made this video from it:


Now, if I would've had to import the multilayer EXR sequence into Fusion Studio with 13 different loaders, and in each loader go to the format tab, click to open Channels (which for some absurd reason it's always closed), and then select the proper layer for R, G, B and A, meaning doing all that for Diffuse Direct, then doing it all again for Diffuse Indirect, Diffuse Color and so on, it would've taken me forever.

So I think Kruno or someone here pointed me to the hos_SplitEXRSplit_Ultra and other goodies in Reactor that allowed me to streamline that process, not only extracting each pass to a single node that then I could just click and drag to its proper place in my template and connect, but also to other scripts that allowed to replace the names of the passes to delete the things that Blender adds to the beginning like "ViewObjects". The only thing I had to do manually each time was to split the Emission node into three so I can have emission separately for red, green and blue.

It always seemed weird that Fusion Studio wouldn't come with those features since I would think that nobody likes to setup 11 or more loaders (three more if you have volumes), and so many things would depend on third party plugins. So when I read "Multi layer pipelining for OpenEXR" as part of the new features, I thought that finally there would be a way to do the same thing but natively in Fusion Studio, like right clicking on the loader and select "Expand EXR layers" or something easy like that. Obviously that's not the case.

I had seen those new items in the Layers category, and I tried them all. The only one that would seem to do anything is the "Swizzler" one, which at least allows you to select the different passes, but it's one pass per layer (in the layer list), and you can keep adding layers, but as far as I can tell, the one on top is the only one you can see. So I'm not sure how you would do the compositing layout that Blender shows, or from any other 3D program.

Does that make it a bit more clear?
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu May 29, 2025 12:17 am

You can change which layer is visible in the 2D viewers by selecting them from the dropdown on the top right.
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline

Mixolydian

  • Posts: 450
  • Joined: Wed Feb 21, 2024 11:53 pm
  • Location: Planet Earth
  • Real Name: Sebastian Alvarez

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu May 29, 2025 12:25 am

Chad Capeland wrote:You can change which layer is visible in the 2D viewers by selecting them from the dropdown on the top right.


Yes, but that only changes what you're seeing at the time, it doesn't set the loader to that layer. Even if it did, it would still involve a lot of manual work that hos_etc does in a second.
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu May 29, 2025 1:21 am

Only Swizzler can change which layer is the default layer currently. It's possible with some of the other tools, but not by themselves.
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline
User avatar

goohoobler1

  • Posts: 86
  • Joined: Wed Jul 27, 2022 9:34 pm
  • Real Name: George Port

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu May 29, 2025 4:16 am

OK.. so Layers in Fusion is super flexible but also can be a little brain bending since there are many different concepts to wrap your head round.

First - Layers isn't really "Layers" (like evil AE) it is like having a big pipe where you can add images and masks and they all travel down the same pipe separately.
Second - The [Main] (AKA Default image) does not necessarily have to be affected at all by any nodes it passes through (which can start the confusion) To change which Layer you see as [Main] use the Input Layer dropdown options in the Setting tab of almost every node).
Third - Any node that the pipe passes through can affect any or all Images/Masks at the same time (using the Process Layers dropdown options in the Setting tab of almost every node).
Fourth - At any point in the node tree you can access any of the Images/Masks , as long as you maintain the flow of the pipe (Use LayerMuxer to Merge Pipes full of Layers).
Fifth - You can combine, organize and shuffle Channels and Layers around in almost any configuration using the Swizzler node
Sixth - You can use the Cryptomatte node to output up to 1024 separate Mask Layers into the same pipe (for an EXR with Cryptomatte channels activated in the 3D render).
Seventh - You can use any Layer from inside a pipe as a Mask input to a node (hook the previous node to the Mask Input and then use the Effect Mask Layer dropdown to select the appropriate Mask.

Even writing it out like this sounds complex... But it is powerful in it's complexity...
There is much more but this may help get you started.
Feel free to ask more questions.

Here is the version of your workflow above, Utilizing Layers and MultiMerges , that shows how simple it can get - You should be able to sub in a Blender EXR of your choosing with default Viewlayer naming to see the effect:

Code: Select all
{
   Tools = ordered() {
      Loader22_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
            }
         },
         CtrlWZoom = false,
         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 = { 330, 16.5 } },
      },
      DiffuseMultiMerge1 = MultiMerge {
         NameSet = true,
         Inputs = {
            Background_LayerSelect = Input { Value = FuID { "ViewLayer.DiffInd" }, },
            LayerOrder = Input { Value = ScriptVal { {
                     [0] = 1,
                     2
                  } }, },
            Background = Input {
               SourceOp = "PipeRouter1",
               Source = "Output",
            },
            ["Layer1.Foreground"] = Input {
               SourceOp = "PipeRouter1",
               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",
               Source = "Output",
            },
            ["Layer2.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.DiffCol" }, },
            ["Layer2.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
            LayerName2 = Input { Value = "PipeRouter1 Layer", }
         },
         ViewInfo = OperatorInfo { Pos = { 440, 82.5 } },
      },
      GlossMultiMerge2 = MultiMerge {
         NameSet = true,
         Inputs = {
            Background_LayerSelect = Input { Value = FuID { "ViewLayer.GlossInd" }, },
            LayerOrder = Input { Value = ScriptVal { {
                     [0] = 1,
                     2
                  } }, },
            Background = Input {
               SourceOp = "PipeRouter9",
               Source = "Output",
            },
            ["Layer1.Foreground"] = Input {
               SourceOp = "PipeRouter9",
               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",
               Source = "Output",
            },
            ["Layer2.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.GlossCol" }, },
            ["Layer2.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
            LayerName2 = Input { Value = "PipeRouter1 Layer", }
         },
         ViewInfo = OperatorInfo { Pos = { 605, 82.5 } },
      },
      PipeRouter9 = PipeRouter {
         Inputs = {
            Input = Input {
               SourceOp = "PipeRouter1",
               Source = "Output",
            }
         },
         ViewInfo = PipeRouterInfo { Pos = { 605, 16.5 } },
      },
      PipeRouter1 = PipeRouter {
         Inputs = {
            Input = Input {
               SourceOp = "Loader22_1",
               Source = "Output",
            }
         },
         ViewInfo = PipeRouterInfo { Pos = { 440, 16.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",
               Source = "Output",
            },
            ["Layer1.Foreground"] = Input {
               SourceOp = "PipeRouter2",
               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",
               Source = "Output",
            },
            ["Layer2.Foreground_LayerSelect"] = Input { Value = FuID { "ViewLayer.TransCol" }, },
            ["Layer2.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
            LayerName2 = Input { Value = "PipeRouter1 Layer", }
         },
         ViewInfo = OperatorInfo { Pos = { 770, 82.5 } },
      },
      PipeRouter2 = PipeRouter {
         Inputs = {
            Input = Input {
               SourceOp = "PipeRouter9",
               Source = "Output",
            }
         },
         ViewInfo = PipeRouterInfo { Pos = { 770, 16.5 } },
      },
      MultiMerge3 = 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 = { 935, 148.5 } },
      },
      EmitPipeRouter10 = PipeRouter {
         NameSet = true,
         Inputs = {
            Input = Input {
               SourceOp = "PipeRouter2",
               Source = "Output",
            }
         },
         ViewInfo = PipeRouterInfo { Pos = { 880, 16.5 } },
      },
      VolPipeRouter11 = PipeRouter {
         NameSet = true,
         Inputs = {
            Input = Input {
               SourceOp = "EmitPipeRouter10",
               Source = "Output",
            }
         },
         ViewInfo = PipeRouterInfo { Pos = { 990, 16.5 } },
      }
   }
}


Screenshot 2025-05-29 001020.png
Screenshot 2025-05-29 001020.png (359.69 KiB) Viewed 9462 times
Windows 11 Pro (22H2)
Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz
64.0 GB RAM
Nvidia 4070Ti Super (16GB VRAM)
AMD Ryzen 3970X @ 3.69 GHz
128 GB RAM
Nvidia 3090 (24GB VRAM)
Resolve Studio / Fusion Studio v20.0 Release (Beta 4)
Offline

Mixolydian

  • Posts: 450
  • Joined: Wed Feb 21, 2024 11:53 pm
  • Location: Planet Earth
  • Real Name: Sebastian Alvarez

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu May 29, 2025 6:17 pm

goohoobler1 wrote:OK.. so Layers in Fusion is super flexible but also can be a little brain bending since there are many different concepts to wrap your head round.

First - Layers isn't really "Layers" (like evil AE) it is like having a big pipe where you can add images and masks and they all travel down the same pipe separately.


It's called a multi-layer EXR, so I would say it's accurate to call them layers, although they are render passes, but also can be called render layers.

And After Effects is not "evil", it's a great program which has a lot of good uses, especially for motion graphics. Fusion may be better for compositing, but that doesn't make AE "evil". Now, the corporation that makes it, that's another story...

goohoobler1 wrote:Fifth - You can combine, organize and shuffle Channels and Layers around in almost any configuration using the Swizzler node


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.

goohoobler1 wrote:Here is the version of your workflow above, Utilizing Layers and MultiMerges , that shows how simple it can get - You should be able to sub in a Blender EXR of your choosing with default Viewlayer naming to see the effect:


Thanks for taking the time to do that. This seems to me like an alternative way to get to the combined image, and it's accurate because both the loader and the multimerge in your node tree look exactly the same (as long as I set the R, G and B of the loader to the respective combined passes), 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.
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu May 29, 2025 7:29 pm

goohoobler1 wrote:Second - The [Main] (AKA Default image)


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.
Last edited by Chad Capeland on Thu May 29, 2025 8:04 pm, edited 1 time in total.
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu May 29, 2025 7:41 pm

Mixolydian wrote: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's normal. The layer at the top of the list is the default layer. What is the concern?
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline
User avatar

goohoobler1

  • Posts: 86
  • Joined: Wed Jul 27, 2022 9:34 pm
  • Real Name: George Port

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu May 29, 2025 9:21 pm

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
Screenshot 2025-05-29 170452.png (912.86 KiB) Viewed 9383 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).
Windows 11 Pro (22H2)
Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz
64.0 GB RAM
Nvidia 4070Ti Super (16GB VRAM)
AMD Ryzen 3970X @ 3.69 GHz
128 GB RAM
Nvidia 3090 (24GB VRAM)
Resolve Studio / Fusion Studio v20.0 Release (Beta 4)
Offline

Mixolydian

  • Posts: 450
  • Joined: Wed Feb 21, 2024 11:53 pm
  • Location: Planet Earth
  • Real Name: Sebastian Alvarez

Re: "Multi layer pipelining for OpenEXR" Where?

PostFri May 30, 2025 9:18 pm

goohoobler1 wrote: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)


Well, this one doesn't work for me. It gives me an error even if I remove the Cryptomatte node. Obviously I replaced the source with my render, which worked in the first node tree you gave me but in this one it doesn't, and I don't really have time to troubleshoot it.

But it's OK, I guess my question is answered, because you showed me that there is multi-layer EXR pipelining in Fusion now. That being said, I'm going to stick to the method I worked with so far because it seems to me that it gives me more freedom and the layout makes things easier to work with.
Offline
User avatar

goohoobler1

  • Posts: 86
  • Joined: Wed Jul 27, 2022 9:34 pm
  • Real Name: George Port

Re: "Multi layer pipelining for OpenEXR" Where?

PostSat May 31, 2025 12:01 am

I hate flogging dead horses but the addition of Layers to Fusion was one of the biggest and most important additions to the program in many years and I just want to try to get people to see and try the new elegant, efficient workflow.
However the thing about Fusion is that it can do the same thing in many different ways, so use the technique that you understand best...

For anyone else trying to follow along:
In general with Layers workflow - All the things you need to check are in the Settings tab of most nodes as well as the Layer dropdown and the Background Layer in the Settings tab of the MultiMerge node .

Screenshot 2025-05-30 192810.png
Settings tab of a node with Process Layers set to a Custom selection
Screenshot 2025-05-30 192810.png (72.67 KiB) Viewed 9221 times


Screenshot 2025-05-30 194632.png
MultiMerge node with Layer input of Layer 1 set to "ViewLayer.DiffDir"
Screenshot 2025-05-30 194632.png (36.35 KiB) Viewed 9221 times


Screenshot 2025-05-30 200601.png
Settings tab of MultiMerge node with Background Layer set to "ViewLayer.DiffInd"
Screenshot 2025-05-30 200601.png (30.91 KiB) Viewed 9214 times


As far as troubleshooting - If you delete the Cryptomatte node it should work as long as you have got "standard" Blender naming conventions (ViewLayer.DiffColor, etc ), rendered in Cycles and had all the boxes ticked in the ViewLayer/ Passes/ Light tab.
However assuming that you only rendered the nodes you show in your screen grab, I tweaked the nodes below to remove some extra Layers from the Layer Process/Custom dropdown noise reduction node so it should work without error.



Code: Select all
{
   Tools = ordered() {
      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 } },
      },
      RemoveNoise1 = RemoveNoise {
         Inputs = {
            ProcessLayers = Input { Value = FuID { ":Custom" }, },
            ProcessLayersCustom = Input { Value = ScriptVal { {
                     "ViewLayer.DiffDir",
                     "ViewLayer.DiffInd",
                     [5] = "ViewLayer.GlossDir",
                     [6] = "ViewLayer.GlossInd",
                     [5] = "ViewLayer.TransDir",
                     [6] = "ViewLayer.TransInd"
                  } }, },
            Lock = Input { Value = 1, },
            SoftnessRed = Input { Value = 0.00386, },
            Input = Input {
               SourceOp = "Loader22_1_1",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { -1210, 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 } },
      },
      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",
            }
         },
         ViewInfo = OperatorInfo { Pos = { -1100, 709.5 } },
      },
      PipeRouter1_1 = PipeRouter {
         Inputs = {
            Input = Input {
               SourceOp = "Blur2",
               Source = "Output",
            }
         },
         ViewInfo = PipeRouterInfo { Pos = { -880, 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 } },
      },
      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 } },
      },
      EmitPipeRouter10 = PipeRouter {
         NameSet = true,
         Inputs = {
            Input = Input {
               SourceOp = "PipeRouter2_1",
               Source = "Output",
            }
         },
         ViewInfo = PipeRouterInfo { Pos = { -440, 709.5 } },
      },
      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 } },
      }
   },
   ActiveTool = "ColorCorrector3"
}
Windows 11 Pro (22H2)
Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz
64.0 GB RAM
Nvidia 4070Ti Super (16GB VRAM)
AMD Ryzen 3970X @ 3.69 GHz
128 GB RAM
Nvidia 3090 (24GB VRAM)
Resolve Studio / Fusion Studio v20.0 Release (Beta 4)
Offline

Mixolydian

  • Posts: 450
  • Joined: Wed Feb 21, 2024 11:53 pm
  • Location: Planet Earth
  • Real Name: Sebastian Alvarez

Re: "Multi layer pipelining for OpenEXR" Where?

PostSat May 31, 2025 1:28 am

goohoobler1 wrote:Disappointing....
Did you understand any of the concepts I tried desperately to explain?
I hate flogging dead horses but the addition of Layers to Fusion was one of the biggest and most important additions to the program in many years and I just want to try to get people to see and try the new elegant, efficient workflow.
However the thing about Fusion is that it can do the same thing in many different ways, so use the technique that you understand best...


Well, I only strive to disappoint :lol:

The new code works once I replace the source:

Screenshot 2025-05-30 201255.jpg
Screenshot 2025-05-30 201255.jpg (565.99 KiB) Viewed 9208 times


I just don't see how this layout gives me the same freedom I have with the method I use, which allows me to clearly see all the passes separately, to which I can add CCs, XGlows or whatever FX I want right next to them. Like I mentioned, I want to add a denoiser to only the Glossy Direct and Indirect passes, not the rest. Not even to the full Glossy group. I want to add Xglow to the emission pass, but separating Red, Green and Blue.

I can see what you did with the color corrector being applied only to the color passes, and the Blur only to the emission pass, but the way I do it, I have it all clearly in front of me, I see all the passes clearly, one in each node, and I see what FX I applied to each of them. With this method I would need to go inside each filter and see what passes it's affecting.

If you see my screenshot where I show the way I do it, I have a lot of different CCs, denoisers, Xglows, etc. If I have to start putting all of that in a serial way, going into each of them and selecting which pass I want it to process, in the end I would have something that doesn't show me at first sight where I put what. I'm sorry but I just don't see it.
Attachments
Screenshot 2025-05-30 203126.jpg
Screenshot 2025-05-30 203126.jpg (528.87 KiB) Viewed 9208 times
Offline
User avatar

goohoobler1

  • Posts: 86
  • Joined: Wed Jul 27, 2022 9:34 pm
  • Real Name: George Port

Re: "Multi layer pipelining for OpenEXR" Where?

PostSat May 31, 2025 2:35 am

Fair enough...
Here is a layout using the most basic version of Layers to make things somewhat easier (since you can simply copy this setup and only have to repath the single Loader...)
The AO is currently ticked off in the Diffuse MultiMerge. I had no idea what you were doing with the multiple Emit Channels so I just put one and added the Volume channels in case you ever used them..
And yes, they are just BriCon nodes strung together from the Loader, with the Input Layer in the Settings tab, set to the appropriate Layer name.
And everything is set to default see what you are manipulating at all stages of the tree.

Screenshot 2025-05-30 222750.png
Screenshot 2025-05-30 222750.png (58.57 KiB) Viewed 9197 times



Code: Select all
{
   Tools = ordered() {
      Loader22_1_1_2 = 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
            }
         },
         CtrlWZoom = false,
         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 = { 384, 25.5455 } },
      },
      diffind = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.DiffInd" }, },
            Input = Input {
               SourceOp = "Loader22_1_1_2",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 549, 25.5455 } },
      },
      diffdir = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.DiffDir" }, },
            Input = Input {
               SourceOp = "diffind",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 659, 25.5455 } },
      },
      diffcol = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.DiffCol" }, },
            Input = Input {
               SourceOp = "diffdir",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 769, 25.5455 } },
      },
      AO = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.AO" }, },
            Input = Input {
               SourceOp = "diffcol",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 879, 25.5455 } },
      },
      glossind = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.GlossInd" }, },
            Input = Input {
               SourceOp = "AO",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 1044, 58.5455 } },
      },
      glossdir = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.GlossDir" }, },
            Input = Input {
               SourceOp = "glossind",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 1154, 58.5455 } },
      },
      glosscol = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.GlossCol" }, },
            Input = Input {
               SourceOp = "glossdir",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 1264, 58.5455 } },
      },
      transind = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.TransInd" }, },
            Input = Input {
               SourceOp = "glosscol",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 1429, 25.5455 } },
      },
      diffuse = MultiMerge {
         NameSet = true,
         Inputs = {
            LayerOrder = Input { Value = ScriptVal { {
                     [0] = 1,
                     2,
                     3
                  } }, },
            Background = Input {
               SourceOp = "diffind",
               Source = "Output",
            },
            ["Layer1.Foreground"] = Input {
               SourceOp = "diffdir",
               Source = "Output",
            },
            ["Layer1.BurnIn"] = Input { Value = 1, },
            LayerName1 = Input { Value = "diffdir Layer", },
            ["Layer2.Foreground"] = Input {
               SourceOp = "diffcol",
               Source = "Output",
            },
            ["Layer2.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
            LayerName2 = Input { Value = "diffcol Layer", },
            ["Layer3.Foreground"] = Input {
               SourceOp = "AO",
               Source = "Output",
            },
            ["Layer3.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
            LayerName3 = Input { Value = "AO Layer", },
            LayerEnabled3 = Input { Value = 0, }
         },
         ViewInfo = OperatorInfo { Pos = { 659, 157.545 } },
      },
      glossy = MultiMerge {
         NameSet = true,
         Inputs = {
            LayerOrder = Input { Value = ScriptVal { {
                     [0] = 1,
                     2
                  } }, },
            Background = Input {
               SourceOp = "glossind",
               Source = "Output",
            },
            ["Layer1.Foreground"] = Input {
               SourceOp = "glossdir",
               Source = "Output",
            },
            ["Layer1.BurnIn"] = Input { Value = 1, },
            LayerName1 = Input { Value = "glossdir Layer", },
            ["Layer2.Foreground"] = Input {
               SourceOp = "glosscol",
               Source = "Output",
            },
            ["Layer2.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
            LayerName2 = Input { Value = "glosscol Layer", }
         },
         ViewInfo = OperatorInfo { Pos = { 1155.33, 157.545 } },
      },
      transparent = MultiMerge {
         NameSet = true,
         Inputs = {
            LayerOrder = Input { Value = ScriptVal { {
                     [0] = 1,
                     2
                  } }, },
            Background = Input {
               SourceOp = "transind",
               Source = "Output",
            },
            ["Layer1.Foreground"] = Input {
               SourceOp = "transdir",
               Source = "Output",
            },
            ["Layer1.BurnIn"] = Input { Value = 1, },
            LayerName1 = Input { Value = "transdir Layer", },
            ["Layer2.Foreground"] = Input {
               SourceOp = "transcol",
               Source = "Output",
            },
            ["Layer2.ApplyMode"] = Input { Value = FuID { "Multiply" }, },
            LayerName2 = Input { Value = "transcol Layer", }
         },
         ViewInfo = OperatorInfo { Pos = { 1539, 157.545 } },
      },
      transdir = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.TransDir" }, },
            Input = Input {
               SourceOp = "transind",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 1539, 25.5455 } },
      },
      transcol = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.TransCol" }, },
            Input = Input {
               SourceOp = "transdir",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 1649, 25.5455 } },
      },
      emit = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.Emit" }, },
            Input = Input {
               SourceOp = "transcol",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 1814, 57.3334 } },
      },
      volind = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.VolumeInd" }, },
            Input = Input {
               SourceOp = "emit",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 1979, 25.5455 } },
      },
      voldir = BrightnessContrast {
         NameSet = true,
         Inputs = {
            Input_LayerSelect = Input { Value = FuID { "ViewLayer.VolumeDir" }, },
            Input = Input {
               SourceOp = "volind",
               Source = "Output",
            }
         },
         ViewInfo = OperatorInfo { Pos = { 2089, 25.5455 } },
      },
      All = MultiMerge {
         NameSet = true,
         Inputs = {
            LayerOrder = Input { Value = ScriptVal { {
                     [0] = 1,
                     2,
                     3,
                     4,
                     5
                  } }, },
            Background = Input {
               SourceOp = "diffuse",
               Source = "Output",
            },
            ["Layer1.Foreground"] = Input {
               SourceOp = "glossy",
               Source = "Output",
            },
            ["Layer1.BurnIn"] = Input { Value = 1, },
            LayerName1 = Input { Value = "glossy Layer", },
            ["Layer2.Foreground"] = Input {
               SourceOp = "transparent",
               Source = "Output",
            },
            ["Layer2.BurnIn"] = Input { Value = 1, },
            LayerName2 = Input { Value = "transparent Layer", },
            ["Layer3.Foreground"] = Input {
               SourceOp = "emit",
               Source = "Output",
            },
            ["Layer3.BurnIn"] = Input { Value = 1, },
            LayerName3 = Input { Value = "emit Layer", },
            ["Layer4.Foreground"] = Input {
               SourceOp = "volind",
               Source = "Output",
            },
            ["Layer4.BurnIn"] = Input { Value = 1, },
            LayerName4 = Input { Value = "volind Layer", },
            ["Layer5.Foreground"] = Input {
               SourceOp = "voldir",
               Source = "Output",
            },
            ["Layer5.BurnIn"] = Input { Value = 1, },
            LayerName5 = Input { Value = "voldir Layer", }
         },
         ViewInfo = OperatorInfo { Pos = { 1484, 289.545 } },
      }
   }
}
Windows 11 Pro (22H2)
Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz
64.0 GB RAM
Nvidia 4070Ti Super (16GB VRAM)
AMD Ryzen 3970X @ 3.69 GHz
128 GB RAM
Nvidia 3090 (24GB VRAM)
Resolve Studio / Fusion Studio v20.0 Release (Beta 4)
Offline

Kel Philm

  • Posts: 649
  • Joined: Sat Nov 19, 2016 6:21 am

Re: "Multi layer pipelining for OpenEXR" Where?

PostSun Jun 01, 2025 11:28 am

Something else to consider with the new work flow is the reduction in Nodes required, given each node has overheads in operation (copying data, caching etc...) I would think there are reasonable performance gains to be made.
Offline

bentheanimator

  • Posts: 842
  • Joined: Mon May 13, 2019 10:38 pm
  • Location: Minneapolis, MN
  • Real Name: Ben Hall

Re: "Multi layer pipelining for OpenEXR" Where?

PostSun Jun 01, 2025 4:35 pm

Just wanted to stop by and say thank you very much for taking the time to put all this information together.
Once version 20 is a little farther along on the Resolve side, this will definitely be the new workflow for CG comp. We've been asking for all of this for something like ten years and it's finally here. Crypto, multilayer, shuffle/swizzler, deep comp, OCIO 2. Listing it all out like that makes you realize how different this new version is vs everything before it. Crazy.
Resolve & Fusion Studio 19.1
Windows 11
Intel 14900K @ 5.1GHz | 128GB RAM | RTX4090 | 2TB NVME System | 4TB NVME Scratch RAID 0 / 100G Fiber 64 TB

MacOS 12.7.2
MacBook Pro 13,3 | 16GB | Radeon 460 4GB | 256GB System | 256GB Scratch
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostSun Jun 01, 2025 5:21 pm

Kel Philm wrote:given each node has overheads in operation (copying data, caching etc...) I would think there are reasonable performance gains to be made.


Not really. The copying/caching hasn't changed, you just now have the opportunity for a tool to process thousands of output images per time interval instead of one. There's almost certainly no performance gain, but it could be a lot slower if you aren't careful.

The benefit is cutting user interaction time down, though that still is iffy. You might spend so much time jumping to the common controls tab to change the layer requests that you don't gain any efficiency at all.
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline

Kel Philm

  • Posts: 649
  • Joined: Sat Nov 19, 2016 6:21 am

Re: "Multi layer pipelining for OpenEXR" Where?

PostMon Jun 02, 2025 10:18 am

Hmmmm. I did some basic tests a while back that showed lower caching use (e.g. One Multimerge node vs 'n' Merge nodes.) and a small speed improvement. Which made sense i.e. Multimerge one cache recall vs 'n' Caches for 'n' Merges. But I ran a similar test on Fu 20 (latest) and it didn't seem to offer much at all.
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostMon Jun 02, 2025 4:54 pm

Kel Philm wrote:e.g. One Multimerge node vs 'n' Merge nodes


That's different than the layers/channelset workflow. That's just combining multiple image operations into one tool. Just like a multiblur tool is much faster than multiple blur tools. All the layers/channelset workflow gets you is an "easier" way to batch image processing requests. It's still the same amount of processing and caching happening, it's just a different organizational method for the flow.
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline

Kel Philm

  • Posts: 649
  • Joined: Sat Nov 19, 2016 6:21 am

Re: "Multi layer pipelining for OpenEXR" Where?

PostMon Jun 02, 2025 11:54 pm

Understood, but I was commenting on the layout above where only single merged nodes were being used vs the multi-merged workflow that was being discussed.
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostTue Jun 03, 2025 1:41 am

It's just important to remember that now there the possibility of a tool iterating over many layers, so the number of tools is just one of the factors. In previous versions, if a tool rendered, that was it, you knew it was "done", but now a rendered tool might only be valid for the layer requested, and when you request a different layer, that tool needs to render again. Consider the implications on disk caching...
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline

Hendrik Proosa

  • Posts: 3385
  • Joined: Wed Aug 22, 2012 6:53 am
  • Location: Estonia

Re: "Multi layer pipelining for OpenEXR" Where?

PostTue Jun 03, 2025 11:17 am

Chad Capeland wrote:...but now a rendered tool might only be valid for the layer requested, and when you request a different layer, that tool needs to render again. Consider the implications on disk caching...

That would depend on the cache granularity, wouldn't it? If each layer were cached only the invalid ones would need to be processed, just as if they were explicitly separated in the flow.
I do stuff
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostTue Jun 03, 2025 1:44 pm

Hendrik Proosa wrote:
Chad Capeland wrote:...but now a rendered tool might only be valid for the layer requested, and when you request a different layer, that tool needs to render again. Consider the implications on disk caching...

That would depend on the cache granularity, wouldn't it? If each layer were cached only the invalid ones would need to be processed, just as if they were explicitly separated in the flow.


With regards to disk caching? Or RAM caching? The disk cache isn't able to cache the needed layers and requests and only those. The RAM caching is fine, other than it gets invalidated for all layers when you do anything to invalidate it for one layer. Contrast that with a flow that is split out into many branches, the branches don't typically invalidate each other if they're not connected (though they might cause the cache to fill up, so invest in more RAM).
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline

Kel Philm

  • Posts: 649
  • Joined: Sat Nov 19, 2016 6:21 am

Re: "Multi layer pipelining for OpenEXR" Where?

PostTue Jun 03, 2025 10:17 pm

Will be interesting to see how it all operates under the hood in the new SDK. Render passes are great for tweaking the integration but a massive overhead to work with compared to using just the master render. If your doing a lot of CG integration using render passes I would almost look into creating a customised Tool (SDK/Fuse) that has all the layer mathematics built in and maybe some basic colour/blur/blend operations available for each of the passes. It could effectively replace a large number of tools making it faster and definitely reduce cache usage. No small task but if you have a 100+ shots to do I am sure there would be benefits.
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostTue Jun 03, 2025 10:28 pm

Kel Philm wrote:Render passes are great for tweaking the integration but a massive overhead to work with compared to using just the master render.


Yes, not compositing is indeed faster than compositing.
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline

Kel Philm

  • Posts: 649
  • Joined: Sat Nov 19, 2016 6:21 am

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu Jun 05, 2025 2:21 am

Chad Capeland wrote:Yes, not compositing is indeed faster than compositing.

Yes and some of us are professional VFX artists who have to work on hundreds of shots on tight time frames and some of us are arm chair whingers who spend all their time be negative towards others, I'll let your therapist explain why you do that I can't be bothered.
Offline
User avatar

Chad Capeland

  • Posts: 3306
  • Joined: Mon Nov 10, 2014 9:40 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu Jun 05, 2025 2:47 am

You don't contribute, so I won't be missing much.
Chad Capeland
Indicated, LLC
www.floweffects.com
Offline

Sander de Regt

  • Posts: 4127
  • Joined: Thu Nov 13, 2014 10:09 pm

Re: "Multi layer pipelining for OpenEXR" Where?

PostThu Jun 05, 2025 6:41 am

Yes and some of us are professional VFX artists who have to work on hundreds of shots on tight
time frames
@Kel Philm, just wondering, did you bother to check Chad's resumé?
Sander de Regt

ShadowMaker SdR
The Netherlands
Offline

Kel Philm

  • Posts: 649
  • Joined: Sat Nov 19, 2016 6:21 am

Re: "Multi layer pipelining for OpenEXR" Where?

PostSun Jun 08, 2025 12:28 am

Resume, the thing people write about themselves? I have seen some of his work though, but that is not my point. I take exception to how rude Chad is to myself and other members, there is no need for comments like 'Yes, not compositing is indeed faster than compositing.'. And if I look at Chads latest comment:

Sam Steti wrote:Chad, thx for answering...
However, BMD dropped the person mode one version ago, stating that the object mode was still better anyway. This doesn't change the fact that MM2 is only available in Color...


He is not correct all of the time.

Maybe I misinterpreted his above comment as humour, but I'm pretty sure that is not how it was intended. Last response from me on the matter, apologies to all for cluttering up this thread with non relevant info.
Offline

Hendrik Proosa

  • Posts: 3385
  • Joined: Wed Aug 22, 2012 6:53 am
  • Location: Estonia

Re: "Multi layer pipelining for OpenEXR" Where?

PostMon Jun 09, 2025 7:29 am

Kel Philm wrote:there is no need for comments like 'Yes, not compositing is indeed faster than compositing.'

But this is entirely correct, what’s rude here? Having a master render with all the bells and whistles already in IS faster than building it from passes/layers (comping it together).

My two cents (not directed to anyone specifically) is that if someone writes something that seems stupid, argue should be with the argument. The ”ju stupid, blody, no, you, no you stupid” is rather pointless and usually hints that argument isn’t that solid to begin with.
I do stuff
Offline

Mixolydian

  • Posts: 450
  • Joined: Wed Feb 21, 2024 11:53 pm
  • Location: Planet Earth
  • Real Name: Sebastian Alvarez

Re: "Multi layer pipelining for OpenEXR" Where?

PostTue Jun 10, 2025 10:58 pm

As someone who is many times perceived as rude because I'm straightforward, sometimes a little too much, while usually not meaning anything rude at all, I can see that what's going on here is a simple case of the written word as opposed to speech.

If we were all having this same conversation as, let's say, coworkers that get along fine, a comment like "Yes, not compositing is indeed faster than compositing." might be just a funny comment that the rest of the group might just chuckle at. But, because at least in English there's no way to articulate tone of voice in written text (unless one specifically types it, like a story in a book, and it would be super lame in a forum), some people might take, and took, Chad's comment as snarky and disrespectful, when probably he didn't intend it that way. Or maybe he did and had a beef from before with Kel. I have no idea. Both are possible. I've been on the internet since 1996 and I'm more than fed up with people being jerks to me and others, however, Chad's comment, had it been a reply to a post of mine, wouldn't be offensive to me, but more what the Brits call "cheeky".

What I'm getting at is, it's very easy to read a phrase or paragraph and get the wrong impression, and added to that, in this forum we communicate in English but we have people from all over the world, so from someone who has lived 32 years in one country and 21 in another, I know that we may all speak English, but being from all over the world, we may not speak the same English, and that's OK. The common day expressions we have in the US and Canada (not all of which are the same), are not always the same as those in Great Britain, Ireland, Australia and New Zealand, and probably much different from the rest of the world which doesn't have English as a native language.

So I propose we don't assume right away that something that the other person is insulting or disrespectful, at least until it's blatantly obvious that it is. And I would be willing to bet that 90% of the time, it wasn't meant as disrespectful.

But the other 10%... IT'S WAR, BITCHES!!! :lol: :lol: :lol:

Return to Fusion

Who is online

Users browsing this forum: No registered users and 44 guests