RenderFormer Lighting Combine
The node that lets you actually use up to eight lights
- lighting_1
- lighting_2
- lighting_3
- lighting_4
- lighting_5
- lighting_6
- lighting_7
- lighting_8
- LIGHTING
- LIGHTING_SEQUENCE
One light will get you a picture. Two gets you a key + fill. Four or eight gets you something that looks deliberately lit. RenderFormerLightingCombine is the node that merges multiple light sources into a single lighting rig, and it's the pack's answer to the "up to 8 lightsources" limit the README advertises. One of the 15 nodes in paulh4x/ComfyUI_PHRenderFormerWrapper, the "100% vibecoded" wrapper around Microsoft's RenderFormer (SIGGRAPH 2025).
How it works
It accepts up to eight lighting_1 through lighting_8 inputs - all optional. Here's the clever part: each input can be either a static light (a plain LIGHTING from the RenderFormerLighting node) or an animated light (the start/end dict from RenderFormerLightingTarget). The node sorts them out by inspecting what it received, then builds two outputs:
LIGHTING- the combined list of all start-frame lights. This is what you wire into the Scene Builder's requiredlightinginput.LIGHTING_SEQUENCE- a dict of{"start_lights": [...], "end_lights": [...]}covering both static and animated lights, for the Scene Builder'slighting_sequenceinput.
Animated lights are matched to their start state by the UUID each light carries (ph_uuid), so a light that starts at position A and ends at position B stays that light through the whole merge. Static lights simply duplicate their start state into the end frame - which is exactly what you want.
The inputs
lighting_1…lighting_8- mix freely. Four static + two animated + two unused is perfectly valid. The only real rule: don't exceed eight lights total, because RenderFormer's model caps at 8 lightsources.
Wiring it into the scene
RenderFormerLighting ──LIGHTING──▶ RenderFormerLightingCombine ──LIGHTING──────────▶ SceneBuilder.lighting (required)
RenderFormerLightingTarget ──LIGHTING▶ RenderFormerLightingCombine ──LIGHTING_SEQUENCE▶ SceneBuilder.lighting_sequence
The reason the node splits outputs is a 0.3.3 workflow change: the Scene Builder now needs an explicit start-frame lighting, and the combine conveniently hands you both the start frame and the full sequence. Clean design, honestly.
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
- Lights seem to vanish from the render - check the Scene Builder wiring: the combined
LIGHTINGmust reachlighting, not just the sequence input. Both wires matter. - Animated lights don't animate after combining - make sure the animated dict goes through the combine (or directly to
lighting_sequence), andnum_frames > 1. Static-light duplication into the end frame is by design, not a bug. - More than eight inputs you want to use - can't. Eight is both the input count and the model's hard limit.
It's the node that unlocks proper lighting design - the difference between "a render with a light" and an actual lit scene.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| lighting_1opt | LIGHTING | — | |
| lighting_2opt | LIGHTING | — | |
| lighting_3opt | LIGHTING | — | |
| lighting_4opt | LIGHTING | — | |
| lighting_5opt | LIGHTING | — | |
| lighting_6opt | LIGHTING | — | |
| lighting_7opt | LIGHTING | — | |
| lighting_8opt | LIGHTING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| LIGHTING | LIGHTING | — |
| LIGHTING_SEQUENCE | LIGHTING | — |