ControlNet
The apply node for Radiance's sampler, union models included
- conditioning
- control_net
- image
- vae
- conditioning
ControlNet is the technique that turned prompting from a slot machine into a composition tool: the prompt decides what, the control image decides where. This is Radiance's version of the apply node - the piece that staples a control hint onto your conditioning before it reaches the sampler.
What it is
It takes your positive conditioning, a CONTROL_NET model, and a hint image (edges, depth, pose, whatever you preprocessed), and returns conditioning with the control baked in. Wire the output into the sampler's positive and you're done.
Honest caveat up front: if you're running stock ComfyUI's KSampler, you have ControlNetApplyAdvanced and it does the same job. This node exists because Radiance's own sampler pipeline expects it, and because it handles a couple of the modern case-by-case traps that trip people up.
The inputs that matter
Six of them, and three are worth your attention.
control_type defaults to auto and includes ComfyUI's union ControlNet types. This is the one people miss. Union checkpoints - the ones that land for Flux and every new base within about a week - pack several conditions into one file, and the model can't infer whether your hint image is a canny edge map or a depth map. Pick the wrong mode on a union model and you get mush that looks like the control did nothing. Set it explicitly: Canny, Depth, Pose, whatever you preprocessed.
strength runs 0–10 with a default of 1, which is a wider range than stock ComfyUI offers, and start_percent/end_percent control when in the generation the control applies. Here's the real trick: end control at 0.5–0.7 and the model lays out your composition early then paints freely in the late steps. It's the difference between a stiff traced copy and something that respects your edges without looking dead.
The optional vae input is the second trap. SD1.5 and SDXL ControlNets take the hint image directly - leave it empty. SD3, Flux and the DiT-family ControlNets take a VAE-encoded hint, so if you don't connect the model's VAE, the hint is wrong and the control is weak or ignored. It's the most common "ControlNet does nothing on Flux" report, and it's a wiring mistake, not a bug.
How it behaves
Two safety behaviours worth knowing about, both from the source rather than the docs:
- No ControlNet connected → it bypasses. It logs, returns your conditioning unchanged, and the graph keeps running. No AttributeError, no crash. Handy for A/B testing.
strength: 0→ returns conditioning unchanged. Same logic, so you can dial control off without rewiring.- Chaining, not replacing. If your conditioning already carries a ControlNet, this adds to it rather than overwriting. That's how you stack a depth control and a pose control - two of these in series.
Note there's only one output, conditioning. No hint image passthrough, no preview.
Install
Radiance ships ~147 nodes; this is one of them. ComfyUI Manager → search Radiance → install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt
Restart ComfyUI and hard-refresh the browser. Windows portable users should run the pip line with python_embeded\python.exe. This node downloads no models, but the preprocessors and ControlNet checkpoints come from elsewhere - a depth hint, for instance, is what Radiance's own Depth node produces.
Where people get burned
Beyond the union mode and the missing VAE: the hint image wants display-referred 0–1 values. Hand it a scene-linear float image from your HDR chain and the contrast is wrong in a way that looks like a bad preprocessor. Decode first.
And the classic - stacking controls without lowering strength. Two ControlNets both at 1.0 is not twice the control, it's a fight. Half the reason modern models handle control badly is people running three hints at full strength on a distilled model with four sampling steps. Start lower than you think, and use end_percent before you reach for strength.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| conditioning | CONDITIONING | Conditioning to attach the ControlNet to (usually the positive). An existing ControlNet on it is chained, not replaced. | |
| control_net | CONTROL_NET | ControlNet model from a ControlNet loader. Strength 0 returns the conditioning unchanged. | |
| image | IMAGE | Control hint image (edges, depth, pose and so on) in display-referred 0-1 values. | |
| strength | FLOAT | 1.000–10 | Global strength of the control effect. |
| start_percent | FLOAT | 0.000–1 | Percentage of the generation where control starts (0.0 = beginning). |
| end_percent | FLOAT | 1.000–1 | Percentage of the generation where control ends (1.0 = end). |
| control_type | COMBO | auto | For Union ControlNets (like Flux), select the specific control mode (Canny, Depth, etc.). |
| vaeopt | VAE | The model's VAE. Needed by ControlNets that take a VAE-encoded hint (SD3, Flux and other DiT ControlNets); leave unconnected for SD1.5 / SDXL ones. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| conditioning | CONDITIONING | — |