CRT Effect v1
Dialing In a Proper CRT Look
- images
- IMAGE
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: 1is brutal;2–3is the realistic range.bloom_intensity/bloom_spread- the glow.bloom_spreadis 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.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| preset_mode | COMBO | Custom | 5 options: Custom, Arcade, Consumer TV, Professional Monitor, Black & White TV |
| scanline_intensity | FLOAT | 0.300–1 | — |
| scanline_spacing | INT | 21–10 | — |
| phosphor_blur | FLOAT | 0.50–2 | — |
| bloom_intensity | FLOAT | 0.200–1 | — |
| bloom_spread | INT | 153–51 | — |
| curvature | FLOAT | 0.100–0.5 | — |
| vignette_intensity | FLOAT | 0.200–1 | — |
| brightness | FLOAT | 1.00.5–2 | — |
| contrast | FLOAT | 1.00.5–2 | — |
| rgb_offset | FLOAT | 0.50–5 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |