Nodes/Difforum/Difforum · Fill Reveal (AI)
ComfyUI Node

Difforum · Fill Reveal (AI)

Repaint What the Camera Uncovered

By chillithebillis·Created 4 months ago·Updated 11 days ago· 10
Difforum · Fill Reveal (AI)
  • images
  • masks
  • model
  • positive
  • negative
  • vae
  • images
  • info
◄framesall►
◄steps24►
◄cfg5.0►
◄sampler_nameeuler►
◄schedulernormal►
◄grow16►
◄feather12►
◄seed0►

Parallax has a hard limit that every "living photo" demo quietly papers over: the depth map only describes the original camera view. Move the virtual camera and you reveal background that was never photographed. There is no pixel data there - a depth warp can stretch the border, or leave gray, and neither is scenery.

Fill Reveal is the honest fix. Guide Frames, H3 Shot and Keyframes mark the invented area in a mask; this node repaints only that area with an image model, and keeps the known pixels exactly.

How it does it

Per frame: take the mask (grow it a little into the known image so the seam hides, feather the edge), hand the frame plus mask to ComfyUI's core InpaintModelConditioning, run a normal KSampler on it, decode, then composite the result back through the feather with a soft alpha. seed + frame index seeds each frame differently, so a multi-frame fill doesn't paste the same invention into every hole.

It runs on plain MODEL/VAE/CONDITIONING, which means any image model works. The cleanest seams come from a dedicated inpaint checkpoint - SDXL inpainting, Flux Fill - because those models are trained to read the mask as a condition rather than just "generate here", and the difference shows up exactly at the edges. A regular checkpoint works too; it just leaves more seam.

The inputs that matter

  • images and masks - the frames with holes, and the mask where 1 means "fill this". That's Guide Frames' default convention, so they wire straight across.
  • frames - all, first, last, or first + last. This is the practical dial. Run first + last for an FL2VA shot, all for a keyframe set that's about to guide a model. It's one diffusion per frame, so the tip in the tooltip is the whole cost model: only paint the frames a video model will actually see.
  • positive / negative - describe the scene so the fill matches. Inpainting follows the prompt; if the fill is inventing a shopping mall behind your forest, that's a prompt problem, not a node problem.
  • grow (16) and feather (12) - the seam controls. Grow pushes the mask into the known image so the model redraws a little of the real photo as it blends; feather softens where painted meets original. These are the two numbers to fiddle with, and the classic values (4–12 px of feather for a still image) hold up here.
  • steps, cfg, sampler_name, scheduler - same rules as everywhere else in the pack. Turbo/LCM/DMD2 models want cfg 1–2 and an lcm or euler_ancestral sampler with sgm_uniform; a regular SDXL fill is happy at cfg 4–7.

Outputs

images (the frames, with holes filled) and info - which is a per-frame report of how much of the image it actually filled, plus a "nothing revealed, kept" line on frames where the camera didn't uncover anything. That line matters: it means the mask was empty and the node correctly did nothing instead of doing something.

Install

ComfyUI Manager → search "Difforum", or:

cd ComfyUI/custom_nodes && git clone https://github.com/chillithebillis/Difforum.git difforum

Restart. You need an image model - the pack ships no weights - and the node uses ComfyUI's own InpaintModelConditioning, so nothing extra installs.

Where people get burned

The cost. This is real sampling, one pass per frame, at full resolution. Painting a 240-frame clip with SDXL is a long evening. Check how much is actually revealed first - info on Guide Frames reports the average revealed area - and if it's 8%, consider letting the feedback loop or the video model handle it and save Fill Reveal for the frames that get anchored.

The other one is edge quality. A big grow with a small feather gives you a hard ring where the model's invention meets your photo; a small grow with a big feather bleeds the fill into the parts you wanted preserved. Start at the defaults, look at one frame at 100%, and adjust from what you see - the composite is deterministic, so a single test frame tells you everything.

CategoryDifforum/5 · Video model bridges

Inputs (14)

NameTypeDefaultDescription
imagesIMAGEFrames with holes where the camera uncovered new area (gray from Guide Frames).
masksMASK1 = area to fill (Guide Frames default convention).
modelMODELAn image model; an inpainting checkpoint (SDXL inpainting, Flux Fill) gives the cleanest seams.
positiveCONDITIONINGDescribe the scene so the fill matches it.
negativeCONDITIONINGNegative conditioning (CLIP Text Encode).
vaeVAEThe VAE that matches the model.
framesCOMBOallWhich frames to paint: all keyframes, or only the first / last (FL2VA).
stepsINT241–100Inpainting steps.
cfgFLOAT5.00–30Prompt strength. Turbo / LCM / DMD2 models want 1-2; regular SDXL 4-7.
sampler_nameCOMBOeulerSampler. euler / dpmpp_2m for regular models, euler_ancestral or lcm for turbo.
schedulerCOMBOnormalNoise schedule. karras / normal for regular models, sgm_uniform for turbo.
growINT160–256Pixels the mask is grown into the known image, to hide the seam.
featherINT120–256Soft edge, in pixels, where the painted area meets the original.
seedINT00–18446744073709550000Fill seed; change it for another fill.

Outputs (2)

NameTypeDescription
imagesIMAGE—
infoSTRING—