Nodes/ComfyUI_PHRenderFormerWrapper/RenderFormer Lighting Target
ComfyUI Node

RenderFormer Lighting Target

Animate the light, not just the camera

By paulh4x·Created about a year ago·Updated about a year ago· 37
RenderFormer Lighting Target
  • start_lighting
  • LIGHTING
end_pos_x0.00
end_pos_y0.00
end_pos_z2.10
end_rot_x0.0
end_rot_y0.0
end_rot_z0.0
end_scale2.50
end_emissive_strength5000

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 - a LIGHTING output (usually from RenderFormerLighting).
  • end_pos_x/y/z - where the light moves to (defaults 0, 0, 2.1, matching the static node).
  • end_rot_x/y/z - end rotation, −360 to 360.
  • end_scale - end light size (default 2.5). Scaling a light changes its falloff character, so this is a real creative lever.
  • end_emissive_strength - end brightness, default 5000. 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_sequence input. Remember the Scene Builder's required lighting input still wants the static start light - usually the same LIGHTING you gave this node.
  • With multiple lights: route the output into RenderFormerLightingCombine instead, which merges static and animated lights into one unified LIGHTING_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 LIGHTING list. 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 > 1 gotcha as the camera: the Scene Builder only animates when num_frames is 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.

CategoryPHRenderFormer

Inputs (9)

NameTypeDefaultDescription
start_lightingLIGHTING
end_pos_xFLOAT0.00-10–10
end_pos_yFLOAT0.00-10–10
end_pos_zFLOAT2.10-10–10
end_rot_xFLOAT0.0-360–360
end_rot_yFLOAT0.0-360–360
end_rot_zFLOAT0.0-360–360
end_scaleFLOAT2.500.1–10
end_emissive_strengthFLOAT50000–100000

Outputs (1)

NameTypeDescription
LIGHTINGLIGHTING