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

Moderator: SecondMan

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

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

#1

Post by bowserlm » Wed Jun 13, 2018 7:22 pm

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.

User avatar
Midgardsormr
Fusionista
Posts: 799
Joined: Wed Nov 26, 2014 8:04 pm
Location: Los Angeles, CA, USA
Been thanked: 87 times
Contact:

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

#2

Post by Midgardsormr » Wed Jun 13, 2018 8:17 pm

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() {
  3.         AlphaDivide2 = AlphaDivide {
  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 {
  28.                     SourceOp = "AlphaDivide2",
  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?

#3

Post by jimbob » Thu Jun 14, 2018 4:47 am

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


User avatar
SecondMan
Site Admin
Posts: 2806
Joined: Thu Jul 31, 2014 5:31 pm
Location: Vancouver, Canada
Been thanked: 114 times
Contact:

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

#4

Post by SecondMan » Thu Jun 14, 2018 10:18 am

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

User avatar
Midgardsormr
Fusionista
Posts: 799
Joined: Wed Nov 26, 2014 8:04 pm
Location: Los Angeles, CA, USA
Been thanked: 87 times
Contact:

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

#5

Post by Midgardsormr » Thu Jun 14, 2018 11:05 am

:) 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: 205
Joined: Sat Apr 28, 2018 3:44 pm
Been thanked: 3 times

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

#6

Post by bowserlm » Thu Jun 14, 2018 4:16 pm

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?

#7

Post by jimbob » Fri Jun 15, 2018 2:08 am

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.

User avatar
Midgardsormr
Fusionista
Posts: 799
Joined: Wed Nov 26, 2014 8:04 pm
Location: Los Angeles, CA, USA
Been thanked: 87 times
Contact:

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

#8

Post by Midgardsormr » Fri Jun 15, 2018 7:12 am

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?

#9

Post by jimbob » Sat Jun 16, 2018 2:26 am

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.

User avatar
gez
Fusioneer
Posts: 55
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?

#10

Post by gez » Thu Jul 26, 2018 10:20 pm

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

User avatar
gez
Fusioneer
Posts: 55
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?

#11

Post by gez » Fri Jul 27, 2018 11:20 am

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).

Image

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.

Image

Code: Select all

{
	Tools = ordered() {
		AlphaDivide = AlphaDivide {
			NameSet = true,
			Inputs = {
				Input = Input {
					SourceOp = "Premultiplied_INPUT",
					Source = "Output",
				},
				EffectMask = Input {
					SourceOp = "Bitmap",
					Source = "Mask",
				}
			},
			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 {
					SourceOp = "AlphaDivide",
					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,
		},
		Bitmap = BitmapMask {
			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",
				},
				EffectMask = Input {
					SourceOp = "Bitmap",
					Source = "Mask",
				}
			},
			ViewInfo = OperatorInfo { Pos = { 990, 280.5 } },
		}
	}
}

User avatar
gez
Fusioneer
Posts: 55
Joined: Mon Jul 16, 2018 6:21 pm
Location: Argentina
Been thanked: 6 times
Contact:

Alpha Divide zeroes RGB with Alpha 0

#12

Post by gez » Fri Jul 27, 2018 3:43 pm

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.

User avatar
Midgardsormr
Fusionista
Posts: 799
Joined: Wed Nov 26, 2014 8:04 pm
Location: Los Angeles, CA, USA
Been thanked: 87 times
Contact:

Re: Alpha Divide zeroes RGB with Alpha 0

#13

Post by Midgardsormr » Fri Jul 27, 2018 3:58 pm

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",
				},
				EffectMask = Input {
					SourceOp = "Rectangle1",
					Source = "Mask",
				},
			},
			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,
					LINKID_DataType = "Number",
					ICS_ControlPage = "Color Channels",
					LINKS_Name = "Blend"
				}
			}
		},
		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, },
				EffectMask = Input {
					SourceOp = "Ellipse1",
					Source = "Mask",
				}
			},
			ViewInfo = OperatorInfo { Pos = { 990, -16.5 } },
		},
		Rectangle1 = RectangleMask {
			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 } },
		},
		Ellipse1 = EllipseMask {
			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,
					LINKID_DataType = "Number",
					ICS_ControlPage = "Color Channels",
					LINKS_Name = "Blend"
				}
			}
		},
		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,
		},
		AlphaDivide1 = AlphaDivide {
			Inputs = {
				Input = Input {
					SourceOp = "ChannelBooleans1_2",
					Source = "Output",
				},
			},
			ViewInfo = OperatorInfo { Pos = { 1210, -16.5 } },
		}
	}
}


User avatar
gez
Fusioneer
Posts: 55
Joined: Mon Jul 16, 2018 6:21 pm
Location: Argentina
Been thanked: 6 times
Contact:

Re: Alpha Divide zeroes RGB with Alpha 0

#14

Post by gez » Fri Jul 27, 2018 4:38 pm

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)

User avatar
Chad
Fusionator
Posts: 1296
Joined: Fri Aug 08, 2014 1:11 pm
Been thanked: 21 times

Re: Alpha Divide zeroes RGB with Alpha 0

#15

Post by Chad » Fri Jul 27, 2018 7:41 pm

I wouldn't say that is expected at all. Any time the alpha is black, the RGB shouldn't matter. I could see the argument for allowing an option to set the RGB to huge, but since you shouldn't be doing filtering on the image, why does it matter?