# Node reference

> All 169 node types: inputs, knobs, defaults, .nk classes.

Every node in Oink, grouped like the node menu (Tab or the left toolbar). Each page lists the node's inputs, every knob with its default and range, and the class it reads and writes in .nk files.

169 node types. Nodes from installed OFX plugins are not listed here, see [OFX plugins](/docs/reference/ofx).

## Input/Output

| | Node | .nk class | Summary |
|---|---|---|---|
| [![Read node](/shots/tiles/read.icon.svg)](/docs/nodes/read) | [Read](/docs/nodes/read) | `Read` | Reads images from disk. |
| [![Write node](/shots/tiles/write.icon.svg)](/docs/nodes/write) | [Write](/docs/nodes/write) | `Write` | Renders its input to files on disk (Render > Render All, F5). |
| [![Viewer node](/shots/tiles/viewer.icon.svg)](/docs/nodes/viewer) | [Viewer](/docs/nodes/viewer) | `Viewer` | Shows its input in the Viewer. |

## Color

| | Node | .nk class | Summary |
|---|---|---|---|
| [![Grade node](/shots/tiles/grade.icon.svg)](/docs/nodes/grade) | [Grade](/docs/nodes/grade) | `Grade` | Adjusts the colour range: blackpoint/whitepoint set the input range, lift/gain the output range, then multiply, offset and gamma. |
| [![CDL node](/shots/tiles/cdl.icon.svg)](/docs/nodes/cdl) | [CDL](/docs/nodes/cdl) | `OCIOCDLTransform` | ASC CDL (OCIOCDLTransform): slope, offset, power, saturation, direction. |
| [![Constant node](/shots/tiles/constant.icon.svg)](/docs/nodes/constant) | [Constant](/docs/nodes/constant) | `Constant` | Generate a solid colour image. |
| [![ColorCorrect node](/shots/tiles/colorcorrect.icon.svg)](/docs/nodes/colorcorrect) | [ColorCorrect](/docs/nodes/colorcorrect) | `ColorCorrect` | Saturation, contrast, gamma, gain and offset, separately for shadows, midtones and highlights. |
| [![Saturation node](/shots/tiles/saturation.icon.svg)](/docs/nodes/saturation) | [Saturation](/docs/nodes/saturation) | `Saturation` | Scale colour away from / towards its luminance. |
| [![Clamp node](/shots/tiles/clamp.icon.svg)](/docs/nodes/clamp) | [Clamp](/docs/nodes/clamp) | `Clamp` | Clamp channel values to a range. |
| [![Invert node](/shots/tiles/invert.icon.svg)](/docs/nodes/invert) | [Invert](/docs/nodes/invert) | `Invert` | 1 - value on the selected channels. |
| [![Expression node](/shots/tiles/expression.icon.svg)](/docs/nodes/expression) | [Expression](/docs/nodes/expression) | `Expression` | Per-channel pixel expressions. |
| [![OCIOColorSpace node](/shots/tiles/ociocolorspace.icon.svg)](/docs/nodes/ociocolorspace) | [OCIOColorSpace](/docs/nodes/ociocolorspace) | `OCIOColorSpace` | Convert between two OCIO colour spaces. |
| [![Colorspace node](/shots/tiles/colorspace.icon.svg)](/docs/nodes/colorspace) | [Colorspace](/docs/nodes/colorspace) | `Colorspace` | Classic transfer-curve / HSV / YCbCr conversion. |
| [![Multiply node](/shots/tiles/multiply.icon.svg)](/docs/nodes/multiply) | [Multiply](/docs/nodes/multiply) | `Multiply` | In * value. |
| [![Add node](/shots/tiles/add.icon.svg)](/docs/nodes/add) | [Add](/docs/nodes/add) | `Add` | In + value. |
| [![Gamma node](/shots/tiles/gamma.icon.svg)](/docs/nodes/gamma) | [Gamma](/docs/nodes/gamma) | `Gamma` | In ^ (1 / value). |
| [![ClipTest node](/shots/tiles/cliptest.icon.svg)](/docs/nodes/cliptest) | [ClipTest](/docs/nodes/cliptest) | `ClipTest` | Zebra stripes where values leave lower..upper. |
| [![ColorLookup node](/shots/tiles/colorlookup.icon.svg)](/docs/nodes/colorlookup) | [ColorLookup](/docs/nodes/colorlookup) | `ColorLookup` | Per-channel colour curves. |
| [![OCIODisplay node](/shots/tiles/ociodisplay.icon.svg)](/docs/nodes/ociodisplay) | [OCIODisplay](/docs/nodes/ociodisplay) | `OCIODisplay` | Apply an OCIO display / view transform. |
| [![OCIOFileTransform node](/shots/tiles/ociofiletransform.icon.svg)](/docs/nodes/ociofiletransform) | [OCIOFileTransform](/docs/nodes/ociofiletransform) | `OCIOFileTransform` | Apply a LUT / colour transform file (.cube, .3dl, .spi1d, ...). |
| [![Sampler node](/shots/tiles/sampler.icon.svg)](/docs/nodes/sampler) | [Sampler](/docs/nodes/sampler) | `Sampler` | One scanline of the input as lookup curves (image passes through). |
| [![HueCorrect node](/shots/tiles/huecorrect.icon.svg)](/docs/nodes/huecorrect) | [HueCorrect](/docs/nodes/huecorrect) | `HueCorrect` | Curves over hue (red, yellow, green, cyan, blue, magenta) that change saturation, luminance and red / green / blue gain, and suppress a channel (r_sup / g_sup / b_sup) for the hues you choose, e.g. |

## Keyer

| | Node | .nk class | Summary |
|---|---|---|---|
| [![Keyer node](/shots/tiles/keyer.icon.svg)](/docs/nodes/keyer) | [Keyer](/docs/nodes/keyer) | `Keyer` | A basic keyer. |
| [![IBKColour node](/shots/tiles/ibkcolour.icon.svg)](/docs/nodes/ibkcolour) | [IBKColour](/docs/nodes/ibkcolour) | `IBKColourV3` | Makes a clean plate for IBKGizmo. |
| [![IBKGizmo node](/shots/tiles/ibkgizmo.icon.svg)](/docs/nodes/ibkgizmo) | [IBKGizmo](/docs/nodes/ibkgizmo) | `IBKGizmoV3` | Image based keyer. |
| [![ScreenKey node](/shots/tiles/screenkey.icon.svg)](/docs/nodes/screenkey) | [ScreenKey](/docs/nodes/screenkey) | `ScreenKey` | Green / blue screen keyer with the controls of a Keylight-style keyer: screen colour, gain and balance, clip black / white, shrink / grow, softness, despill with bias, and inside / outside masks. |
| [![Despill node](/shots/tiles/despill.icon.svg)](/docs/nodes/despill) | [Despill](/docs/nodes/despill) | `Despill` | Removes green or blue spill by limiting the screen channel to what the other two allow: their average (balance) or their maximum (limit). |
| [![Cryptomatte node](/shots/tiles/cryptomatte.icon.svg)](/docs/nodes/cryptomatte) | [Cryptomatte](/docs/nodes/cryptomatte) | `Cryptomatte` | Mattes from Cryptomatte ID layers. |

## Filter

| | Node | .nk class | Summary |
|---|---|---|---|
| [![Blur node](/shots/tiles/blur.icon.svg)](/docs/nodes/blur) | [Blur](/docs/nodes/blur) | `Blur` | Blurs the image with a box, triangle, quadratic or gaussian filter; size is the filter's width in pixels (gaussian: its width at half height), separately for width and height. |
| [![Sharpen node](/shots/tiles/sharpen.icon.svg)](/docs/nodes/sharpen) | [Sharpen](/docs/nodes/sharpen) | `Sharpen` | Unsharp mask — the image plus amount times its difference from a blur of it (size, filter, quality as Blur). |
| [![DegrainSimple node](/shots/tiles/degrainsimple.icon.svg)](/docs/nodes/degrainsimple) | [DegrainSimple](/docs/nodes/degrainsimple) | `DegrainSimple` | Per-channel blur against grain. |
| [![DegrainBlue node](/shots/tiles/degrainblue.icon.svg)](/docs/nodes/degrainblue) | [DegrainBlue](/docs/nodes/degrainblue) | `DegrainBlue` | Blur only the blue channel (where most grain is). |
| [![EdgeBlur node](/shots/tiles/edgeblur.icon.svg)](/docs/nodes/edgeblur) | [EdgeBlur](/docs/nodes/edgeblur) | `EdgeBlur` | Blurs the image only along the edges of a matte (control channel, alpha by default); size, filter, quality and crop set the blur as in Blur, edge mult (2 by default) sets how wide and strong the blurred edge is, tint / brightness colour the blur, output writes the amount to a channel. |
| [![Erode node](/shots/tiles/erode.icon.svg)](/docs/nodes/erode) | [Erode](/docs/nodes/erode) | `Erode` | Erode (blur): moves the edges of a black and white matte by size pixels (positive shrinks it; the default is -1, which grows it) through a blur, with a soft one-pixel edge; blur softens the result and quality sets the blur quality. |
| [![Dilate node](/shots/tiles/dilate.icon.svg)](/docs/nodes/dilate) | [Dilate](/docs/nodes/dilate) | `Dilate` | Erode (fast): grows light areas (size > 0) or dark areas (size < 0) by that many pixels with a box minimum / maximum. |
| [![FilterErode node](/shots/tiles/filtererode.icon.svg)](/docs/nodes/filtererode) | [FilterErode](/docs/nodes/filtererode) | `FilterErode` | Erode (filter): grows dark areas (size > 0) or light areas (size < 0) by a filter-weighted maximum; box is the fastest, gaussian the softest. |
| [![Glow2 node](/shots/tiles/glow.icon.svg)](/docs/nodes/glow) | [Glow2](/docs/nodes/glow) | `Glow2` | Makes bright areas glow — the parts above tolerance are blurred (size, filter, quality as Blur), tinted, saturated, scaled by brightness and added to the image. |
| [![Defocus node](/shots/tiles/defocus.icon.svg)](/docs/nodes/defocus) | [Defocus](/docs/nodes/defocus) | `Defocus` | Blurs the image with a lens disc (bokeh): defocus is the disc's radius in pixels, aspect ratio squeezes it. |
| [![VectorBlur2 node](/shots/tiles/vectorblur2.icon.svg)](/docs/nodes/vectorblur2) | [VectorBlur2](/docs/nodes/vectorblur2) | `VectorBlur2` | VectorBlur: motion blur along motion vectors — every pixel is smeared along its u / v vector (uv channels) times motion amount (0.5), over the shutter set by motion offset (-0.5 centres it). |
| [![ZDefocus node](/shots/tiles/zdefocus.icon.svg)](/docs/nodes/zdefocus) | [ZDefocus](/docs/nodes/zdefocus) | `ZDefocus2` | Depth of field from a depth channel — the image is cut into depth layers, each blurred by its distance from the focus plane and laid back over the others from the back to the front. |
| [![MotionBlur node](/shots/tiles/motionblur.icon.svg)](/docs/nodes/motionblur) | [MotionBlur](/docs/nodes/motionblur) | `MotionBlur` | Realistic motion blur worked out from the motion in the clip itself (Kronos' motion estimation): Shutter Samples in-between images over Shutter Time frames, averaged. |
| [![MotionBlur2D node](/shots/tiles/motionblur2d.icon.svg)](/docs/nodes/motionblur2d) | [MotionBlur2D](/docs/nodes/motionblur2d) | `MotionBlur2D` | Motion vectors from a 2D transform. |
| [![MotionBlur3D node](/shots/tiles/motionblur3d.icon.svg)](/docs/nodes/motionblur3d) | [MotionBlur3D](/docs/nodes/motionblur3d) | `MotionBlur3D` | Blur from camera motion and depth. |
| [![VectorBlur node](/shots/tiles/vectorblur.icon.svg)](/docs/nodes/vectorblur) | [VectorBlur](/docs/nodes/vectorblur) |  | Motion blur along a vector layer (motion from AIVectorGenerator, ScanlineRender, Cycles or EEVEE). |

## Time

| | Node | .nk class | Summary |
|---|---|---|---|
| [![FrameBlend node](/shots/tiles/frameblend.icon.svg)](/docs/nodes/frameblend) | [FrameBlend](/docs/nodes/frameblend) | `FrameBlend` | Average several frames. |
| [![FrameHold node](/shots/tiles/framehold.icon.svg)](/docs/nodes/framehold) | [FrameHold](/docs/nodes/framehold) | `FrameHold` | Shows one frame of the input at every frame (increment 0), or every Nth frame from the first frame. |
| [![FrameRange node](/shots/tiles/framerange.icon.svg)](/docs/nodes/framerange) | [FrameRange](/docs/nodes/framerange) | `FrameRange` | Sets the clip's frame range with first_frame and last_frame (what the timeline shows with the range source on Input, and what Retime / Kronos take as their input range). |
| [![Kronos node](/shots/tiles/retime.icon.svg)](/docs/nodes/retime) | [Kronos](/docs/nodes/retime) | `Kronos` | Retimes a clip with motion vectors. |
| [![NoTimeBlur node](/shots/tiles/notimeblur.icon.svg)](/docs/nodes/notimeblur) | [NoTimeBlur](/docs/nodes/notimeblur) | `NoTimeBlur` | Passthrough: Oink evaluates whole frames only, so upstream never sees a fractional time to round (the rounding knob is kept for .nk). |
| [![Retime node](/shots/tiles/nkretime.icon.svg)](/docs/nodes/nkretime) | [Retime](/docs/nodes/nkretime) | `Retime` | Maps the input range onto an output range at a speed (both output ends locked: the speed that fits), with reverse, before / after (continue, loop, bounce, hold, black), a box filter whose width is speed x shutter, and a warp curve on the TimeWarp tab. |
| [![TimeBlur node](/shots/tiles/timeblur.icon.svg)](/docs/nodes/timeblur) | [TimeBlur](/docs/nodes/timeblur) | `TimeBlur` | Average the input over the shutter. |
| [![TimeOffset node](/shots/tiles/timeoffset.icon.svg)](/docs/nodes/timeoffset) | [TimeOffset](/docs/nodes/timeoffset) | `TimeOffset` | Moves a clip in time by time offset frames (positive = later; Mode sets whole or fractional frames); reverse input plays the input's frame range backwards. |
| [![TimeWarp node](/shots/tiles/timewarp.icon.svg)](/docs/nodes/timewarp) | [TimeWarp](/docs/nodes/timewarp) | `TimeWarp` | Shows input frame `input frame` (usually an animated curve) at the current frame. |

## Deep

| | Node | .nk class | Summary |
|---|---|---|---|
| [![DeepRead node](/shots/tiles/deepread.icon.svg)](/docs/nodes/deepread) | [DeepRead](/docs/nodes/deepread) | `DeepRead` | Reads a deep EXR (per-pixel sample lists); a flat file is read as one sample per pixel. |
| [![DeepToImage node](/shots/tiles/deeptoimage.icon.svg)](/docs/nodes/deeptoimage) | [DeepToImage](/docs/nodes/deeptoimage) | `DeepToImage2` | Flatten deep samples into a 2D image. |
| [![DeepMerge node](/shots/tiles/deepmerge.icon.svg)](/docs/nodes/deepmerge) | [DeepMerge](/docs/nodes/deepmerge) | `DeepMerge2` | Combine two deep streams (or hold one out by the other). |
| [![DeepHoldout node](/shots/tiles/deepholdout.icon.svg)](/docs/nodes/deepholdout) | [DeepHoldout](/docs/nodes/deepholdout) | `DeepHoldout2` | Main held out by the holdout's deep samples, flattened. |
| [![DeepTransform node](/shots/tiles/deeptransform.icon.svg)](/docs/nodes/deeptransform) | [DeepTransform](/docs/nodes/deeptransform) | `DeepTransform` | Move deep samples in x / y (whole pixels) and z (offset, scale). |
| [![DeepCrop node](/shots/tiles/deepcrop.icon.svg)](/docs/nodes/deepcrop) | [DeepCrop](/docs/nodes/deepcrop) | `DeepCrop` | Keep samples inside a bbox and a depth range. |
| [![DeepRecolor node](/shots/tiles/deeprecolor.icon.svg)](/docs/nodes/deeprecolor) | [DeepRecolor](/docs/nodes/deeprecolor) | `DeepRecolor` | Give deep samples the colour of a flat image: each sample's rgb = colour.rgb * sample alpha / the deep image's flattened alpha, so the recoloured deep flattens back to the colour image (times the deep coverage). |
| [![DeepFromImage node](/shots/tiles/deepfromimage.icon.svg)](/docs/nodes/deepfromimage) | [DeepFromImage](/docs/nodes/deepfromimage) | `DeepFromImage` | A flat image as one deep sample per pixel (OIIO deepen). |
| [![DeepReformat node](/shots/tiles/deepreformat.icon.svg)](/docs/nodes/deepreformat) | [DeepReformat](/docs/nodes/deepreformat) | `DeepReformat` | DeepReformat (first cut) — change the format by cropping / padding, no resampling. |

## Merge

| | Node | .nk class | Summary |
|---|---|---|---|
| [![AddMix node](/shots/tiles/addmix.icon.svg)](/docs/nodes/addmix) | [AddMix](/docs/nodes/addmix) | `AddMix` | A * lutA(a) + B * lutB(a). |
| [![Dissolve node](/shots/tiles/dissolve.icon.svg)](/docs/nodes/dissolve) | [Dissolve](/docs/nodes/dissolve) | `Dissolve` | Mix between inputs by `which`. |
| [![KeyMix node](/shots/tiles/keymix.icon.svg)](/docs/nodes/keymix) | [KeyMix](/docs/nodes/keymix) | `KeyMix` | Copy A onto B through a mask. |
| [![Merge node](/shots/tiles/merge.icon.svg)](/docs/nodes/merge) | [Merge](/docs/nodes/merge) | `Merge2` | Layers the A input with the B input using the chosen operation (30 operations, over by default). |
| [![MergeExpression node](/shots/tiles/mergeexpression.icon.svg)](/docs/nodes/mergeexpression) | [MergeExpression](/docs/nodes/mergeexpression) | `MergeExpression` | Per-channel expressions of A and B. |
| [![Premult node](/shots/tiles/premult.icon.svg)](/docs/nodes/premult) | [Premult](/docs/nodes/premult) | `Premult` | Multiply colour by alpha. |
| [![Switch node](/shots/tiles/switch.icon.svg)](/docs/nodes/switch) | [Switch](/docs/nodes/switch) | `Switch` | Pass one of its inputs through (which). |
| [![Unpremult node](/shots/tiles/unpremult.icon.svg)](/docs/nodes/unpremult) | [Unpremult](/docs/nodes/unpremult) | `Unpremult` | Divide colour by alpha. |
| [![Difference node](/shots/tiles/difference.icon.svg)](/docs/nodes/difference) | [Difference](/docs/nodes/difference) | `Difference` | Matte of where A and B differ. |

## Channel

| | Node | .nk class | Summary |
|---|---|---|---|
| [![Shuffle node](/shots/tiles/shuffle.icon.svg)](/docs/nodes/shuffle) | [Shuffle](/docs/nodes/shuffle) | `Shuffle2` | Rearranges channels: drag wires from the input layers (in1 / in2, each read from the B or the A input) to the output layers (out1 / out2). |
| [![Copy node](/shots/tiles/copy.icon.svg)](/docs/nodes/copy) | [Copy](/docs/nodes/copy) | `Copy` | Copy channels from A into the B stream. |
| [![ChannelMerge node](/shots/tiles/channelmerge.icon.svg)](/docs/nodes/channelmerge) | [ChannelMerge](/docs/nodes/channelmerge) | `ChannelMerge` | Combine one channel of A and B. |
| [![Remove node](/shots/tiles/remove.icon.svg)](/docs/nodes/remove) | [Remove](/docs/nodes/remove) | `Remove` | Remove or keep channels / layers. |

## Transform

| | Node | .nk class | Summary |
|---|---|---|---|
| [![Transform node](/shots/tiles/transform.icon.svg)](/docs/nodes/transform) | [Transform](/docs/nodes/transform) | `Transform` | Translates, rotates, scales and skews the image around the center point. |
| [![Crop node](/shots/tiles/crop.icon.svg)](/docs/nodes/crop) | [Crop](/docs/nodes/crop) | `Crop` | Cuts the image to a box; outside is black, or the format is reset to the box. |
| [![Reformat node](/shots/tiles/reformat.icon.svg)](/docs/nodes/reformat) | [Reformat](/docs/nodes/reformat) | `Reformat` | Resizes the image to another format, box or scale, with a choice of filter. |
| [![Position node](/shots/tiles/position.icon.svg)](/docs/nodes/position) | [Position](/docs/nodes/position) | `Position` | Whole-pixel move of the bbox, no filtering. |
| [![Tracker node](/shots/tiles/tracker.icon.svg)](/docs/nodes/tracker) | [Tracker](/docs/nodes/tracker) | `Tracker4` | Ctrl+Alt+click in the Viewer adds a track; drag its box to place it (sets a keyframe). |
| [![CornerPin2D node](/shots/tiles/cornerpin.icon.svg)](/docs/nodes/cornerpin) | [CornerPin2D](/docs/nodes/cornerpin) | `CornerPin2D` | Warps the image so the from1-4 corners land on to1-4. |
| [![CameraTracker node](/shots/tiles/cameratracker.icon.svg)](/docs/nodes/cameratracker) | [CameraTracker](/docs/nodes/cameratracker) | `CameraTracker` | Track Features, then Solve Camera. |
| [![PlanarTracker node](/shots/tiles/planartracker.icon.svg)](/docs/nodes/planartracker) | [PlanarTracker](/docs/nodes/planartracker) |  | Set corner1-4 around a flat surface at the reference frame, Track, then Export a CornerPin2D (relative = from the reference frame, absolute = from the full format). |
| [![CameraMatch node](/shots/tiles/cameramatch.icon.svg)](/docs/nodes/cameramatch) | [CameraMatch](/docs/nodes/cameramatch) |  | CameraMatch (fSpy-style): drag two lines per vanishing point over edges that are parallel in the scene (red X, green Y, blue Z), put the origin on the ground, optionally a reference distance. |
| [![LensDistortion node](/shots/tiles/lensdistortion.icon.svg)](/docs/nodes/lensdistortion) | [LensDistortion](/docs/nodes/lensdistortion) | `LensDistortion2` | Undistort / redistort with radial k1, k2 (same model as the CameraTracker solve). |
| [![STMap node](/shots/tiles/stmap.icon.svg)](/docs/nodes/stmap) | [STMap](/docs/nodes/stmap) | `STMap` | Each pixel reads src at (red, green) x the src format. |
| [![IDistort node](/shots/tiles/idistort.icon.svg)](/docs/nodes/idistort) | [IDistort](/docs/nodes/idistort) | `IDistort` | Displace pixels by a UV layer. |
| [![Card3D node](/shots/tiles/card3d.icon.svg)](/docs/nodes/card3d) | [Card3D](/docs/nodes/card3d) | `Card3D` | Image on a 3D card through a camera. |
| [![Upscale node](/shots/tiles/upscale.icon.svg)](/docs/nodes/upscale) | [Upscale](/docs/nodes/upscale) | `Upscale` | 2x (Lanczos; ML when `ml` is on). |
| [![LD_3DE_Classic_LD_Model node](/shots/tiles/ld3de_classic.icon.svg)](/docs/nodes/ld3de_classic) | [LD_3DE_Classic_LD_Model](/docs/nodes/ld3de_classic) | `LD_3DE_Classic_LD_Model` | 3DEqualizer lens distortion (classic). |
| [![LD_3DE4_Radial_Standard_Degree_4 node](/shots/tiles/ld3de_radial4.icon.svg)](/docs/nodes/ld3de_radial4) | [LD_3DE4_Radial_Standard_Degree_4](/docs/nodes/ld3de_radial4) | `LD_3DE4_Radial_Standard_Degree_4` | 3DEqualizer lens distortion (radial4). |
| [![LD_3DE4_Anamorphic_Standard_Degree_4 node](/shots/tiles/ld3de_anamorphic4.icon.svg)](/docs/nodes/ld3de_anamorphic4) | [LD_3DE4_Anamorphic_Standard_Degree_4](/docs/nodes/ld3de_anamorphic4) | `LD_3DE4_Anamorphic_Standard_Degree_4` | 3DEqualizer lens distortion (anamorphic4). |
| [![LD_3DE4_Anamorphic_Degree_6 node](/shots/tiles/ld3de_anamorphic6.icon.svg)](/docs/nodes/ld3de_anamorphic6) | [LD_3DE4_Anamorphic_Degree_6](/docs/nodes/ld3de_anamorphic6) | `LD_3DE4_Anamorphic_Degree_6` | 3DEqualizer lens distortion (anamorphic6). |
| [![LD_3DE4_Radial_Fisheye_Degree_8 node](/shots/tiles/ld3de_fisheye8.icon.svg)](/docs/nodes/ld3de_fisheye8) | [LD_3DE4_Radial_Fisheye_Degree_8](/docs/nodes/ld3de_fisheye8) | `LD_3DE4_Radial_Fisheye_Degree_8` | 3DEqualizer lens distortion (fisheye8). |
| [![VectorDistort node](/shots/tiles/vectordistort.icon.svg)](/docs/nodes/vectordistort) | [VectorDistort](/docs/nodes/vectordistort) |  | Paint or patch the reference frame (Source), connect AIVectorGenerator to SmartVector, and the paint follows the motion through the shot. |

## Draw

| | Node | .nk class | Summary |
|---|---|---|---|
| [![Roto node](/shots/tiles/roto.icon.svg)](/docs/nodes/roto) | [Roto](/docs/nodes/roto) | `Roto` | In the Viewer pick Bezier or B-spline (V), click points (drag = smooth tangent), click the first point or Enter to close. |
| [![RotoPaint node](/shots/tiles/rotopaint.icon.svg)](/docs/nodes/rotopaint) | [RotoPaint](/docs/nodes/rotopaint) | `RotoPaint` | Nuke RotoPaint (P): the Roto shapes, output rgba by default. |
| [![Text2 node](/shots/tiles/text2.icon.svg)](/docs/nodes/text2) | [Text2](/docs/nodes/text2) | `Text2` | Draw text over the input. |
| [![Slate node](/shots/tiles/slate.icon.svg)](/docs/nodes/slate) | [Slate](/docs/nodes/slate) |  | A VFX review slate on the slate frame, burn-ins on the other frames. |
| [![ColorBars node](/shots/tiles/colorbars.icon.svg)](/docs/nodes/colorbars) | [ColorBars](/docs/nodes/colorbars) | `ColorBars` | Colour test bars. |
| [![CheckerBoard2 node](/shots/tiles/checkerboard.icon.svg)](/docs/nodes/checkerboard) | [CheckerBoard2](/docs/nodes/checkerboard) | `CheckerBoard2` | Checker test pattern. |
| [![Noise node](/shots/tiles/noise.icon.svg)](/docs/nodes/noise) | [Noise](/docs/nodes/noise) | `Noise` | Fractal Perlin noise. |
| [![Grain node](/shots/tiles/grain.icon.svg)](/docs/nodes/grain) | [Grain](/docs/nodes/grain) | `Grain2` | Synthetic film grain. |

## AI

| | Node | .nk class | Summary |
|---|---|---|---|
| [![AIRoto node](/shots/tiles/airoto.icon.svg)](/docs/nodes/airoto) | [AIRoto](/docs/nodes/airoto) |  | Click on the plate in the Viewer to add an object (Shift/Alt+click removes, drag draws a box); the mask shows at once. |
| [![AIDepth node](/shots/tiles/aidepth.icon.svg)](/docs/nodes/aidepth) | [AIDepth](/docs/nodes/aidepth) |  | Analyze runs Video Depth Anything Small (Apache-2.0, temporally stable) over the frames and aligns it to MoGe-2 (MIT) metric depth on a few keyframes. |
| [![AINormals node](/shots/tiles/ainormals.icon.svg)](/docs/nodes/ainormals) | [AINormals](/docs/nodes/ainormals) |  | Analyze runs MoGe-2 (MIT) per frame: N layer = normals in camera space (X right, Y up, +Z to camera), or world space when a camera is connected to cam. |
| [![AIMaterials node](/shots/tiles/aimaterials.icon.svg)](/docs/nodes/aimaterials) | [AIMaterials](/docs/nodes/aimaterials) |  | Analyze runs Cosmos DiffusionRenderer 7B (NVIDIA Open Model License, optional: accept the licence first, ~29 GB download) over the frames in overlapping 57-frame windows and outputs layers albedo (linear base colour), N (camera-space normals like AINormals), roughness, metallic and depth (relative). |
| [![AIUpscale node](/shots/tiles/aiupscale.icon.svg)](/docs/nodes/aiupscale) | [AIUpscale](/docs/nodes/aiupscale) |  | AI super-resolution with float-correct encoding. |
| [![AIDenoise node](/shots/tiles/aidenoise.icon.svg)](/docs/nodes/aidenoise) | [AIDenoise](/docs/nodes/aidenoise) |  | Denoise CG renders with OIDN (albedo + normal aware). |
| [![AIMatteRefine node](/shots/tiles/aimatterefine.icon.svg)](/docs/nodes/aimatterefine) | [AIMatteRefine](/docs/nodes/aimatterefine) |  | Turns a rough matte (matte input, e.g. |
| [![AIKeyer node](/shots/tiles/aikeyer.icon.svg)](/docs/nodes/aikeyer) | [AIKeyer](/docs/nodes/aikeyer) |  | Green/blue screen colour-difference keyer (screen colour auto or picked, balance, clip black/white) with float-correct despill (none, limit, or IBK-style subtract). |
| [![AIVectorGenerator node](/shots/tiles/aivectorgenerator.icon.svg)](/docs/nodes/aivectorgenerator) | [AIVectorGenerator](/docs/nodes/aivectorgenerator) |  | Generate runs optical flow (SEA-RAFT, BSD-3) in the AI worker and caches vectors per frame. |
| [![GenFill node](/shots/tiles/genfill.icon.svg)](/docs/nodes/genfill) | [GenFill](/docs/nodes/genfill) |  | Generative fill: replace the masked region from a text prompt. |
| [![GenVideo node](/shots/tiles/genvideo.icon.svg)](/docs/nodes/genvideo) | [GenVideo](/docs/nodes/genvideo) |  | Generative video: text / image / first+last / extension / video-to-video. |
| [![AICleanPlate node](/shots/tiles/aicleanplate.icon.svg)](/docs/nodes/aicleanplate) | [AICleanPlate](/docs/nodes/aicleanplate) |  | Removes the masked object (Mask = AIRoto / Roto / any alpha). |
| [![FrameFixer node](/shots/tiles/framefixer.icon.svg)](/docs/nodes/framefixer) | [FrameFixer](/docs/nodes/framefixer) |  | Rebuilds dropped or damaged frames from their neighbours. |
| [![PlateDenoise node](/shots/tiles/platedenoise.icon.svg)](/docs/nodes/platedenoise) | [PlateDenoise](/docs/nodes/platedenoise) |  | Denoises camera plates (AIDenoise is for CG renders). |
| [![Train node](/shots/tiles/aitrain.icon.svg)](/docs/nodes/aitrain) | [Train](/docs/nodes/aitrain) |  | Connect before (Source) and after (Target) frames, list the frames, press Train. |
| [![Inference node](/shots/tiles/aiinference.icon.svg)](/docs/nodes/aiinference) | [Inference](/docs/nodes/aiinference) |  | Applies a .ocat model from a Train node to every frame (tiled, cached). |
| [![ComfyUI node](/shots/tiles/comfyui.icon.svg)](/docs/nodes/comfyui) | [ComfyUI](/docs/nodes/comfyui) |  | Run a ComfyUI workflow on this node's input (float EXR round trip). |
| [![SplatTrain node](/shots/tiles/splattrain.icon.svg)](/docs/nodes/splattrain) | [SplatTrain](/docs/nodes/splattrain) |  | Gaussian splats trained from your plate (gsplat, Apache-2.0, in the AI worker). |

## 3D

| | Node | .nk class | Summary |
|---|---|---|---|
| [![Camera node](/shots/tiles/camera.icon.svg)](/docs/nodes/camera) | [Camera](/docs/nodes/camera) | `Camera` | Pinhole, mm apertures, screen window. |
| [![Axis node](/shots/tiles/axis.icon.svg)](/docs/nodes/axis) | [Axis](/docs/nodes/axis) | `Axis` | Null transform. |
| [![GeoCard node](/shots/tiles/geocard.icon.svg)](/docs/nodes/geocard) | [GeoCard](/docs/nodes/geocard) | `GeoCard` |  |
| [![GeoCube node](/shots/tiles/geocube.icon.svg)](/docs/nodes/geocube) | [GeoCube](/docs/nodes/geocube) | `GeoCube` |  |
| [![GeoSphere node](/shots/tiles/geosphere.icon.svg)](/docs/nodes/geosphere) | [GeoSphere](/docs/nodes/geosphere) | `GeoSphere` |  |
| [![GeoCylinder node](/shots/tiles/geocylinder.icon.svg)](/docs/nodes/geocylinder) | [GeoCylinder](/docs/nodes/geocylinder) | `GeoCylinder` |  |
| [![GeoScene node](/shots/tiles/geoscene.icon.svg)](/docs/nodes/geoscene) | [GeoScene](/docs/nodes/geoscene) | `GeoScene` | Gathers objects, cameras and lights for rendering. |
| [![GeoMerge node](/shots/tiles/geomerge.icon.svg)](/docs/nodes/geomerge) | [GeoMerge](/docs/nodes/geomerge) | `GeoMerge` |  |
| [![GeoTransform node](/shots/tiles/geotransform.icon.svg)](/docs/nodes/geotransform) | [GeoTransform](/docs/nodes/geotransform) | `GeoTransform` |  |
| [![GeoBindMaterial node](/shots/tiles/geobindmaterial.icon.svg)](/docs/nodes/geobindmaterial) | [GeoBindMaterial](/docs/nodes/geobindmaterial) | `GeoBindMaterial` | The `mat` input's material (Project3DShader, an image as a texture) on the prims whose paths match `mask` (space-separated globs; a path also takes everything under it; empty = all meshes). |
| [![UVProject node](/shots/tiles/uvproject.icon.svg)](/docs/nodes/uvproject) | [UVProject](/docs/nodes/uvproject) | `UVProject` |  |
| [![GeoImport node](/shots/tiles/geoimport.icon.svg)](/docs/nodes/geoimport) | [GeoImport](/docs/nodes/geoimport) | `GeoImport` | Imports a 3D scene file (USD, Alembic, OBJ, FBX, glTF, PLY, STL, or a Blender .blend) into the 3D system; the file's animation follows the frame through time offset and time scale. |
| [![GeoExport node](/shots/tiles/geoexport.icon.svg)](/docs/nodes/geoexport) | [GeoExport](/docs/nodes/geoexport) | `GeoExport` |  |
| [![ReadVFX node](/shots/tiles/readvfx.icon.svg)](/docs/nodes/readvfx) | [ReadVFX](/docs/nodes/readvfx) |  |  |
| [![ReadSplat node](/shots/tiles/readsplat.icon.svg)](/docs/nodes/readsplat) | [ReadSplat](/docs/nodes/readsplat) |  |  |
| [![DirectLight node](/shots/tiles/directlight.icon.svg)](/docs/nodes/directlight) | [DirectLight](/docs/nodes/directlight) | `DirectLight` | Parallel light along the light's -Z. |
| [![PointLight node](/shots/tiles/pointlight.icon.svg)](/docs/nodes/pointlight) | [PointLight](/docs/nodes/pointlight) | `PointLight` |  |
| [![Relight node](/shots/tiles/relight.icon.svg)](/docs/nodes/relight) | [Relight](/docs/nodes/relight) |  | Adds light to the plate from its N (normals) and depth layers, all on the GPU. |
| [![DepthToPoints node](/shots/tiles/depthtopoints.icon.svg)](/docs/nodes/depthtopoints) | [DepthToPoints](/docs/nodes/depthtopoints) |  | Turns the depth layer into 3D through the camera (cam input or focal knobs): a displaced, textured card mesh (ScanlineRender can re-render it from new views) or a coloured point cloud. |
| [![SpotLight node](/shots/tiles/spotlight.icon.svg)](/docs/nodes/spotlight) | [SpotLight](/docs/nodes/spotlight) | `SpotLight` |  |
| [![EnvironmentLight node](/shots/tiles/environmentlight.icon.svg)](/docs/nodes/environmentlight) | [EnvironmentLight](/docs/nodes/environmentlight) | `EnvironmentLight` | Ambient light; with a `map` (lat-long image) the surface normal looks it up. |
| [![Project3DShader node](/shots/tiles/project3dshader.icon.svg)](/docs/nodes/project3dshader) | [Project3DShader](/docs/nodes/project3dshader) | `Project3DShader` |  |
| [![ScanlineRender node](/shots/tiles/scanlinerender.icon.svg)](/docs/nodes/scanlinerender) | [ScanlineRender](/docs/nodes/scanlinerender) | `ScanlineRender` |  |
| [![CyclesRender node](/shots/tiles/cyclesrender.icon.svg)](/docs/nodes/cyclesrender) | [CyclesRender](/docs/nodes/cyclesrender) |  | Path-traced render of the same scene with Blender Cycles (headless). |
| [![EEVEERender node](/shots/tiles/eeveerender.icon.svg)](/docs/nodes/eeveerender) | [EEVEERender](/docs/nodes/eeveerender) |  | The same scene rendered with Blender EEVEE (5.2 engine id 'BLENDER_EEVEE'; the 'BLENDER_EEVEE_NEXT' id of 4.2-4.4 is gone). |
| [![HydraRender node](/shots/tiles/hydrarender.icon.svg)](/docs/nodes/hydrarender) | [HydraRender](/docs/nodes/hydrarender) |  | Renders the 3D scene through a USD Hydra render delegate. |

## Other

| | Node | .nk class | Summary |
|---|---|---|---|
| [![Dot node](/shots/tiles/dot.icon.svg)](/docs/nodes/dot) | [Dot](/docs/nodes/dot) | `Dot` | Passes the input through unchanged. |
| [![NoOp node](/shots/tiles/noop.icon.svg)](/docs/nodes/noop) | [NoOp](/docs/nodes/noop) | `NoOp` | Does nothing; holds user knobs / expressions. |
| [![CurveTool node](/shots/tiles/curvetool.icon.svg)](/docs/nodes/curvetool) | [CurveTool](/docs/nodes/curvetool) | `CurveTool` | Analyse frames into keyed knobs. |
| [![Assert node](/shots/tiles/assert.icon.svg)](/docs/nodes/assert) | [Assert](/docs/nodes/assert) | `Assert` | Fail with a message when the expression is false. |
| [![BlackOutside node](/shots/tiles/blackoutside.icon.svg)](/docs/nodes/blackoutside) | [BlackOutside](/docs/nodes/blackoutside) | `BlackOutside` | Black outside the bbox instead of repeating its edge. |
| [![ModifyMetaData node](/shots/tiles/modifymetadata.icon.svg)](/docs/nodes/modifymetadata) | [ModifyMetaData](/docs/nodes/modifymetadata) | `ModifyMetaData` | Pass-through (metadata edits kept for .nk). |
| [![CopyMetaData node](/shots/tiles/copymetadata.icon.svg)](/docs/nodes/copymetadata) | [CopyMetaData](/docs/nodes/copymetadata) | `CopyMetaData` | Pass-through of Image (Meta input kept for .nk). |
| [![ViewMetaData node](/shots/tiles/viewmetadata.icon.svg)](/docs/nodes/viewmetadata) | [ViewMetaData](/docs/nodes/viewmetadata) | `ViewMetaData` | Pass-through. |
| [![AddTimeCode node](/shots/tiles/addtimecode.icon.svg)](/docs/nodes/addtimecode) | [AddTimeCode](/docs/nodes/addtimecode) | `AddTimeCode` | Pass-through that keeps the timecode knobs. |
|  | [Backdrop](/docs/nodes/backdrop) | `BackdropNode` | A coloured box behind nodes. |
| [![StickyNote node](/shots/tiles/stickynote.icon.svg)](/docs/nodes/stickynote) | [StickyNote](/docs/nodes/stickynote) | `StickyNote` | StickyNote: a yellow note showing its label (HTML allowed) in the Node Graph. |
| [![BlinkScript node](/shots/tiles/blinkscript.icon.svg)](/docs/nodes/blinkscript) | [BlinkScript](/docs/nodes/blinkscript) | `BlinkScript` | Runs a Blink kernel on the GPU. |
|  | [Group](/docs/nodes/group) |  | A node holding a sub-graph (Input/Output nodes, nested groups). |
| [![Precomp node](/shots/tiles/precomp.icon.svg)](/docs/nodes/precomp) | [Precomp](/docs/nodes/precomp) | `Precomp` | A Group whose contents are an external .nk script. |
| [![LiveGroup node](/shots/tiles/livegroup.icon.svg)](/docs/nodes/livegroup) | [LiveGroup](/docs/nodes/livegroup) | `LiveGroup` | A Group that can be published to (and read from) its own .nk script. |
|  | [Input](/docs/nodes/input) |  | Inside a Group: the image arriving at group input `number`. |
|  | [Output](/docs/nodes/output) |  | Inside a Group: what the group outputs. |

## Not in the node menu

| | Node | .nk class | Summary |
|---|---|---|---|
| [![CameraTrackerPointCloud node](/shots/tiles/camtrackpointcloud.icon.svg)](/docs/nodes/camtrackpointcloud) | [CameraTrackerPointCloud](/docs/nodes/camtrackpointcloud) | `CameraTrackerPointCloud` | Solved 3D points as geometry. |
| [![Dot node](/shots/tiles/reroute.icon.svg)](/docs/nodes/reroute) | [Dot](/docs/nodes/reroute) |  | A bend point to tidy pipes. |
| [![Merge node](/shots/tiles/over.icon.svg)](/docs/nodes/over) | [Merge](/docs/nodes/over) | `Merge2` | Composites A over B using the A alpha. |
| [![Text node](/shots/tiles/text.icon.svg)](/docs/nodes/text) | [Text](/docs/nodes/text) | `Text` | Text (legacy) — draw text over the input; `size` knob, baseline justify. |
| [![Unsupported node](/shots/tiles/unsupported.icon.svg)](/docs/nodes/unsupported) | [Unsupported](/docs/nodes/unsupported) |  | Unsupported Nuke node — raw knobs kept for export; input 0 passes through. |


---
Sources: opencomp_core/nodes, opencomp_server/headless.py
