CompStart

ProLessonsCoursesElementsSoftware

CompStart

Master visual effects with cutting-edge techniques.

Learning

CoursesLessonsPro FeaturesAssetsSoftware

Tools

Tech CheckDisplay CheckMotion BlurCIE 1931PhysLightNuke Tools

Company

InstructorMissionImpressumPrivacyTerms

Projects

Moray RenderEXR ConverterOCIO.ccNuke ToolsDerekVFX

Follow

YouTubeInstagramTikTokThreadsContact

© 2026 CompStart. All rights reserved.

Scanline Render Advanced

ToolSets / 3D
3D

2026-09-07

ToolSets/3d/scanlineRenderAdvanced.nk

3d
scanline
render
deep
holdout
overscan
aov
utility
View on GitHub

ScanlineRender wrapper with separate GUI and render samples/scales, dynamic overscan, deep holdout soft expand, and AOV vector outputs.

Scanline Render Advanced wraps Nuke’s ScanlineRender with linked controls for format, frame range, overscan, sample filter, antialiasing, Z-blend mode, and shutter. It exposes separate GUI and render sample counts plus scale factors so the viewer can stay light while final renders use higher sampling.

Overscan is driven by a dynamic value and multiplies by the active GUI or render scale. A deep holdout input is reformatted to match, with optional soft expand on deep front/back before DeepHoldout. The beauty path reformats back to the chosen format with a selectable uprez filter.

Use it when you need ScanlineRender in a 3D/deep pipeline with holdouts, motion or shader vectors, and clearer separation between interactive and batch quality. AOVs include output vectors, surface point (P), and surface normal (N).

Script code

set cut_paste_input [stack 0]
version 12.1 v4
push $cut_paste_input
Group {
 name scanlineRenderAdvanced
 onCreate "import nuke\n\n#zz = nuke.FrameRange('100-200')\n#print zz.frames()\n\nff = nuke.Root().firstFrame()\nlf = nuke.Root().lastFrame()\n\nnuke.thisNode().knob('fr').setValue('\{\}-\{\}'.format(ff, lf))\n\n\n\n"
 tile_color 0x421010ff
 label "\[value gui_samples] : \[value render_samples] - \[value overscan_dynamic]"
 addUserKnob {20 User l ScanlineRender}
 addUserKnob {41 format T Constant1.format}
 addUserKnob {1 fr l "frame range" -STARTLINE}
 fr 1-100
 addUserKnob {41 overscan_dynamic l overscan T ScanlineRender1.overscan_dynamic}
 addUserKnob {41 filter l "sample filter" T ScanlineRender1.filter}
 addUserKnob {41 antialiasing -STARTLINE T ScanlineRender1.antialiasing}
 addUserKnob {41 zblend_mode l "Z-blend mode" -STARTLINE T ScanlineRender1.zblend_mode}
 addUserKnob {41 shutter T ScanlineRender1.shutter}
 addUserKnob {41 gui_samples l "gui samples" T ScanlineRender1.gui_samples}
 addUserKnob {7 gui_scale l "gui scale" -STARTLINE R 0.1 1}
 gui_scale 1
 addUserKnob {41 render_samples l "render samples" T ScanlineRender1.render_samples}
 addUserKnob {7 render_scale l "render scale" -STARTLINE R 1 10}
 render_scale 1
 addUserKnob {41 filter_1 l "uprez filter" T Reformat2.filter}
 addUserKnob {41 expand l "deep soft expand" T DeepExpression1.expand}
 addUserKnob {26 ""}
 addUserKnob {26 lbl l "" t "July 12, 2019- added overscan\nJuly 19, 2019 - added soft deep and dynamic scale 1.2\nJuly 24, 2019 - added deep proxy scale 1.3" +STARTLINE T "ScanlineRender Advanced v1.3"}
 addUserKnob {22 btn l DerekVFX.ca T "nuke.tcl('start', 'https://derekvfx.ca')" +STARTLINE}
 addUserKnob {20 aov l AOV}
 addUserKnob {41 output_shader_vectors l "output vectors" T ScanlineRender1.output_shader_vectors}
 addUserKnob {41 P_channel l "surface point" T ScanlineRender1.P_channel}
 addUserKnob {41 N_channel l "surface normal" T ScanlineRender1.N_channel}
}
 Constant {
  inputs 0
  name Constant1
  xpos 684
  ypos 245
 }
set Ndd11400 [stack 0]
 Dot {
  name Dot5
  note_font_size 40
  xpos 888
  ypos 272
 }
 Dot {
  name Dot4
  note_font_size 40
  xpos 888
  ypos 741
 }
 Input {
  inputs 0
  name deepHoldout
  xpos 84
  ypos 245
  number 2
 }
 DeepReformat {
  format {{{parent.Constant1.format}}}
  resize none
  pbb true
  name DeepReformat1
  xpos 84
  ypos 271
 }
set Ndd10400 [stack 0]
 DeepReformat {
  type scale
  scale {{parent.guiScale.scale}}
  pbb true
  name deepReformatGUI
  xpos -41
  ypos 346
 }
push $Ndd10400
 DeepReformat {
  type scale
  scale {{parent.renderScale.scale}}
  pbb true
  name deepReformatRender
  xpos 84
  ypos 346
 }
 Switch {
  inputs 2
  which {{"\$gui"}}
  name Switch1
  label "\[value which]"
  xpos 84
  ypos 412
 }
 set Cdd37800 [stack 0]
 Dot {
  name Dot3
  note_font_size 40
  xpos 118
  ypos 611
 }
 Input {
  inputs 0
  name cam
  xpos 284
  ypos 245
  number 1
 }
 Dot {
  name Dot2
  note_font_size 40
  xpos 318
  ypos 502
 }
 Input {
  inputs 0
  name scene
  xpos 484
  ypos 245
 }
push $Ndd11400
 Reformat {
  type scale
  scale {{gui_scale}}
  name guiScale
  xpos 559
  ypos 346
 }
push $Ndd11400
 Reformat {
  type scale
  scale {{render_scale}}
  name renderScale
  xpos 684
  ypos 346
 }
clone $Cdd37800 {
  inputs 2
  xpos 684
  ypos 412
  selected false
 }
 Dot {
  name Dot1
  note_font_size 40
  xpos 718
  ypos 502
 }
 ScanlineRender {
  inputs 3
  conservative_shader_sampling false
  antialiasing high
  overscan {{"\$gui ? overscan_dynamic*guiScale.scale : overscan_dynamic*renderScale.scale"}}
  samples {{"\$gui ? gui_samples : render_samples"}}
  shutteroffset centred
  motion_vectors_type distance
  name ScanlineRender1
  label "\[value samples]"
  xpos 484
  ypos 492
  addUserKnob {20 User}
  addUserKnob {3 gui_samples}
  gui_samples 1
  addUserKnob {3 render_samples}
  render_samples 5
  addUserKnob {7 overscan_dynamic R 0 100}
  overscan_dynamic 32.8
 }
 DeepExpression {
  chans1 deep
  deep.front "deep.front - \[value expand]"
  deep.back "deep.back + \[value expand]"
  name DeepExpression1
  xpos 484
  ypos 551
  disable {{"expand == 0"}}
  addUserKnob {20 User}
  addUserKnob {7 expand R 0 100}
  expand 30.4
 }
 DeepHoldout2 {
  inputs 2
  name DeepHoldout1
  xpos 484
  ypos 607
 }
 Reformat {
  format {{{parent.Constant1.format}}}
  pbb true
  name Reformat2
  xpos 484
  ypos 676
 }
 Switch {
  inputs 2
  name Switch2
  xpos 484
  ypos 737
  disable true
 }
 Output {
  name Output1
  xpos 484
  ypos 785
 }
end_group