Nodes/ComfyUI_PHRenderFormerWrapper/RenderFormer Lighting Combine
ComfyUI Node

RenderFormer Lighting Combine

The node that lets you actually use up to eight lights

By paulh4x·Created about a year ago·Updated about a year ago· 37
RenderFormer Lighting Combine
  • 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 required lighting input.
  • LIGHTING_SEQUENCE - a dict of {"start_lights": [...], "end_lights": [...]} covering both static and animated lights, for the Scene Builder's lighting_sequence input.

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_1lighting_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 LIGHTING must reach lighting, 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), and num_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.

CategoryPHRenderFormer

Inputs (8)

NameTypeDefaultDescription
lighting_1optLIGHTING
lighting_2optLIGHTING
lighting_3optLIGHTING
lighting_4optLIGHTING
lighting_5optLIGHTING
lighting_6optLIGHTING
lighting_7optLIGHTING
lighting_8optLIGHTING

Outputs (2)

NameTypeDescription
LIGHTINGLIGHTING
LIGHTING_SEQUENCELIGHTING