ArtificialGuyBR

Home / Blog / ComfyUI

IPAdapter vs ControlNet vs Regional Prompter in ComfyUI

Which conditioning tool to use in ComfyUI for style transfer, composition and character consistency — and the settings that work.

16 sources cited ComfyUI

IPAdapter vs ControlNet vs Regional Prompter in ComfyUI

TL;DR

The correction you need before anything else

A widely circulated 2024 ComfyUI tutorial tells you to tune an IPAdapter noise slider (0.01 = "adds noise", 1.0 = "removes noise"). That parameter no longer exists. The old IPAdapter Apply node was removed and replaced by IPAdapter Advanced, with image_negative as the current negative-conditioning input — an image, not a 0.01–1.0 slider. Without one, the node defaults to a zero image: image_negative = image_negative if image_negative is not None else torch.zeros([1, clipvision_size, clipvision_size, 3]). So the old empty-image-negative idea survives, just as an image input. Ignore any tutorial quoting 0.01/1.0 numbers.

What is IPAdapter and when does it win?

IPAdapter is a roughly 22-million-parameter adapter that gives a pretrained text-to-image diffusion model an image prompt on top of its text prompt. The original paper repo describes "an effective and lightweight adapter to achieve image prompt capability for the pre-trained text-to-image diffusion models. An IP-Adapter with only 22M parameters can achieve comparable or even better performance to a fine-tuned image prompt model." The ComfyUI maintainer calls it "a 1-image lora" (cubiq README) — and when one image is not enough, that is the point where training an actual LoRA starts paying off. It wins for appearance transfer — subject, face, or style from a reference — and loses when you need pixel-accurate layout, because it carries no structural map.

Key settings: start weight/scale at 0.8 for the default linear weight_type; use 0.5 for balanced text-plus-image and 1.0 for image-only. Always use a square reference image — CLIP's default processor center-crops, so non-square inputs "will miss the information outside the center" (tencent README).

IPAdapter model variants at a glance

File suffixStrengthBest forSource
ip-adapter_sd15Basic, averageGeneral subject/stylecubiq README
ip-adapter_sd15_light_v11Light impactSubtle influencecubiq README
ip-adapter-plus_sd15Very strongTight subject matchcubiq README
ip-adapter-plus-face_sd15Face, portraitsCharacter consistencycubiq README
ip-adapter-full-face_sd15Stronger face, "not necessarily better"Faces when Plus-Face is weakcubiq README

FaceID models are a separate family: they "require insightface" and "most FaceID models also need a LoRA," with the warning that "each FaceID model has to be paired with its own specific LoRA" (cubiq README).

How do I make IPAdapter only affect part of the image?

The IPAdapter Advanced node has an attn_mask input that restricts where the reference applies. Per the node docs: "The mask will define the area of influence of the IPAdapter models on the final image. Black zones won't be affected, white zones will get maximum influence. It can be a grayscale mask." The mask should match the latent's size or aspect ratio. The diffusers docs describe the same mechanism independently: "Binary masking enables assigning an IP-Adapter image to a specific area of the output image, making it useful for composing multiple IP-Adapter images. Each IP-Adapter image requires a binary mask."

This is the modern, supported way to compose several reference images into one frame. The cubiq regional conditioning example demonstrates it with a MaskFromRGBCMYBW+ node splitting a color-coded mask into per-region masks that each feed an IPAdapter param block. (An older tutorial cites examples/IPAdapter_2_masks.json, a filename no longer in the examples directory — the current equivalent is ipadapter_regional_conditioning.json.)

Two further IPAdapter Advanced inputs matter for regional work: weight_type ("style transfer (SDXL) only works with SDXL and it's a very powerful tool to transfer only the style of an image but not its content") and start_at/end_at timestepping ("if you start later (eg: start_at=0.3) the generated image will have a very light conditioning") — both from the node docs.

How do I transfer only style, not content, with IPAdapter?

Use InstantStyle. Its two-part method is documented in the project README: subtract content text features from the image features so "the style and content can be explicitly decoupled," then inject only into the style-handling attention blocks — "up blocks.0.attentions.1 and down blocks.2.attentions.1 capture style (color, material, atmosphere) and spatial layout (structure, composition) respectively." It is "supported in ComfyUI_IPAdapter_plus developed by our co-author," and the weight_type: style transfer (SDXL) option exposes the same idea.

What is ControlNet and when does it win?

ControlNet adds a spatial condition — Canny edges, depth maps, OpenPose skeletons, segmentation, scribbles, etc. — through a trainable copy of UNet encoder blocks, while a "locked" copy preserves the base model. A "zero convolution" (a 1×1 conv with zero weight and bias) means it adds no distortion before training: "before training, all zero convolutions output zeros, and ControlNet will not cause any distortion" (ControlNet README). The maintainer's FAQ explains why zero weights still learn: "as long as $x \neq 0$, one gradient descent iteration will make $w$ non-zero."

ControlNet wins when you need structure — pose, edges, depth, layout. The ComfyUI ControlNetApplyAdvanced node exposes strength (0.0–10.0, default 1.0), start_percent and end_percent (both 0–1) (ComfyUI nodes.py), matching IPAdapter's timestepping idiom. Multiple ControlNets compose: "more than one ControlNet can be easily composed to multi-condition control" (ControlNet README). For matching ControlNet types to tasks, see ControlNet models for composition control.

Regional Prompter: prompts locked to regions

Regional Prompter is an A1111 extension that lets "different prompts... be specified for different regions," separated by the BREAK keyword. ComfyUI users hit the same need when IPAdapter masks feel heavy-handed and a text-only split suffices. The syntax:

a man and a woman, a man with black hair
BREAK
a man and a woman, a woman with blonde hair

The first block applies to the left region, the second to the right. The shared "a man and a woman" matters: without it the model sees two single-person prompts and renders one person. The ADDCOMM keyword automates this by prepending the first block to every region, and ADDBASE plus a base ratio blends a base prompt by weight rather than concatenating it — "common clause combines prompts, and base clause combines weights (like img2img denoising strength)" (hako README).

Common prompt vs base prompt

FeatureCommon (ADDCOMM)Base (ADDBASE)
How it appliesPrepended to each region's promptBlended by base ratio (e.g. 0.2 = 20% base + 80% region)
AnalogyConcatenationimg2img denoising blend
Use whenThe scene framing must appear in every regionThe base is too strong and you want to dial it down
Sourcehako READMEhako README

Attention vs Latent mode in Regional Prompter

Regional Prompter has two calculation modes with a real accuracy/speed trade-off. Per the README, "In the case of a 512 x 512 image, Attention mode reduces the size of the region to about 8 x 8 pixels deep in the U-Net, so that small areas get mixed up; Latent mode calculates 64*64, so that the region is exact." Latent mode is slower — "the generation time is the number of areas x the generation time of one pic" — but it is the mode that "allows separating LoRAs to some extent." Internally Attention uses BREAK and Latent uses AND, auto-converted so you can type either.

ADetailer tokens: [SEP], [SKIP], [PROMPT]

When ADetailer detects several faces, three tokens control per-face prompts. If you have not set ADetailer up yet, start with our guide to fixing faces and hands automatically. From the wiki:

Pairing Regional Prompter for placement with ADetailer for face repair is the standard multi-character recipe. An often-cited claim that face processing order is adjustable via a settings toggle is not supported by the ADetailer wiki — detection order is arbitrary.

Common errors and fixes

Error / symptomCauseFixSource
'NoneType' object has no attribute 'encode_image' (often on sd1.5)Wrong CLIP vision encoder, or the deprecated IPAdapter_ConfyUI extension conflictingLoad the correct encoder from h94/IP-Adapter (models/image_encoder/model.safetensors for sd1.5, sdxl_models/image_encoder/model.safetensors for sdxl); remove the deprecated extension; update ComfyUI + the IPAdapter extensioncubiq issue #108
size mismatch for proj_in.weight ...Wrong model/encoder/checkpoint combo (e.g. -vit-h model with the bigG encoder)All -vit-h models need the SD1.5 ViT-H encoder; only one SDXL model and the vit-G SD1.5 model need the bigger encodercubiq issue #108
Expected query, key, and value to have the same dtype ...fp16/fp32 mismatchRun ComfyUI with --force-fp16cubiq issue #108
LoRA corruption, greenout/blackout in Regional Prompter Latent modeKnown Latent-mode LoRA issue, no root-cause fixReduce CFG, reduce LoRA weight, increase steps; use negative textencoder + negative U-net params; fall back to inpainthako README
Single person where two were intendedEach region prompt describes one personAdd a common prompt (ADDCOMM) stating the full scenestable-diffusion-art.com
Hair/clothing color lands on the wrong characterSelf-attention associates attributes across the imageSplit per-region prompts with BREAK so each attribute is region-lockedstable-diffusion-art.com

How to choose: a decision table

You want to control...First choiceFallback / combine with
Subject or face from a referenceIPAdapter Plus-Face / FaceIDADetailer for face cleanup
Style only, no content leakInstantStyle / weight_type: style transfer (SDXL)IPAdapter attn_mask to localize
Pose, edges, depth, layoutControlNetIPAdapter for appearance on top
Different prompt per image regionRegional Prompter (BREAK)ADetailer [SEP] for per-face prompts
Compose several reference images into one frameIPAdapter attn_mask per imageControlNet for the underlying layout

What must stay fixed? Appearance subject, face, style Structure pose, edges, depth Region this thing, here IPAdapter image prompt, no layout map ControlNet pixel-accurate layout Regional prompting prompt bound to an area Need two of them? They compose: ControlNet fixes the layout while IPAdapter carries appearance. They fail differently — IPAdapter has no structural map, so it cannot hold a pose; ControlNet holds the pose but knows nothing about who the subject is.
Which conditioning tool fits the job

FAQ

How do I make IPAdapter only affect part of the image? Connect a mask to the attn_mask input on IPAdapter Advanced. White areas get full reference influence, black areas get none, and grayscale is allowed. The mask should match the latent's size or aspect ratio. The diffusers docs call this "binary masking" and require one binary mask per IP-Adapter image.

What's the difference between Regional Prompter common prompt and base prompt? A common prompt (ADDCOMM) is prepended to every region's prompt — concatenation. A base prompt (ADDBASE) is blended by a base ratio weight, like img2img denoising strength: a ratio of 0.2 means 20% base plus 80% region. Use common when the scene framing must repeat; use base when that framing is too strong and you want to dial it down (hako README).

Why do my LoRAs corrupt when using Regional Prompter? It is a known issue in Latent mode — the README lists mitigations but states "no solution as of yet." Reduce CFG, reduce the LoRA weight, increase sampling steps, or use the negative textencoder and negative U-net parameters (0–1 per LoRA). Inpainting is the last resort. The deep cause is not documented; do not assume one.

Can I use IPAdapter and ControlNet together? Yes. Tencent ships dedicated ip_adapter_controlnet_demo notebooks for "structural generation with image prompt," and ControlNets are documented as composable. A common setup uses ControlNet (depth or OpenPose) for layout and IPAdapter for the subject's appearance, each with its own strength/weight and start/end percentages.

How do I transfer only style, not content, with IPAdapter? Use InstantStyle, which subtracts content text features from the image features and injects only into the style attention blocks (up_blocks.0.attentions.1 for style, down_blocks.2.attentions.1 for layout). It is built into ComfyUI_IPAdapter_plus; on SDXL you can also try weight_type: style transfer (SDXL).

What ADetailer tokens separate faces? [SEP] splits one prompt into per-object prompts in detection order (which the wiki calls "highly arbitrary"), [SKIP] skips inpainting for that part, and [PROMPT] is replaced by the original input prompt. ADetailer itself runs in three steps: generate, detect-and-mask, then inpaint (README).

What IPAdapter weight should I start with? The cubiq README suggests lowering weight "to at least 0.8" and increasing steps; the NODES.md calls 0.8 "a good starting point" for the default linear weight type. For balanced text-plus-image conditioning Tencent and the diffusers docs both point to scale=0.5, reserving 1.0 for image-only generation.

Does Regional Prompter work 100% of the time? No. One community tutorial reports roughly a 75% success rate; treat that as community-reported rather than a measured figure (stable-diffusion-art.com). Attribute bleed between characters still happens, which is why ADetailer face repair is usually paired with it.

Sources