VFX Passes to Video
Turn one reference image into a blendable VFX keyframe with chromatic aberration, glow, lens flare, film finish, and generate a Seedance 2.0 cinematic video.
About
This ComfyUI workflow turns a single reference image into a layered VFX keyframe and then uses that keyframe to drive a Seedance 2.0 cinematic video. In the Generated VFX Passes group, effect layers are built as separate passes—chromatic aberration, glow/bloom, lens flare, and a film finish—then composited with ImageBlend nodes. Glow is created with ImageBlur and blended with Screen; lens flare is a black-background overlay blended with Screen; chromatic aberration is applied as a full-frame pass blended with Normal.
Blend strengths are exposed via PrimitiveFloat nodes, and you can preview any stage with PreviewAny or save stills with SaveImage.
Once the composited keyframe looks right, it’s routed into ByteDance2ReferenceNode in the Seedance 2.0 Output group to generate a motion clip that inherits the look of your keyframe. GeminiImage2Node and GeminiNode are used in the graph to construct and refine the image-based passes, while ImageBlend controls how each pass stacks.
Finally, SaveVideo writes the Seedance 2.0 output to disk. This setup is useful because you can dial in a cinematic look non-destructively on a still, audition each pass in isolation, and then get a consistent, blendable look carried through to video—all from one reference frame.
What you provide
- Reading the workflow
Runs in ComfyUI. This workflow can't run on this page. Open it in Comfy Cloud with everything loaded, or download it for your own ComfyUI.
Try in CloudInside the workflow
A read-only preview of the node graph. Open it in Comfy Cloud or download it to edit the nodes.
Loading the graph
Open full-size workflow preview- Author
- ComfyUI
Requires custom nodes
- Reading the workflow
Use this workflow from code
Generated from the workflow graph and inputs when possible; stored examples are shown otherwise. Review credentials and endpoints before running code, which may incur charges.
What you need
- Runs on
- Comfy Cloud
- Key
- COMFY_API_KEY
Needs a paid Cloud plan and credits.
# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"1": {
"class_type": "LoadImage",
"inputs": {
"image": "0a7de162b039a84850dfbff6b319c67bea78a97aaff0c1d2fc979d68914586f8.png"
},
"_meta": {
"title": "Input reference image"
}
},
"2": {
"class_type": "GeminiImage2Node",
"inputs": {
"aspect_ratio": "auto",
"images": [
"1",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": "Using the uploaded image as a strict reference, create a full-frame chromatic aberration pass. Preserve the exact subject, composition, lighting, geometry, identity, colors, and aspect ratio. Add only subtle optical RGB edge separation, prism fringing on high-contrast edges, slight red/cyan fringe near the image borders, and restrained glass dispersion. Do not add text, logos, watermarks, new objects, duplicate subjects, or change the scene.",
"resolution": "2K",
"response_modalities": "IMAGE",
"seed": 947627340135294,
"system_prompt": "You are a precise VFX image-pass generator. Preserve the input image exactly except for the requested optical effect. Return an image only."
},
"_meta": {
"title": "Pass 1 - Chromatic aberration"
}
},
"3": {
"class_type": "ImageBlur",
"inputs": {
"blur_radius": 19,
"image": [
"1",
0
],
"sigma": 5
},
"_meta": {
"title": "Pass 2 - Bloom blur source"
}
},
"4": {
"class_type": "GeminiImage2Node",
"inputs": {
"aspect_ratio": "auto",
"images": [
"1",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": "Create a same-aspect-ratio black-background lens flare overlay matched to the uploaded reference image. The output should mostly be pure black with only realistic optical elements: soft anamorphic streaks, highlight glints, flare ghosts, subtle halation around existing bright light directions, and a few faint dust/sensor sparkle artifacts. Do not reproduce the scene itself. Do not add text, logos, UI, captions, or new objects. This will be blended with Screen/Add mode over the original image.",
"resolution": "2K",
"response_modalities": "IMAGE",
"seed": 148534497297643,
"system_prompt": "You generate optical overlay passes for compositing. Keep non-flare areas black so the pass can be screen-blended."
},
"_meta": {
"title": "Pass 3 - Lens flare overlay"
}
},
"5": {
"class_type": "GeminiImage2Node",
"inputs": {
"aspect_ratio": "auto",
"images": [
"1",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": "Using the uploaded image as a strict reference, create a film finishing pass version of the same frame. Preserve all content, identity, framing, and object layout exactly. Add subtle highlight rolloff, soft halation, restrained film grain, very mild vignette, faint gate texture, and a cinematic color finish. Do not add text, logos, captions, watermarks, new people, new props, or change the scene.",
"resolution": "2K",
"response_modalities": "IMAGE",
"seed": 685209943797967,
"system_prompt": "You are a finishing artist producing a restrained full-frame grade pass. Preserve scene content exactly and return an image only."
},
"_meta": {
"title": "Pass 4 - Film finish"
}
},
"6": {
"class_type": "PrimitiveFloat",
"inputs": {
"value": 0.18
},
"_meta": {
"title": "Chromatic strength"
}
},
"7": {
"class_type": "ImageBlend",
"inputs": {
"blend_factor": [
"6",
0
],
"blend_mode": "normal",
"image1": [
"1",
0
],
"image2": [
"2",
0
]
},
"_meta": {
"title": "Blend chromatic"
}
},
"8": {
"class_type": "PrimitiveFloat",
"inputs": {
"value": 0.28
},
"_meta": {
"title": "Glow strength"
}
},
"9": {
"class_type": "ImageBlend",
"inputs": {
"blend_factor": [
"8",
0
],
"blend_mode": "screen",
"image1": [
"7",
0
],
"image2": [
"3",
0
]
},
"_meta": {
"title": "Blend bloom/glow"
}
},
"10": {
"class_type": "PrimitiveFloat",
"inputs": {
"value": 0.6
},
"_meta": {
"title": "Lens flare strength"
}
},
"11": {
"class_type": "ImageBlend",
"inputs": {
"blend_factor": [
"10",
0
],
"blend_mode": "screen",
"image1": [
"9",
0
],
"image2": [
"4",
0
]
},
"_meta": {
"title": "Blend lens flare"
}
},
"12": {
"class_type": "PrimitiveFloat",
"inputs": {
"value": 0.25
},
"_meta": {
"title": "Film finish strength"
}
},
"13": {
"class_type": "ImageBlend",
"inputs": {
"blend_factor": [
"12",
0
],
"blend_mode": "soft_light",
"image1": [
"11",
0
],
"image2": [
"5",
0
]
},
"_meta": {
"title": "Final VFX composite"
}
},
"14": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "vfx_passes_seedance2/final_vfx_reference",
"images": [
"13",
0
]
},
"_meta": {
"title": "Save final reference"
}
},
"16": {
"class_type": "GeminiNode",
"inputs": {
"images": [
"13",
0
],
"model": "gemini-3-1-flash-lite",
"prompt": "Analyze the final VFX reference image and write one vivid Seedance 2.0 reference-to-video motion prompt that makes the shot feel cinematic, dimensional, and high contrast rather than flat. Preserve the exact subject, identity, composition, object layout, and baked VFX look, including chromatic aberration, bloom/glow, lens flare glints, halation, film grain, vignette, and polished cinematic color. Infer the strongest scene-appropriate camera move and describe it with concrete film language: foreground/background parallax, dolly or orbital movement, slight roll or tilt where useful, rack focus, lens compression, motion blur, volumetric light, shadow sweeps, highlight pulses, atmospheric particles, and layered depth. Add purposeful movement in the scene elements so the frame has scale and energy, but avoid chaotic motion. Include strict constraints against text, logo changes, object morphing, extra subjects, warped geometry, scene redesign, and washed-out low-contrast lighting. Return only one 80-120 word prompt.",
"seed": 824781862334978,
"system_prompt": "You are a senior cinematic motion prompt writer for Seedance 2.0. Convert a still VFX reference into a film-trailer-quality video direction with strong depth, lighting contrast, camera motivation, and layered motion while preserving the reference frame exactly. Do not write generic or flat motion such as only subtle drift; choose a controlled cinematic move that reveals scale and parallax. Return exactly one prompt with no markdown."
},
"_meta": {
"title": "Write Seedance motion prompt"
}
},
"17": {
"class_type": "PreviewAny",
"inputs": {
"source": [
"16",
0
]
},
"_meta": {
"title": "Review generated prompt"
}
},
"20": {
"class_type": "ByteDance2ReferenceNode",
"inputs": {
"model": "Seedance 2.0",
"model.auto_downscale": False,
"model.auto_upscale": False,
"model.duration": 6,
"model.generate_audio": True,
"model.prompt": [
"17",
0
],
"model.ratio": "adaptive",
"model.reference_images.image_1": [
"13",
0
],
"model.reference_images.image_2": [
"1",
0
],
"model.resolution": "720p",
"seed": 20481295,
"watermark": False
},
"_meta": {
"title": "Seedance 2.0 reference to video"
}
},
"21": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/vfx_passes_seedance2",
"format": "mp4",
"format.codec": "h264",
"video": [
"20",
0
]
},
"_meta": {
"title": "Save Seedance MP4"
}
},
"23": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "vfx_passes_seedance2/chromatic_aberration_pass",
"images": [
"2",
0
]
},
"_meta": {
"title": "Save chromatic pass"
}
},
"24": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "vfx_passes_seedance2/glow_blur_pass",
"images": [
"3",
0
]
},
"_meta": {
"title": "Save glow pass"
}
},
"25": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "vfx_passes_seedance2/lens_flare_overlay_pass",
"images": [
"4",
0
]
},
"_meta": {
"title": "Save lens flare pass"
}
},
"26": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "vfx_passes_seedance2/film_finish_pass",
"images": [
"5",
0
]
},
"_meta": {
"title": "Save film finish pass"
}
}
})
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)Questions & answers
Set that pass’s PrimitiveFloat strength to 0 or switch its ImageBlend alpha to 0. You can also temporarily bypass it by disconnecting the pass input to the corresponding ImageBlend node.
Screen blends can quickly blow out bright regions. Lower the glow PrimitiveFloat value feeding the ImageBlend, reduce ImageBlur radius for a tighter bloom, and preview at 100% to judge highlight roll-off.
Dial back the chromatic aberration pass’s strength (PrimitiveFloat) and keep its ImageBlend mode on Normal. Small values usually sell the effect without distracting edges.
Finalize the composite keyframe first (use SaveImage and PreviewAny), then feed that exact output into ByteDance2ReferenceNode. Keep effect strengths moderate and consistent; re-run SaveVideo if you adjust blends.