LayerFilter: Film V2
Film V2 — grain, vignette and fake depth-of-field in one node
- image
- depth_map
- image
AI renders come out too clean. No grain, no lens falloff, everything in perfect focus - that flat digital sheen that reads as "generated" before you've even looked closely. Film V2 dirties it up on purpose. It layers film grain, a vignette, and an optional depth-of-field blur onto your image so it looks like it went through a camera and a roll of stock instead of a diffusion model.
It's a one-stop "make it photographic" node. Instead of chaining a separate grain node, a vignette node, and a blur, you get all three tuned together. The grain in particular is the thing that sells realism - it breaks up the too-smooth gradients that give AI images away.
How it works
Three effects stacked. The vignette darkens toward the edges around a center point you set. The grain adds per-pixel noise using one of two engines, with separate control over how it hits shadows versus highlights (real film grain isn't uniform). The blur is a fake depth-of-field: if you feed a depth map, it keeps your focal plane sharp and blurs what's nearer/farther; without one, it's a general softness pass.
The inputs and outputs that matter
grain_method-fastgrain(quick) orfilmgrainer(the nicer, tunable one). Withfilmgraineryou also getfilmgrainer_shadows/filmgrainer_highsto shape where grain lands.grain_power(default 0.15) - grain intensity. The main realism dial; a little is plenty.vignette_intensity(default 0.5), pluscenter_x/center_yto place the falloff.saturation- a color tweak baked into the film look.- The blur block -
blur_strength,blur_focus_spread,focal_depth, and the optionaldepth_map. This is where the depth-of-field lives.
Output: one processed image.
How to install it
Ships with the LayerStyle pack. ComfyUI Manager → search LayerStyle → install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/chflame163/ComfyUI_LayerStyle
pip install -r ComfyUI_LayerStyle/requirements.txt
then restart. Find it under 😺dzNodes → LayerFilter.
Common issues & troubleshooting
The depth-of-field blur looks wrong or blurs the whole frame. The focus controls (focal_depth, blur_focus_spread) are meaningful when you feed a real depth_map - plug in the output of a depth-estimation node (Depth Anything, MiDaS, etc.). Without a depth map, there's no per-pixel distance for it to key off, so treat the blur as a general softness rather than true DoF, or leave blur_strength low.
Grain is too heavy / looks like noise. Drop grain_power - 0.15 is already visible, and much past that reads as sensor noise, not film. Use grain_scale to make the grain coarser or finer to match your output resolution.
Vignette is off-center or too dark. Adjust center_x/center_y and pull vignette_intensity back; a subtle vignette guides the eye, a heavy one looks like a phone filter.
Node's not in the menu. The LayerStyle pack failed to import - commonly a broken transformers dependency (a stray TensorFlow) crashing the whole pack on load. Check the traceback, use "Try Fix," or repair the offending library.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| center_x | FLOAT | 0.500–1 | — |
| center_y | FLOAT | 0.500–1 | — |
| saturation | FLOAT | 1.000.01–3 | — |
| vignette_intensity | FLOAT | 0.500–1 | — |
| grain_method | COMBO | 2 options: fastgrain, filmgrainer | |
| grain_power | FLOAT | 0.150–1 | — |
| grain_scale | FLOAT | 1.00.1–10 | — |
| grain_sat | FLOAT | 0.500–1 | — |
| filmgrainer_shadows | FLOAT | 0.600–1 | — |
| filmgrainer_highs | FLOAT | 0.200–1 | — |
| blur_strength | INT | 900–256 | — |
| blur_focus_spread | FLOAT | 2.20.1–8 | — |
| focal_depth | FLOAT | 0.900–1 | — |
| depth_mapopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |