Video VignettingV1
Film-era corner darkening, minus the film
- images
- IMAGE
A vignette is one of those effects you barely notice until it's gone, and then the image looks flat and wrong. It's the natural darkening toward the frame edges, and real footage has it baked in from the lens (mechanical) and the film stock (chemical). Video Vignetting V1 is DJZ-Nodes' take on faking both convincingly on video batches - and the "video" part is the interesting bit, because this one can animate the vignette over time instead of just sitting there static.
If your workflow is producing clean, sterile AI footage and you want it to read as shot on actual optics, this is the node that adds the gravitas in one pass.
How it works
The node separates vignetting into its two real-world causes, which behave differently:
- Mechanical vignetting is the lens's fault. Light falloff toward the edges is smooth and radially symmetric - a gentle, feathered darkening that's strongest in the corners. You control it with
mechanical_intensity(0–1) andmechanical_feather(0.1–1), where feather is how soft the transition from bright center to dark edge is. Lower feather, more visible ring; higher, a subtle cinematic gradation. - Chemical vignetting is the film's fault. It's irregular, blotchy, organic - the kind of uneven density you get from aged chemistry.
chemical_intensity(0–1) sets how strong it is andchemical_irregularity(0–1) sets how noisy and organic the pattern is.
Pick one via vignette_type ("Mechanical", "Chemical", "Both", or "None"), and "Both" is where the realism lives - smooth lens falloff plus irregular chemical mottling is exactly what real frames show.
The temporal bit, which is the reason it says Video
Here's what makes it worth having over a still-image vignette node: temporal_variance. Real film doesn't hold a vignette constant - breathing, gate wobble, and exposure shifts make it pulse subtly. You get five modes: None, Sine, Random, Pulse, and Custom.
variance_speed(0.1–5) - how fast the variation oscillates.variance_amplitude(0–1) - how much the effect moves frame to frame. Small values are invisible-but-alive; big ones are dramatic flicker.custom_expression- a math string withtas the frame variable (defaultsin(t * 0.1) * 0.2). This is the same mini-expression-engine pattern the pack uses elsewhere, so you can writesin(t*0.05) + 0.3*random()style formulas. Invalid expressions fall back to 1.0 rather than crashing.
Feed it an images batch, get an IMAGE batch back. Nothing else to wire.
Installing it
Pack-level install - this 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 afterward, or search "DJZ-Nodes" in ComfyUI Manager. The requirements file is heavy (opencv, librosa, trimesh, moderngl among others) so give the first install a minute.
Troubleshooting
- "None" does nothing. Correct - that's the off switch. If you want the effect and see nothing, check
vignette_typefirst; it defaults to "Mechanical" in the schema so this one's usually not the trap. - The effect flickers too hard. You've got
temporal_varianceon Random or Pulse with a high amplitude. For "looks like film, doesn't look like a broken light," keep amplitude under ~0.2 and reach for Sine. - Edges look banded, not soft. Raise
mechanical_feather. A tight feather at high intensity draws a hard ring, which is a look - just probably not the one you wanted.
The honest take: it's a subtle tool for finishing, not a headline effect. But subtle is what separates AI video that looks generated from AI video that looks shot. Pair it with the pack's film grain and color temperature nodes and you've got a one-pack analog film finish.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| vignette_type | COMBO | 4 options: Mechanical, Chemical, Both, None | |
| mechanical_intensity | FLOAT | 0.500–1 | — |
| mechanical_feather | FLOAT | 0.300.1–1 | — |
| chemical_intensity | FLOAT | 0.400–1 | — |
| chemical_irregularity | FLOAT | 0.200–1 | — |
| temporal_variance | COMBO | 5 options: None, Sine, Random, Pulse, Custom | |
| custom_expression | STRING | sin(t * 0.1) * 0.2 | — |
| variance_speed | FLOAT | 1.00.1–5 | — |
| variance_amplitude | FLOAT | 0.200–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |