RenderFormer Lighting Target
Animate the light, not just the camera
- start_lighting
- LIGHTING
A moving camera with static lighting looks, well, static. RenderFormerLightingTarget is the counterpart to the Camera Target node: it takes a LIGHTING you've built and animates it - position, rotation, scale, even brightness - from its start state to an end state you define. One of the 15 nodes in paulh4x/ComfyUI_PHRenderFormerWrapper, the "100% vibecoded" wrapper around Microsoft's RenderFormer (SIGGRAPH 2025).
How it works
Same keyframe pattern as the camera version. The node takes your start_lighting, deep-copies it, and overwrites the copy with your end-state values to build an end light. The output is a dictionary of {"start_lights": [...], "end_lights": [...]} - it doesn't interpolate the frames itself; the Scene Builder does that. It returns this under the generic LIGHTING type so it can flow through the Combine node, which is a slightly confusing design choice worth knowing about.
The inputs
start_lighting- aLIGHTINGoutput (usually fromRenderFormerLighting).end_pos_x/y/z- where the light moves to (defaults0, 0, 2.1, matching the static node).end_rot_x/y/z- end rotation, −360 to 360.end_scale- end light size (default2.5). Scaling a light changes its falloff character, so this is a real creative lever.end_emissive_strength- end brightness, default5000. The node figures out the base color from the start light's emissive and re-applies this strength, so a bright light that dims over the shot is easy to set up.
One output: LIGHTING (the start+end sequence dict).
Wiring it in
Two paths:
- Simple: feed the output straight into the Scene Builder's optional
lighting_sequenceinput. Remember the Scene Builder's requiredlightinginput still wants the static start light - usually the sameLIGHTINGyou gave this node. - With multiple lights: route the output into
RenderFormerLightingCombineinstead, which merges static and animated lights into one unifiedLIGHTING_SEQUENCE(it matches animated end states to their start lights by a per-light UUID).
Installing it
# ComfyUI Manager: search "ComfyUI_PHRenderFormerWrapper"
cd ComfyUI/custom_nodes/
git clone https://github.com/paulh4x/ComfyUI_PHRenderFormerWrapper.git
cd ComfyUI_PHRenderFormerWrapper
git clone https://github.com/microsoft/renderformer.git renderformer
pip install -r requirements.txt
python -c "import imageio; imageio.plugins.freeimage.download()"
Restart ComfyUI.
Common issues
- "Invalid start_lighting input" error - you fed something that isn't a
LIGHTINGlist. It must be a real light output (a list of light definitions), not a bare material or a camera. - Light animation doesn't move - same
num_frames > 1gotcha as the camera: the Scene Builder only animates whennum_framesis above 1. - Light color doesn't animate - true, and not a bug: emission color is limited to white in the current model, so the animated channel is strength (brightness), not hue.
It's the node that turns a boring camera sweep into a shot with actual light drama - dim the key light as the camera pushes in and the render reads like a real film move.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| start_lighting | LIGHTING | — | |
| end_pos_x | FLOAT | 0.00-10–10 | — |
| end_pos_y | FLOAT | 0.00-10–10 | — |
| end_pos_z | FLOAT | 2.10-10–10 | — |
| end_rot_x | FLOAT | 0.0-360–360 | — |
| end_rot_y | FLOAT | 0.0-360–360 | — |
| end_rot_z | FLOAT | 0.0-360–360 | — |
| end_scale | FLOAT | 2.500.1–10 | — |
| end_emissive_strength | FLOAT | 50000–100000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LIGHTING | LIGHTING | — |