Nodes/DJZ-Nodes/CRT Effect v1
ComfyUI Node

CRT Effect v1

Dialing In a Proper CRT Look

By MushroomFleet·Created 2 years ago·Updated 5 months ago· 78
CRT Effect v1
  • images
  • IMAGE
preset_modeCustom
scanline_intensity0.30
scanline_spacing2
phosphor_blur0.5
bloom_intensity0.20
bloom_spread15
curvature0.10
vignette_intensity0.20
brightness1.0
contrast1.0
rgb_offset0.5

CRT Effect v1 is the "proper" CRT simulator in DJZ-Nodes - eleven parameters, four named presets, and a static look you can actually dial in on a single image. Its sibling CathodeRayEffect handles animated flicker; this one is for when you want a specific tube, shot by shot. If you're faking security-cam footage, retro game screens, or "captured on a TV" video, this is the node you'll reach for - then spend ten minutes tweaking rgb_offset.

The best feature is that it's not all manual. The preset_mode menu gives you four named tubes - Arcade (harsh, high-contrast, strong scanlines), Consumer TV (soft, more bloom, sloppier convergence), Professional Monitor (subtle, clean, minimal geometry), and Black & White TV (actually desaturates to grayscale, which is a nice touch). Selecting one overrides every slider, so you get a coherent starting point and then fine-tune.

How it works

Each frame runs through a fixed effect chain: phosphor blur (Gaussian), bloom (blurred copy added back), scanlines (darken every Nth row - scanline_spacing controls the gap, 2 = classic), screen curvature (a barrel distortion via remap), vignette, brightness/contrast, and finally RGB offset - which shifts the red channel right and blue left for that misaligned-convergence fringe. The RGB offset is deliberately applied last so the blur doesn't erase it. Pick Black & White TV and it skips RGB offset entirely and runs the image through a luminance conversion instead.

The inputs that matter

  • preset_mode - start here, always. It overwrites everything, so set your preset first and then adjust.
  • scanline_intensity / scanline_spacing - intensity is how dark the lines get (0–1), spacing is how far apart. spacing: 1 is brutal; 2–3 is the realistic range.
  • bloom_intensity / bloom_spread - the glow. bloom_spread is the blur kernel size in pixels (3–51), so it's the "how fat is the glow" knob.
  • rgb_offset (0–5, default 0.5) - the chromatic fringe. 0 is none; 1.0+ starts to look broken, which is sometimes exactly the point.
  • curvature (0–0.5) - barrel distortion. Real CRTs have some; 0.1–0.15 is tasteful.

Output is an IMAGE batch at the same size. Wire it into a video combiner or save node.

Installing it

CRT_Effect_v1 lives in DJZ-Nodes:

cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/DJZ-Nodes
cd DJZ-Nodes
pip install -r requirements.txt

Restart ComfyUI (or use Manager, search "DJZ-Nodes"). OpenCV from the requirements is the only real dependency; no models to fetch.

Common issues

The curvature implementation loops over every pixel in Python, which is fine for stills but will make a large batch chug - keep curvature low or skip it on video. The Black & White TV preset plus high brightness can blow out highlights fast (contrast 1.3 + brightness 1.1 is aggressive), so start at the preset defaults before pushing. And remember: unlike CathodeRayEffect, this node is static - if you want the picture to flicker and degrade over time, that's the other node. The two are complementary, not competing.

Categoryimage/effects

Inputs (12)

NameTypeDefaultDescription
imagesIMAGE
preset_modeCOMBOCustom5 options: Custom, Arcade, Consumer TV, Professional Monitor, Black & White TV
scanline_intensityFLOAT0.300–1
scanline_spacingINT21–10
phosphor_blurFLOAT0.50–2
bloom_intensityFLOAT0.200–1
bloom_spreadINT153–51
curvatureFLOAT0.100–0.5
vignette_intensityFLOAT0.200–1
brightnessFLOAT1.00.5–2
contrastFLOAT1.00.5–2
rgb_offsetFLOAT0.50–5

Outputs (1)

NameTypeDescription
IMAGEIMAGE