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.
简介
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.
你需要提供
- 正在读取工作流
在 ComfyUI 中运行。 此工作流无法在本页面运行。你可以在 Comfy Cloud 中打开(已预先加载所需内容),或下载后在自己的 ComfyUI 中使用。
在 Cloud 中试用查看工作流内部
节点图的只读预览。在 Comfy Cloud 中打开或下载后即可编辑节点。
Loading the graph
Open full-size workflow preview- 作者
- ComfyUI
需要自定义节点
- 正在读取工作流
通过代码使用此工作流
尽可能根据工作流图和输入自动生成代码,否则显示已保存的示例。运行代码可能产生费用,请先核对凭据和端点。
What you need
- Runs on
- Comfy Cloud
- 密钥
- COMFY_API_KEY
需要付费的 Cloud 方案和额度。
# 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)常见问答
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.