The Matte in the Nuker Mask
Before I start, I could not remember who and where did I get the advice to avoid relying the mask input in Nuke.
Just a nagging feeling when I’m new to Nuke and in the end, abuse the mask function a lot where applicable.
So the idea of masking in Nuke is similar to the Mask/Track Matte function in After Effects. If you understand how alpha works, masking should be straight forward.
Quick checklist for Masking in Nuke
- Masking uses the same method like how alpha works. White is opaque while black is transparent.
- Nuke allows you to choose your desire channel when applying a mask. You can use existing channel from upstream or if the node supports it, the Mask input.
- Be warned that masking is not recommended for some effects which I’ll explained more below.
How masking works
^The above GIF shows a straightforward process of using the mask input in Nuke. If you see a tiny arrowhead at the side of a node, 99.99% that it will be for mask input.
Choosing your channels
If you planning to reuse a set of masks frequently in your comp, I recommend creating a set of channels/layers and copy it to the node stream.
When not to use mask
As shown in the GIF, be very careful when you think of masking an effect like Defocus.
Soft edges in the mask will not blend the effect properly as it combines the the Defocus effect and the original plate. So instead of a proper transition of strong to softer blurring, we see the part of the blur effect being composite back onto the original plate.
If the node doesn’t support channel that drives the amount of effect (e.g. Defocus, Blur), look for alternative node instead.
Here’s the sample script use for this demo
set cut_paste_input [stack 0] version 9.0 v5b43 StickyNote { inputs 0 name StickyNote1 label "You can use this as\na form of garbage\nmatte through this method.\n\nJust make sure to label\nproperly if you work in a\nteam environment." note_font "Verdana Italic" note_font_size 16 selected true xpos 258 ypos 97 } add_layer {taukeke taukeke.mask none taukeke.triangle} Roto { inputs 0 output {taukeke.mask none -taukeke.triangle} curves {{{v x3f99999a} {f 0} {n {layer Root {f 2097152} {t x44700000 x44070000} {a pt1x 0 pt1y 0 pt2x 0 pt2y 0 pt3x 0 pt3y 0 pt4x 0 pt4y 0 ptex00 0 ptex01 0 ptex02 0 ptex03 0 ptex10 0 ptex11 0 ptex12 0 ptex13 0 ptex20 0 ptex21 0 ptex22 0 ptex23 0 ptex30 0 ptex31 0 ptex32 0 ptex33 0 ptof1x 0 ptof1y 0 ptof2x 0 ptof2y 0 ptof3x 0 ptof3y 0 ptof4x 0 ptof4y 0 pterr 0 ptrefset 0 ptmot x40800000 ptref 0} {curvegroup Ellipse1 512 bezier {{cc {f 8192} {px x42140000 {xc1ee9640 0} {x44450000 x43620000} {x41ee9640 0} {0 xc20256d4} {x44528000 x438e8000} {0 x420256d8} {x41ee9640 0} {x44450000 x43ac0000} {xc1ee9640 0} {0 x420256d8} {x44378000 x438e8000} {0 xc20256d4}}} {cc {f 8192} {p {{{x42140000 xc1ee9640}} {{x42140000 0}}} {{{x42140000 0}} {{x42140000 0}}} {{{x42140000 x41ee9640}} {{x42140000 0}}} {{{x42140000 0}} {{x42140000 xc20256d4}}} {{{x42140000 0}} {{x42140000 0}}} {{{x42140000 0}} {{x42140000 x420256d8}}} {{{x42140000 x41ee9640}} {{x42140000 0}}} {{{x42140000 0}} {{x42140000 0}}} {{{x42140000 xc1ee9640}} {{x42140000 0}}} {{{x42140000 0}} {{x42140000 x420256d8}}} {{{x42140000 0}} {{x42140000 0}}} {{{x42140000 0}} {{x42140000 xc20256d4}}}}}} {tx x42140000 x44450000 x438e8000} {a bm x41400000 osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 ltn x42140000 ltm x42140000 tt x40e00000}} {curvegroup Bezier4 512 bezier {{cc {f 8192} {px x42140000 {0 0} {x44a90000 x43ee0000} {0 0} {0 0} {x44b54000 x43ee8000} {0 0} {0 0} {x44b54000 x43530000} {0 0} {0 0} {x44c16000 x439d0000} {0 0} {0 0} {x44cb8000 x439d8000} {0 0} {0 0} {x44bd8000 x432c0000} {0 0} {0 0} {x44c78000 x42800000} {0 0} {0 0} {x44bdc000 x42240000} {0 0} {0 0} {x44b62000 x43010000} {0 0} {0 0} {x44b5e000 x42240000} {0 0} {0 0} {x44a84ccd x421d9998} {0 0}}} idem} {tx x42140000 x44b94e8c x435245d1} {a osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 ltn x42140000 ltm x42140000 tt x40800000}} {curvegroup Bezier3 512 bezier {{cc {f 8192} {px x42140000 {0 0} {x44930000 x43ba0000} {0 0} {0 0} {x449ac000 x43ba0000} {0 0} {x42ac0000 x40800000} {x448c0000 x43e60000} {xc2ac0000 xc0800000} {xc1b00000 x42480000} {x44768000 x43a50000} {x41b00000 xc2480000} {xb9000000 x4257ffe8} {x448ec000 x435e0000} {0 xc2dc0000} {x41f00000 xc2840000} {x44834000 x43120000} {xc1f80000 1} {0 0} {x44748000 x43140000} {0 0} {xc2ac0000 xc0000000} {x4486c000 x42780000} {x42ac0000 x40000000} {xc1600000 xc2400000} {x44964000 x43280000} {x41600000 x42400000} {x42e80000 xc1e00000} {x448a0000 x439e0000} {xc2e80000 x41e00000} {xc1c15480 x38000000} {x448a0000 x43ca0000} {x42900000 0}}} idem} {tx x42140000 x448a62e9 x43885d17} {a osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 ltn x42140000 ltm x42140000 tt x40800000}} {curvegroup Bezier2 512 bezier {{cc {f 8192} {px x42140000 {0 0} {x44558000 x43c30000} {0 0} {0 0} {x44508000 x43e10000} {0 0} {0 0} {x44668000 x43e30000} {0 0} {0 0} {x446a0000 x431c0000} {0 0} {0 0} {x445b0000 x431a0000} {0 0} {0 0} {x44578000 x434c0000} {0 0} {x42780000 xc1c00000} {x44348000 x43260000} {xc2780000 x41c00000} {xc2c40000 xc1a00000} {x442c0000 x43c70000} {x42c40000 x41a00000}}} idem} {tx x42140000 x44513000 x43944000} {a osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 ltn x42140000 ltm x42140000 tt x40800000}} {curvegroup Bezier1 512 bezier {{cc {f 8192} {px x42140000 {0 0} {x430e0000 x43a20000} {0 0} {0 0} {x43580000 x43ac0000} {0 0} {0 0} {x43740000 x438b0000} {0 0} {xc2a80004 x427e6660} {x43c56667 x43a13334} {x421cccc8 x42ef3330} {xc1900000 x41c00000} {x44048000 x43b30000} {x41900000 xc1c00000} {0 0} {x44180000 x432a0000} {0 0} {0 x40800000} {x440c8000 x43200000} {0 xc0800000} {x41e00000 x42b80000} {x43dd0000 x43880000} {xc0c00000 xc0000000} {0 0} {x43d90000 x436e0000} {0 0} {0 0} {x43be0000 x43660000} {0 0} {x42080000 x41000000} {x43a2cccb x43853334} {xc2080000 xc1000000} {xc1c00000 x42600000} {x43a90002 x42e1999c} {xc22b3330 xc1a00000} {0 0} {x437b333a x428d999b} {0 0}}} idem} {tx x42140000 x43bb1b91 x437656a5} {a osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 ltn x42140000 ltm x42140000 tt x40800000}}}}}} toolbox {selectAll { { selectAll str 1 ssx 1 ssy 1 sf 1 } { createBezier str 1 ssx 1 ssy 1 sf 1 sb 1 tt 4 } { createBezierCusped str 1 ssx 1 ssy 1 sf 1 sb 1 } { createBSpline str 1 ssx 1 ssy 1 sf 1 sb 1 } { createEllipse str 1 ssx 1 ssy 1 sf 1 sb 1 tt 7 } { createRectangle str 1 ssx 1 ssy 1 sf 1 sb 1 } { createRectangleCusped str 1 ssx 1 ssy 1 sf 1 sb 1 } { brush str 1 ssx 1 ssy 1 sf 1 sb 1 } { eraser src 2 str 1 ssx 1 ssy 1 sf 1 sb 1 } { clone src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { reveal src 3 str 1 ssx 1 ssy 1 sf 1 sb 1 } { dodge src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { burn src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { blur src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { sharpen src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { smear src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } } } toolbar_brush_hardness 0.200000003 toolbar_source_transform_scale {1 1} toolbar_source_transform_center {960 540} colorOverlay {0 0 0 0} blending_mode minus lifetime_type "all frames" lifetime_start 37 lifetime_end 37 motionblur_shutter_offset_type centred source_black_outside true name Roto2 selected true xpos 280 ypos 327 } set N82445c00 [stack 0] Dot { name Dot14 label "For this example, I created a\nnew channel called \"taukeke\"\nwhich I need to copy its layer\ninto the stream using the\nCOPY node for use later\nin the downstream" note_font "Verdana Bold Bold Bold Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos 314 ypos 463 } Dot { name Dot8 selected true xpos 314 ypos 574 } push $N82445c00 Roto { inputs 0 output alpha curves {{{v x3f99999a} {f 0} {n {layer Root {f 2097152} {t x44700000 x44070000} {a pt1x 0 pt1y 0 pt2x 0 pt2y 0 pt3x 0 pt3y 0 pt4x 0 pt4y 0 ptex00 0 ptex01 0 ptex02 0 ptex03 0 ptex10 0 ptex11 0 ptex12 0 ptex13 0 ptex20 0 ptex21 0 ptex22 0 ptex23 0 ptex30 0 ptex31 0 ptex32 0 ptex33 0 ptof1x 0 ptof1y 0 ptof2x 0 ptof2y 0 ptof3x 0 ptof3y 0 ptof4x 0 ptof4y 0 pterr 0 ptrefset 0 ptmot x40800000 ptref 0} {curvegroup Bezier5 512 bezier {{cc {f 8192} {px 1 {0 0} {x44576000 x44214000} {0 0} {0 0} {x4461a000 x43ecc000} {0 0} {0 0} {x44562000 x43ea8000} {0 0}}} idem} {tx 1 x445a6000 x44044aab} {a bm x41400000 osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 tt x40800000}} {curvegroup Bezier4 512 bezier {{cc {f 8192} {px 1 {0 0} {x44b2c000 x44638000} {0 0} {0 0} {x44be0000 x44670000} {0 0} {0 0} {x44c40000 x44180000} {0 0} {0 0} {x44d18000 x44668000} {0 0} {0 0} {x44de0000 x446c0000} {0 0} {0 0} {x44cdc000 x44100000} {0 0} {0 0} {x44e50000 x43880000} {0 0} {0 0} {x44d50000 x43880000} {0 0} {0 0} {x44c50000 x44040000} {0 0} {0 0} {x44c64000 x436c0000} {0 0} {0 0} {x44bb0000 x436c0000} {0 0}}} idem} {tx 1 x44ca62e9 x44121746} {a osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 tt x40800000}} {curvegroup Bezier3 512 bezier {{cc {f 8192} {px 1 {0 0} {x4498c000 x44348000} {0 0} {0 0} {x44a4c000 x44390000} {0 0} {x42f00000 x41c00000} {x448c8000 x44540000} {xc2f00000 xc1c00000} {xc2f80000 x40800000} {x44878000 x44080000} {x42f80000 xc0800000} {xc1f00000 x42a80000} {x44a04000 x43e60000} {x41f00000 xc2a80000} {0 0} {x448a4ccd x43903333} {0 0} {0 0} {x448dcccd x43686666} {0 0} {x42280000 xc2e40000} {x44ac4000 x43e50000} {xc2280000 x42e40000} {x42f00000 xc1900000} {x448c8000 x441a0000} {xc2f00000 x41900000} {xc2180000 x40c00000} {x448ec000 x443f0000} {x42180000 xc0c00000}}} idem} {tx 1 x44961333 x440ee666} {a osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 tt x40800000}} {curvegroup Bezier2 512 bezier {{cc {f 8192} {px 1 {0 0} {x44488000 x44478000} {0 0} {0 0} {x443a8000 x43400000} {0 0} {0 0} {x44488000 x43440000} {0 0} {0 0} {x44550000 x43ca0000} {0 0} {0 0} {x44668000 x43d00000} {0 0} {0 0} {x44748000 x43460000} {0 0} {0 0} {x4483c000 x43520000} {0 0} {0 0} {x445b8000 x44498000} {0 0}}} idem} {tx 1 x445bd000 x43c94000} {a osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 tt x40800000}} {curvegroup Bezier1 512 bezier {{cc {f 8192} {px 1 {0 0} {x43280000 x44510000} {0 0} {0 0} {x43830000 x44568000} {0 0} {0 0} {x43ca0000 x44180000} {0 0} {0 0} {x43db0000 x445e0000} {0 0} {0 0} {x441c8000 x44600000} {0 0} {0 0} {x44210000 x430a0000} {0 0} {0 0} {x44050000 x430e0000} {0 0} {0 0} {x44050000 x43ff0000} {0 0} {0 0} {x43dd0000 x43c90000} {0 0} {0 0} {x43b20000 x44030000} {0 0} {0 0} {x439d0000 x432c0000} {0 0} {0 0} {x43420000 x43340000} {0 0}}} idem} {tx 1 x43ccaaab x44003555} {a osw x41200000 osf 0 str 1 spx x44700000 spy x44070000 sb 1 tt x40800000}}}}}} toolbox {selectAll { { selectAll str 1 ssx 1 ssy 1 sf 1 } { createBezier str 1 ssx 1 ssy 1 sf 1 sb 1 tt 4 } { createBezierCusped str 1 ssx 1 ssy 1 sf 1 sb 1 } { createBSpline str 1 ssx 1 ssy 1 sf 1 sb 1 } { createEllipse str 1 ssx 1 ssy 1 sf 1 sb 1 } { createRectangle str 1 ssx 1 ssy 1 sf 1 sb 1 } { createRectangleCusped str 1 ssx 1 ssy 1 sf 1 sb 1 } { brush str 1 ssx 1 ssy 1 sf 1 sb 1 } { eraser src 2 str 1 ssx 1 ssy 1 sf 1 sb 1 } { clone src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { reveal src 3 str 1 ssx 1 ssy 1 sf 1 sb 1 } { dodge src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { burn src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { blur src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { sharpen src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { smear src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } } } toolbar_brush_hardness 0.200000003 toolbar_source_transform_scale {1 1} toolbar_source_transform_center {960 540} colorOverlay {0 0 0 0} blending_mode minus lifetime_type "all frames" motionblur_shutter_offset_type centred source_black_outside true name Roto1 selected true xpos 305 ypos -128 } Dot { name Dot12 label "The MASK\nroto shape output\nas alpha" note_font "Verdana Bold Bold Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos 339 ypos -54 } Dot { name Dot11 selected true xpos 339 ypos 30 } Constant { inputs 0 channels alpha color 1 name Constant1 selected true xpos -367 ypos -262 } ColorBars { inputs 0 PAL true name ColorBars1 selected true xpos -221 ypos -384 } Copy { inputs 2 from0 rgba.alpha to0 rgba.alpha name Copy1 selected true xpos -221 ypos -238 } Dot { name Dot9 label "I copy a white alpha\nchannel into this stream\nsince the ColorBars don't\ngenerate it's own Alpha\nchannel" note_font "Verdana Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos -187 ypos -125 } Dot { name Dot1 selected true xpos -187 ypos 30 } push $cut_paste_input Ramp { output {rgba.red rgba.green rgba.blue -rgba.alpha} replace true p0 {100 -12} p1 {100 908} type plinear color {1 0.417224 0 1} color_panelDropped true name Ramp1 selected true xpos 65 ypos -214 } Dot { name Dot10 label "Just a regular\nramp aka gradient" note_font "Verdana Bold Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos 99 ypos -129 } Merge2 { inputs 2+1 name Merge1 selected true xpos 65 ypos 26 } Dot { name Dot13 label "The Merge node\nis masked using\nthe mask input\nconnected to the\nMASK roto" note_font "Verdana Bold Bold Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos 99 ypos 127 } Grade { inputs 1+1 white {0 0.556425 1 1} white_panelDropped true gamma 5 maskChannelMask taukeke.mask name Grade2 selected true xpos 65 ypos 333 } Copy { inputs 2 from0 -taukeke.mask to0 -taukeke.mask channels taukeke name Copy2 selected true xpos 65 ypos 557 } Dot { name Dot7 selected true xpos 99 ypos 659 } ColorWheel { inputs 0 gamma 0.45 name ColorWheel1 selected true xpos 862 ypos -225 } Dot { name Dot15 label "ColorWheel is a great\nexample to demo the\nRED GREEN BLUE\nchannel as mask" note_font "Verdana Bold Bold Bold Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos 896 ypos -66 } Dot { name Dot2 selected true xpos 896 ypos 55 } set N10566800 [stack 0] Dot { name Dot4 selected true xpos 1013 ypos 55 } Dot { name Dot16 label "The RED channel is\nused here as the\nmask for Grade1" note_font "Verdana Bold Bold Bold Bold Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos 1013 ypos 124 } Dot { name Dot3 selected true xpos 1013 ypos 196 } set N10566400 [stack 0] Dot { name Dot17 label "The BLUE channel is\nused here as the\nmask for ColorCorrect1" note_font "Verdana Bold Bold Bold Bold Bold Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos 1013 ypos 270 } Dot { name Dot5 selected true xpos 1013 ypos 360 } set N9e5df800 [stack 0] Dot { name Dot18 label "The GREEN channel is\nused here as the\nmask for HueShift1\n\nSo you noticed the copy\npasta I mean paste\ndescription. :)" note_font "Verdana Bold Bold Bold Bold Bold Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos 1013 ypos 429 } Dot { name Dot6 selected true xpos 1013 ypos 517 } push $N9e5df800 push $N10566400 push $N10566800 Grade { inputs 1+1 multiply {{curve x1 0 x50 1 x100 0}} maskChannelMask rgba.red name Grade1 selected true xpos 862 ypos 192 } ColorCorrect { inputs 1+1 saturation {{curve x1 1 x50 0 x100 1}} maskChannelMask rgba.green name ColorCorrect1 selected true xpos 862 ypos 356 } HueShift { inputs 1+1 hue_rotation {{frame*2}} maskChannelMask rgba.blue name HueShift1 selected true xpos 862 ypos 513 } Merge2 { inputs 2 also_merge taukeke name Merge2 selected true xpos 862 ypos 655 } Dot { name Dot19 label "The Defocus node uses the\ntaukeke.mask channel as the\nmask input." note_font "Verdana Bold Bold Bold Bold Bold Bold Bold" note_font_size 16 note_font_color 0xffffffff selected true xpos 897 ypos 754 } Defocus { channels rgb defocus 30 ratio 2.65 maskChannelInput taukeke.mask name Defocus1 selected true xpos 862 ypos 851 }