## Dealing with brighter pixels on the edges of a CG render?

Moderator: SecondMan

bowserlm
Fusioneer
Posts: 176
Joined: Sat Apr 28, 2018 3:44 pm
Been thanked: 2 times

### Dealing with brighter pixels on the edges of a CG render?

We've got some renders with soft edges that fall off to 0% Alpha.

When I merge the render over our sky, we've got some brighter pixels around these softer edges. I'm sure this is just an easy toggle somewhere I'm probably missing.

Midgardsormr
Fusionista
Posts: 706
Joined: Wed Nov 26, 2014 8:04 pm
Location: Los Angeles, CA, USA
Been thanked: 64 times
Contact:

### Re: Dealing with brighter pixels on the edges of a CG render?

That's usually a symptom of an unpremultiplied (straight alpha) image. Try the Subtractive - Additive slider in the Merge.

It can also crop up if you're rendering over a non-black background. If you have a render background of some kind in the image, you should turn that off before rendering or you contaminate the edges. You could try to un-merge it with a CustomTool. If I remember the process correctly, you need to give the Custom Tool the Foreground on Image1 and the render background on Image 2. In each channel expression, you want the expression c1 - (1 - a1) * c2. That should reverse a Merge, giving you a premultiplied foreground.

edit: I just tested that method, and it doesn't give me good results. I must have my math wrong somewhere along the line. unmerge

Added in 35 minutes 43 seconds:
Ah. AlphaDivide the Foreground before the CustomTool; that's what I missed.

1. {
2.     Tools = ordered() {
4.             ViewInfo = OperatorInfo { Pos = { 495, 49.5 } },
5.         },
6.         CustomTool1 = Custom {
7.             Inputs = {
8.                 LUTIn1 = Input {
9.                     SourceOp = "CustomTool1LUTIn1",
10.                     Source = "Value",
11.                 },
12.                 LUTIn2 = Input {
13.                     SourceOp = "CustomTool1LUTIn2",
14.                     Source = "Value",
15.                 },
16.                 LUTIn3 = Input {
17.                     SourceOp = "CustomTool1LUTIn3",
18.                     Source = "Value",
19.                 },
20.                 LUTIn4 = Input {
21.                     SourceOp = "CustomTool1LUTIn4",
22.                     Source = "Value",
23.                 },
24.                 RedExpression = Input { Value = " c1 - (1 - a1) * c2", },
25.                 GreenExpression = Input { Value = " c1 - (1 - a1) * c2", },
26.                 BlueExpression = Input { Value = " c1 - (1 - a1) * c2", },
27.                 Image1 = Input {
29.                     Source = "Output",
30.                 },
31.             },
32.             ViewInfo = OperatorInfo { Pos = { 660, 49.5 } },
33.         },
34.         CustomTool1LUTIn1 = LUTBezier {
35.             KeyColorSplines = {
36.                 [0] = {
37.                     [0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
38.                     [1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
39.                 }
40.             },
41.             SplineColor = { Red = 204, Green = 0, Blue = 0 },
42.             NameSet = true,
43.         },
44.         CustomTool1LUTIn2 = LUTBezier {
45.             KeyColorSplines = {
46.                 [0] = {
47.                     [0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
48.                     [1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
49.                 }
50.             },
51.             SplineColor = { Red = 0, Green = 204, Blue = 0 },
52.             NameSet = true,
53.         },
54.         CustomTool1LUTIn3 = LUTBezier {
55.             KeyColorSplines = {
56.                 [0] = {
57.                     [0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
58.                     [1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
59.                 }
60.             },
61.             SplineColor = { Red = 0, Green = 0, Blue = 204 },
62.             NameSet = true,
63.         },
64.         CustomTool1LUTIn4 = LUTBezier {
65.             KeyColorSplines = {
66.                 [0] = {
67.                     [0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
68.                     [1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
69.                 }
70.             },
71.             SplineColor = { Red = 204, Green = 204, Blue = 204 },
72.             NameSet = true,
73.         },
74.         AlphaMultiply1 = AlphaMultiply {
75.             Inputs = {
76.                 Input = Input {
77.                     SourceOp = "CustomTool1",
78.                     Source = "Output",
79.                 },
80.             },
81.             ViewInfo = OperatorInfo { Pos = { 825, 49.5 } },
82.         }
83.     }
84. }
Last edited by Midgardsormr on Mon Jul 09, 2018 1:31 pm, edited 1 time in total.

jimbob
Posts: 40
Joined: Wed May 23, 2018 12:07 am
Been thanked: 2 times

### Re: Dealing with brighter pixels on the edges of a CG render?

This video from Vito / Con Fusion is really good at explaining / resolving edge-pixel weirdness.

SecondMan
Posts: 2601
Joined: Thu Jul 31, 2014 5:31 pm
Been thanked: 92 times
Contact:

### Re: Dealing with brighter pixels on the edges of a CG render?

Vito really takes tutorials to a whole different level. Nice shout-out to Bryan in that video, too. Very kind

Midgardsormr
Fusionista
Posts: 706
Joined: Wed Nov 26, 2014 8:04 pm
Location: Los Angeles, CA, USA
Been thanked: 64 times
Contact:

### Re: Dealing with brighter pixels on the edges of a CG render?

We've got a bit of an alliance going. Vito's awesome at look-dev, and I'm more of a technical artist. It works out nicely for him to do video tutorials while I cover more detailed text tutorials.

bowserlm
Fusioneer
Posts: 176
Joined: Sat Apr 28, 2018 3:44 pm
Been thanked: 2 times

### Re: Dealing with brighter pixels on the edges of a CG render?

This is great guys.

In my case, just playing with the Additive and Subtractive slider allowed me to dial it in perfectly. It's little things like this that make me so much happier to be comping in Fusion than in After Effects

jimbob
Posts: 40
Joined: Wed May 23, 2018 12:07 am
Been thanked: 2 times

### Re: Dealing with brighter pixels on the edges of a CG render?

bowserlm wrote:
Thu Jun 14, 2018 4:16 pm
It's little things like this that make me so much happier to be comping in Fusion than in After Effects
I feel the same.

Added in 3 minutes 22 seconds:
Midgardsormr wrote:
Thu Jun 14, 2018 11:05 am
...while I cover more detailed text tutorials.
Hi Bryan,
I've gone through a bunch of your text tutorials online (thank you!), and wondered if you are any closer to actually publishing a real-life book? I'd love to have a book that I can read on the train to work, or pick up whenever I fancy (instead of having to turn on computer), just to soak up info and terminology etc.
Thanks,
J.

Midgardsormr
Fusionista
Posts: 706
Joined: Wed Nov 26, 2014 8:04 pm
Location: Los Angeles, CA, USA
Been thanked: 64 times
Contact:

### Re: Dealing with brighter pixels on the edges of a CG render?

jimbob wrote:
Fri Jun 15, 2018 2:11 am
Hi Bryan,
I've gone through a bunch of your text tutorials online (thank you!), and wondered if you are any closer to actually publishing a real-life book? I'd love to have a book that I can read on the train to work, or pick up whenever I fancy (instead of having to turn on computer), just to soak up info and terminology etc.
Thanks,
J.

I've had some setbacks, unfortunately, that have been making it difficult to proceed. I'm hoping to have revisions done quickly enough to get an ebook done by the time Resolve 15's beta period is over around September or so. I'm hopeful that the dead tree volume can be ready for the printer three to four months after that, at which point it's up to the printer's timetable.

jimbob
Posts: 40
Joined: Wed May 23, 2018 12:07 am
Been thanked: 2 times

### Re: Dealing with brighter pixels on the edges of a CG render?

Midgardsormr wrote:
Fri Jun 15, 2018 7:12 am
....
ebook done by the time Resolve 15's beta period is over around September or so....
Oh okay. An ebook would be cool too, I could have it on my phone etc.

Best of luck with it, there is so little documentation for Fusion (apart from the manual) , I'm sure it would be very popular.

All the best,

J.

gez
Posts: 49
Joined: Mon Jul 16, 2018 6:21 pm
Location: Argentina
Been thanked: 6 times
Contact:

### Re: Dealing with brighter pixels on the edges of a CG render?

jimbob wrote:
Thu Jun 14, 2018 4:47 am
This video from Vito / Con Fusion is really good at explaining / resolving edge-pixel weirdness.
Hi,
Although I love Vito's tutorials and they have made my first serious attempt to learn Fusion easier and really enjoyable, I have to point out a slight conceptual mistake in that video. A common one, probably caused by the damn term "premultiplied".
It is much better to use the term "associated alpha" rather than pre-multiplied, as not always the association of alpha values in the RGB plate is the result of a multiplication.
For instance, you could shot a candle on a pitch black background, roto the candle (not the flame) and you'd get a proper associated image, where the flame is expressed as pure emission and no occlusion (alpha= 0). The same happens with a CG render on black background. it's already associated, no need to premultiply.
In that particular case a pre-multiplication would destroy emissive pixels irremediably and/or produce a double up in AA/semitransparent pixels.

Alpha compositing is basically an addition: You're adding the light coming from the foreground objects to the light coming from the background. The alpha channel tells if the foreground occludes the background or not.

So important thing to keep in mind: if the source plate is for instance a greenscreen shot with an alpha pulled from a keyer, then yes. Premultiplying is the way to go as the source is unassociated (straight). Pre-dividing later will recover solid pixels from the AA and semitransparent pixels, with the important caveat that RGB where alpha is zero will be lost.
When you have a foreground with emissions (think lens flares, fire, lasers, or anything emissive from CG renders or vfx comps) you don't want to multiply by zero, as you would lose such effects. But you still need to pre-divide for grading and some specific operations, so you need to make sure that going back to associated (premultiplied) doesn't kill your emissions.

I haven't tested how Fusion's Alpha Multiply and Alpha Divide tools deal with emissive plates yet and a quick look didn't give me any hints as the nodes don't have any options. I'll try later and come back here with the results

gez
Posts: 49
Joined: Mon Jul 16, 2018 6:21 pm
Location: Argentina
Been thanked: 6 times
Contact:

### Re: Dealing with brighter pixels on the edges of a CG render?

I just ran some tests and found that ADv y AMl nuke the transparent pixels, which kind of sucks as in this example alpha=0 should be skipped by both (although isn't uncommon at all).

Fortunately those nodes also have a mask input, which helps solving the issue.
A quick and dirty way to solve this problem is to mask both Divide and Multiply nodes with a slightly choked version copy of the alpha channel. That's good enough for clean AA image borders, although it may not be sufficient for variable blurs, like DoF, motion blur or the like.

Code: Select all

{
Tools = ordered() {
NameSet = true,
Inputs = {
Input = Input {
SourceOp = "Premultiplied_INPUT",
Source = "Output",
},
SourceOp = "Bitmap",
}
},
ViewInfo = OperatorInfo { Pos = { 715, 280.5 } },
},
Premultiplied_INPUT = PipeRouter {
NameSet = true,
ViewInfo = PipeRouterInfo { Pos = { 598.5, 280.5 } },
},
CustomTool = Custom {
NameSet = true,
Inputs = {
LUTIn1 = Input {
SourceOp = "CustomToolLUTIn1",
Source = "Value",
},
LUTIn2 = Input {
SourceOp = "CustomToolLUTIn2",
Source = "Value",
},
LUTIn3 = Input {
SourceOp = "CustomToolLUTIn3",
Source = "Value",
},
LUTIn4 = Input {
SourceOp = "CustomToolLUTIn4",
Source = "Value",
},
RedExpression = Input { Value = " c1 - (1 - a1) * c2", },
GreenExpression = Input { Value = " c1 - (1 - a1) * c2", },
BlueExpression = Input { Value = " c1 - (1 - a1) * c2", },
Image1 = Input {
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 848, 280.5 } },
},
CustomToolLUTIn1 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 204, Green = 0, Blue = 0 },
NameSet = true,
},
CustomToolLUTIn2 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 0, Green = 204, Blue = 0 },
NameSet = true,
},
CustomToolLUTIn3 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 0, Green = 0, Blue = 204 },
NameSet = true,
},
CustomToolLUTIn4 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 204, Green = 204, Blue = 204 },
NameSet = true,
},
NameSet = true,
Inputs = {
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
Image = Input {
SourceOp = "Premultiplied_INPUT",
Source = "Output",
},
Low = Input { Value = 0.125, },
},
ViewInfo = OperatorInfo { Pos = { 849.5, 205 } },
},
AlphaMultiply = AlphaMultiply {
NameSet = true,
Inputs = {
Input = Input {
SourceOp = "CustomTool",
Source = "Output",
},
SourceOp = "Bitmap",
}
},
ViewInfo = OperatorInfo { Pos = { 990, 280.5 } },
}
}
}

gez
Posts: 49
Joined: Mon Jul 16, 2018 6:21 pm
Location: Argentina
Been thanked: 6 times
Contact:

### Alpha Divide zeroes RGB with Alpha 0

Fusion version:

9.0.2

OS and version:

Windows 10

Description of the bug:

The alpha divide node doesn't skip RGB pixels with Alpha=0. Instead, it makes them zero in RGB too.
This results in information loss in plates with emissive and transparent pixels (glows, lens flares, fire effects, etc.)

Severity (Trivial, Minor, Major, Critical)

Minor

Steps to reproduce:

Open any premultiplied image with luminescent effects and pass it through the Alpha Divide node. The output will have all the RGB data from the transparent pixels turned into 0.

Midgardsormr
Fusionista
Posts: 706
Joined: Wed Nov 26, 2014 8:04 pm
Location: Los Angeles, CA, USA
Been thanked: 64 times
Contact:

### Re: Alpha Divide zeroes RGB with Alpha 0

Confirmed. Here are some nodes to demonstrate the behavior. AlphaDivide; a CustomTool performing a divide by alpha, which outputs maximum allowed value; and a Boolean doing same, which looks identical to the AlphaDivide. The node CustomTool_desiredBehavior demonstrates what gez probably expects to see.

Code: Select all

{
Tools = ordered() {
ChannelBooleans1_2 = ChannelBoolean {
NameSet = true,
CustomData = {
Settings = {
[1] = {
Tools = ordered() {
ChannelBooleans1_1_5_9_6_5_8 = ChannelBoolean {
Inputs = {
Background = Input {
SourceOp = "P_EP8_900_Crait_lgtcraitA_A1__RGBA_",
Source = "Output"
}
},
Name = "ChannelBooleans1_1_5_9_6_5_8",
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { -14520, -346.5 } },
CustomData = {
}
}
}
},
}
},
Inputs = {
Operation = Input { Value = 12, },
ToRed = Input { Value = 4, },
ToGreen = Input { Value = 4, },
ToBlue = Input { Value = 4, },
Background = Input {
SourceOp = "Background1",
Source = "Output",
},
SourceOp = "Rectangle1",
},
},
ViewInfo = OperatorInfo { Pos = { 1100, -16.5 } },
UserControls = ordered() {
Blend = {
INP_MaxAllowed = 1000000,
INP_Integer = false,
INPID_InputControl = "SliderControl",
INP_MaxScale = 1,
INP_Default = 1,
INP_MinScale = 0,
INP_MinAllowed = -1000000,
ICS_ControlPage = "Color Channels",
}
}
},
Background1 = Background {
Inputs = {
GlobalIn = Input { Value = 1, },
GlobalOut = Input { Value = 21, },
Width = Input { Value = 1920, },
Height = Input { Value = 1080, },
["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
TopLeftRed = Input { Value = 0.276, },
TopLeftGreen = Input { Value = 0.094, },
SourceOp = "Ellipse1",
}
},
ViewInfo = OperatorInfo { Pos = { 990, -16.5 } },
},
Inputs = {
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
},
ViewInfo = OperatorInfo { Pos = { 1100, -49.5 } },
},
Inputs = {
MaskWidth = Input { Value = 1920, },
MaskHeight = Input { Value = 1080, },
PixelAspect = Input { Value = { 1, 1 }, },
ClippingMode = Input { Value = FuID { "None" }, },
},
ViewInfo = OperatorInfo { Pos = { 880, -16.5 } },
},
CustomTool_desiredBehavior = Custom {
CtrlWZoom = false,
NameSet = true,
CustomData = {
Settings = {
[1] = {
Tools = ordered() {
CustomTool1 = Custom {
Inputs = {
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value"
},
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value"
},
Image1 = Input {
SourceOp = "TimeSpeed1",
Source = "Output"
},
Image2 = Input {
SourceOp = "ChangeDepth1_1",
Source = "Output"
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value"
},
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value"
}
},
Name = "CustomTool1",
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 550, 181.5 } },
CustomData = {
}
},
CustomTool1LUTIn1 = LUTBezier {
Name = "CustomTool1LUTIn1",
NameSet = true,
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Green = 0, Blue = 0, Red = 204 }
},
CustomTool1LUTIn2 = LUTBezier {
Name = "CustomTool1LUTIn2",
NameSet = true,
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Green = 204, Blue = 0, Red = 0 }
},
CustomTool1LUTIn3 = LUTBezier {
Name = "CustomTool1LUTIn3",
NameSet = true,
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Green = 0, Blue = 204, Red = 0 }
},
CustomTool1LUTIn4 = LUTBezier {
Name = "CustomTool1LUTIn4",
NameSet = true,
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Green = 204, Blue = 204, Red = 204 }
}
}
},
[2] = {
Tools = ordered() {
CustomTool1 = Custom {
Inputs = {
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value"
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value"
},
Image2 = Input {
SourceOp = "ChangeDepth1_1",
Source = "Output"
},
RedExpression = Input { Value = "c1-c2" },
GreenExpression = Input { Value = "c1-c2" },
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value"
},
Image1 = Input {
SourceOp = "TimeSpeed1",
Source = "Output"
},
BlueExpression = Input { Value = "c1-c2" },
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value"
}
},
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 550, 181.5 } },
CustomData = {
}
},
CustomTool1LUTIn1 = LUTBezier {
SplineColor = { Green = 0, Blue = 0, Red = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn2 = LUTBezier {
SplineColor = { Green = 204, Blue = 0, Red = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn3 = LUTBezier {
SplineColor = { Green = 0, Blue = 204, Red = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn4 = LUTBezier {
SplineColor = { Green = 204, Blue = 204, Red = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
}
}
},
[3] = {
Tools = ordered() {
CustomTool1 = Custom {
Inputs = {
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value"
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value"
},
Image2 = Input {
SourceOp = "ChangeDepth1_1",
Source = "Output"
},
RedExpression = Input { Value = "c1+c2" },
GreenExpression = Input { Value = "c1+c2" },
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value"
},
Image1 = Input {
SourceOp = "TimeSpeed1",
Source = "Output"
},
BlueExpression = Input { Value = "c1+c2" },
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value"
}
},
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 550, 181.5 } },
CustomData = {
}
},
CustomTool1LUTIn1 = LUTBezier {
SplineColor = { Green = 0, Blue = 0, Red = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn2 = LUTBezier {
SplineColor = { Green = 204, Blue = 0, Red = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn3 = LUTBezier {
SplineColor = { Green = 0, Blue = 204, Red = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn4 = LUTBezier {
SplineColor = { Green = 204, Blue = 204, Red = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
}
}
},
}
},
Inputs = {
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value",
},
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value",
},
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value",
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value",
},
RedExpression = Input { Value = "if(a1~=0, c1/a1, c1)", },
GreenExpression = Input { Value = "if(a1~=0, c1/a1, c1)", },
BlueExpression = Input { Value = "if(a1~=0, c1/a1, c1)", },
Image1 = Input {
SourceOp = "ChannelBooleans1_2",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1210, -82.5 } },
},
CustomTool1LUTIn1 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 204, Green = 0, Blue = 0 },
NameSet = true,
},
CustomTool1LUTIn2 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 0, Green = 204, Blue = 0 },
NameSet = true,
},
CustomTool1LUTIn3 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 0, Green = 0, Blue = 204 },
NameSet = true,
},
CustomTool1LUTIn4 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 204, Green = 204, Blue = 204 },
NameSet = true,
},
ChannelBooleans1_3 = ChannelBoolean {
NameSet = true,
CustomData = {
Settings = {
[1] = {
Tools = ordered() {
ChannelBooleans1_1_5_9_6_5_8 = ChannelBoolean {
Inputs = {
Background = Input {
SourceOp = "P_EP8_900_Crait_lgtcraitA_A1__RGBA_",
Source = "Output"
}
},
Name = "ChannelBooleans1_1_5_9_6_5_8",
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { -14520, -346.5 } },
CustomData = {
}
}
}
},
}
},
Inputs = {
Operation = Input { Value = 7, },
ToRed = Input { Value = 3, },
ToGreen = Input { Value = 3, },
ToBlue = Input { Value = 3, },
ToAlpha = Input { Value = 4, },
Background = Input {
SourceOp = "ChannelBooleans1_2",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1210, 49.5 } },
UserControls = ordered() {
Blend = {
INP_MaxAllowed = 1000000,
INP_Integer = false,
INPID_InputControl = "SliderControl",
INP_MaxScale = 1,
INP_Default = 1,
INP_MinScale = 0,
INP_MinAllowed = -1000000,
ICS_ControlPage = "Color Channels",
}
}
},
CustomTool1 = Custom {
NameSet = true,
CustomData = {
Settings = {
[1] = {
Tools = ordered() {
CustomTool1 = Custom {
Inputs = {
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value"
},
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value"
},
Image1 = Input {
SourceOp = "TimeSpeed1",
Source = "Output"
},
Image2 = Input {
SourceOp = "ChangeDepth1_1",
Source = "Output"
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value"
},
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value"
}
},
Name = "CustomTool1",
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 550, 181.5 } },
CustomData = {
}
},
CustomTool1LUTIn1 = LUTBezier {
Name = "CustomTool1LUTIn1",
NameSet = true,
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Green = 0, Blue = 0, Red = 204 }
},
CustomTool1LUTIn2 = LUTBezier {
Name = "CustomTool1LUTIn2",
NameSet = true,
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Green = 204, Blue = 0, Red = 0 }
},
CustomTool1LUTIn3 = LUTBezier {
Name = "CustomTool1LUTIn3",
NameSet = true,
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Green = 0, Blue = 204, Red = 0 }
},
CustomTool1LUTIn4 = LUTBezier {
Name = "CustomTool1LUTIn4",
NameSet = true,
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Green = 204, Blue = 204, Red = 204 }
}
}
},
[2] = {
Tools = ordered() {
CustomTool1 = Custom {
Inputs = {
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value"
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value"
},
Image2 = Input {
SourceOp = "ChangeDepth1_1",
Source = "Output"
},
RedExpression = Input { Value = "c1-c2" },
GreenExpression = Input { Value = "c1-c2" },
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value"
},
Image1 = Input {
SourceOp = "TimeSpeed1",
Source = "Output"
},
BlueExpression = Input { Value = "c1-c2" },
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value"
}
},
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 550, 181.5 } },
CustomData = {
}
},
CustomTool1LUTIn1 = LUTBezier {
SplineColor = { Green = 0, Blue = 0, Red = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn2 = LUTBezier {
SplineColor = { Green = 204, Blue = 0, Red = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn3 = LUTBezier {
SplineColor = { Green = 0, Blue = 204, Red = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn4 = LUTBezier {
SplineColor = { Green = 204, Blue = 204, Red = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
}
}
},
[3] = {
Tools = ordered() {
CustomTool1 = Custom {
Inputs = {
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value"
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value"
},
Image2 = Input {
SourceOp = "ChangeDepth1_1",
Source = "Output"
},
RedExpression = Input { Value = "c1+c2" },
GreenExpression = Input { Value = "c1+c2" },
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value"
},
Image1 = Input {
SourceOp = "TimeSpeed1",
Source = "Output"
},
BlueExpression = Input { Value = "c1+c2" },
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value"
}
},
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 550, 181.5 } },
CustomData = {
}
},
CustomTool1LUTIn1 = LUTBezier {
SplineColor = { Green = 0, Blue = 0, Red = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn2 = LUTBezier {
SplineColor = { Green = 204, Blue = 0, Red = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn3 = LUTBezier {
SplineColor = { Green = 0, Blue = 204, Red = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn4 = LUTBezier {
SplineColor = { Green = 204, Blue = 204, Red = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
}
}
},
}
},
Inputs = {
LUTIn1 = Input {
SourceOp = "CustomTool_desiredBehavior_1LUTIn1",
Source = "Value",
},
LUTIn2 = Input {
SourceOp = "CustomTool_desiredBehavior_1LUTIn2",
Source = "Value",
},
LUTIn3 = Input {
SourceOp = "CustomTool_desiredBehavior_1LUTIn3",
Source = "Value",
},
LUTIn4 = Input {
SourceOp = "CustomTool_desiredBehavior_1LUTIn4",
Source = "Value",
},
RedExpression = Input { Value = "c1/a1", },
GreenExpression = Input { Value = "c1/a1", },
BlueExpression = Input { Value = "c1/a1", },
Image1 = Input {
SourceOp = "ChannelBooleans1_2",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1210, 16.5 } },
},
CustomTool_desiredBehavior_1LUTIn1 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 204, Green = 0, Blue = 0 },
NameSet = true,
},
CustomTool_desiredBehavior_1LUTIn2 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 0, Green = 204, Blue = 0 },
NameSet = true,
},
CustomTool_desiredBehavior_1LUTIn3 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 0, Green = 0, Blue = 204 },
NameSet = true,
},
CustomTool_desiredBehavior_1LUTIn4 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 204, Green = 204, Blue = 204 },
NameSet = true,
},
Inputs = {
Input = Input {
SourceOp = "ChannelBooleans1_2",
Source = "Output",
},
},
ViewInfo = OperatorInfo { Pos = { 1210, -16.5 } },
}
}
}



gez
Posts: 49
Joined: Mon Jul 16, 2018 6:21 pm
Location: Argentina
Been thanked: 6 times
Contact:

### Re: Alpha Divide zeroes RGB with Alpha 0

Thanks Bryan for the follow up and for taking the time to produce those samples.
Indeed, that's what I expect. However, I'd argue that it's preferable to only allow values >0 as you don't want/expect negatives in an alpha channel, but I guess it's just nit picking (and I might be missing some corner case that justifies it).

Just in case, I leave the modified custom tool reflecting that:

Code: Select all

{
Tools = ordered() {
CustomTool_desiredBehavior = Custom {
CtrlWZoom = false,
NameSet = true,
CustomData = {
Settings = {
[1] = {
Tools = ordered() {
CustomTool1 = Custom {
Inputs = {
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value"
},
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value"
},
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value"
},
Image2 = Input {
SourceOp = "ChangeDepth1_1",
Source = "Output"
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value"
},
Image1 = Input {
SourceOp = "TimeSpeed1",
Source = "Output"
}
},
Name = "CustomTool1",
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 550, 181.5 } },
CustomData = {
}
},
CustomTool1LUTIn1 = LUTBezier {
Name = "CustomTool1LUTIn1",
SplineColor = { Red = 204, Blue = 0, Green = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn2 = LUTBezier {
Name = "CustomTool1LUTIn2",
SplineColor = { Red = 0, Blue = 0, Green = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn3 = LUTBezier {
Name = "CustomTool1LUTIn3",
SplineColor = { Red = 0, Blue = 204, Green = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn4 = LUTBezier {
Name = "CustomTool1LUTIn4",
SplineColor = { Red = 204, Blue = 204, Green = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
}
}
},
[2] = {
Tools = ordered() {
CustomTool1 = Custom {
Inputs = {
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value"
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value"
},
Image2 = Input {
SourceOp = "ChangeDepth1_1",
Source = "Output"
},
RedExpression = Input { Value = "c1-c2" },
GreenExpression = Input { Value = "c1-c2" },
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value"
},
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value"
},
BlueExpression = Input { Value = "c1-c2" },
Image1 = Input {
SourceOp = "TimeSpeed1",
Source = "Output"
}
},
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 550, 181.5 } },
CustomData = {
}
},
CustomTool1LUTIn1 = LUTBezier {
SplineColor = { Red = 204, Blue = 0, Green = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn2 = LUTBezier {
SplineColor = { Red = 0, Blue = 0, Green = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn3 = LUTBezier {
SplineColor = { Red = 0, Blue = 204, Green = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn4 = LUTBezier {
SplineColor = { Red = 204, Blue = 204, Green = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
}
}
},
[3] = {
Tools = ordered() {
CustomTool1 = Custom {
Inputs = {
LUTIn3 = Input {
SourceOp = "CustomTool1LUTIn3",
Source = "Value"
},
LUTIn4 = Input {
SourceOp = "CustomTool1LUTIn4",
Source = "Value"
},
Image2 = Input {
SourceOp = "ChangeDepth1_1",
Source = "Output"
},
RedExpression = Input { Value = "c1+c2" },
GreenExpression = Input { Value = "c1+c2" },
LUTIn1 = Input {
SourceOp = "CustomTool1LUTIn1",
Source = "Value"
},
LUTIn2 = Input {
SourceOp = "CustomTool1LUTIn2",
Source = "Value"
},
BlueExpression = Input { Value = "c1+c2" },
Image1 = Input {
SourceOp = "TimeSpeed1",
Source = "Output"
}
},
CtrlWZoom = false,
ViewInfo = OperatorInfo { Pos = { 550, 181.5 } },
CustomData = {
}
},
CustomTool1LUTIn1 = LUTBezier {
SplineColor = { Red = 204, Blue = 0, Green = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn2 = LUTBezier {
SplineColor = { Red = 0, Blue = 0, Green = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn3 = LUTBezier {
SplineColor = { Red = 0, Blue = 204, Green = 0 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
},
CustomTool1LUTIn4 = LUTBezier {
SplineColor = { Red = 204, Blue = 204, Green = 204 },
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
NameSet = true
}
}
},
}
},
Inputs = {
LUTIn1 = Input {
SourceOp = "CustomTool_desiredBehavior_2LUTIn1",
Source = "Value",
},
LUTIn2 = Input {
SourceOp = "CustomTool_desiredBehavior_2LUTIn2",
Source = "Value",
},
LUTIn3 = Input {
SourceOp = "CustomTool_desiredBehavior_2LUTIn3",
Source = "Value",
},
LUTIn4 = Input {
SourceOp = "CustomTool_desiredBehavior_2LUTIn4",
Source = "Value",
},
RedExpression = Input { Value = "if(a1>0, c1/a1, c1)", },
GreenExpression = Input { Value = "if(a1>0, c1/a1, c1)", },
BlueExpression = Input { Value = "if(a1>0, c1/a1, c1)", },
AlphaExpression = Input { Value = "a1\n", },
},
ViewInfo = OperatorInfo { Pos = { 953, 80 } },
},
CustomTool_desiredBehavior_2LUTIn1 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 204, Green = 0, Blue = 0 },
NameSet = true,
},
CustomTool_desiredBehavior_2LUTIn2 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 0, Green = 204, Blue = 0 },
NameSet = true,
},
CustomTool_desiredBehavior_2LUTIn3 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 0, Green = 0, Blue = 204 },
NameSet = true,
},
CustomTool_desiredBehavior_2LUTIn4 = LUTBezier {
KeyColorSplines = {
[0] = {
[0] = { 0, RH = { 0.333333333333333, 0.333333333333333 }, Flags = { Linear = true } },
[1] = { 1, LH = { 0.666666666666667, 0.666666666666667 }, Flags = { Linear = true } }
}
},
SplineColor = { Red = 204, Green = 204, Blue = 204 },
NameSet = true,
}
},
ActiveTool = "CustomTool_desiredBehavior"
}

This could be applied to the Alpha Multiply node as well, but in that case as an option, as in you might want to make pixels with alpha zero transparent in some cases (like pre-multiplying keyed footage)