Apply IPAdaper Conditioning (SDXL)
Give each masked region its own reference image with IPAdapter conditioning
- model
- clip
- ipadapter
- mat_imgs_lst
- mat_msks_lst
- model
- positive
- negative
Dense diffusion tells each masked region what to say. Apply IPAdaper Conditioning (SDXL) is the sibling that tells each region what to look like. Where the Dense Diffusion node takes text prompts and masks, this one adds a per-region reference image and runs it through IPAdapter - so the wood region doesn't just get the prompt "white oak planks," it gets an actual photo of the grain you want, masked to only that part of the frame.
It's the ComfyUI half of the same architectural-rendering pipeline as its sibling, and it reuses the same list plumbing: you feed it the unpacked snapshot's material texts, images, and masks, plus the environment prompts, and it returns a patched model plus positive/negative conditioning ready for a KSampler.
The inputs that matter
Beyond the usual model, clip, ipadapter, the lists (mat_txts_lst, mat_imgs_lst, mat_msks_lst) and env_scene/env_style/env_negative, there are four dials you'll actually touch:
env_cond_strength(default 0.3) - how hard the full-canvas scene+style conditioning presses. Low by design; the scene is context, not content.mat_cond_strength(default 1.0) - how hard each per-region text conditioning presses within its mask.ipadapter_weight(default 1.0, range −1 to 3) - the strength of the reference-image attention. Crank it and the reference wins; drop toward 0.5 and the text does the talking. (IPAdapter's rule of thumb lives in the wider community: on SDXL, weight 0.6–0.8 is a sane starting point before you tune.)start_at/end_at- which sampling steps the image conditioning is active for. Leave 0→1, or end early (e.g. 0.7) so the last steps stop fighting the reference.
One mechanism note worth knowing: the per-region text conditioning is applied with ConditioningSetMask + ConditioningCombine under the hood, and the image conditioning uses IPAdapter's attention path with the region mask as an attention mask - the reference only leaks inside its own region. If start_at > end_at it throws rather than silently doing nothing.
Wiring and prerequisites
ipadapter comes from PseudoIPAdapterUnifiedLoaderClone (the pack's clone of cubiq's loader), which is your reminder that this node doesn't bring its own weights. The README is explicit about what you need installed first: cubiq's ComfyUI_IPAdapter_plus custom nodes, a CLIP Vision model in models/clip_vision, and the IP-Adapter .safetensors in a models/ipadapter folder - for SDXL the recommended pick is ip-adapter-plus_sdxl_vit-h.safetensors. No IPAdapter model file, and the whole node is a non-starter.
It's an SDXL-only node in practice (the name says it, and the IPAdapter models are version-matched to SDXL). Masks must arrive as [1, H, W] tensors, and the material lists have to be lists - wire them from the snapshot unpacker, not from a plain text widget. If you're already running the Dense Diffusion path, this is the same graph with images swapped in for part of the text, and it's genuinely one of the cleanest per-region IPAdapter setups you'll find.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| ipadapter | IPADAPTER | — | |
| mat_txts_lst | STRING | — | |
| mat_imgs_lst | IMAGE | — | |
| mat_msks_lst | MASK | — | |
| env_scene | STRING | — | |
| env_style | STRING | — | |
| env_negative | STRING | — | |
| width | INT | — | |
| height | INT | — | |
| env_cond_strength | FLOAT | 0.300–10 | — |
| mat_cond_strength | FLOAT | 1.000–10 | — |
| ipadapter_weight | FLOAT | 1.00-1–3 | — |
| start_at | FLOAT | 0.000–1 | — |
| end_at | FLOAT | 1.000–1 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |