Nougan Regional Character LoRA π₯
Two characters, no identity soup
- model
- clip
- MODEL
- CONDITIONING
- NEGATIVE
Every generation is independent - the model has no memory of the character you made last run, and the moment you ask for two of them in one frame, the standard answer is compositing or inpainting or accepting a blended mess. NouganRegionalCharacterLoRA is the no-compositing answer: two character LoRAs, each confined to its own region of the image, applied inside the model's forward pass so the base generator still produces a single coherent frame.
It's the flagship node of Winnougan's Nougan_Nodes suite, and if you're coming from the Krea 2 side you'll see the same node registered as Krea2RegionalCharacterLoRA - same class, same behavior, aliased for different pipelines. The mechanism doesn't care which 12B DiT you point it at, as long as it's a Flux/Krea-family architecture with separate attention projections.
How it works
Stacking LoRAs merges ΞA + ΞB into every weight, which is why both identities hit every pixel. This node never merges. It loads each LoRA's low-rank down/up matrices, matches them to the live model's Linear layers by normalising both key naming conventions down to a common signature, and registers forward hooks that add the delta only where that character's region mask is active:
hook(module, input, output):
Ξa = (x @ down_aα΅) @ up_aα΅
Ξb = (x @ down_bα΅) @ up_bα΅
return output + mask_A Γ Ξa + mask_B Γ Ξb
Masks live on the token grid, not pixels - at Flux/Krea patchification each token covers a 16Γ16 pixel patch, so the boxes you draw map onto the latent grid at execution time. Text tokens always get mask 0, so your prompt conditioning is never touched. Base weights stay frozen; hooks are registered per forward call and torn down after.
The inputs that matter
model,clip- your loaded model and text encoder.lora_a,lora_b- the two character LoRAs frommodels/loras.strength_a,strength_b- 1.0 default, β4 to 4 range. These are just normal LoRA weights per region.feather- seam softness (0β0.3, default 0.06). This one gets fiddled with constantly: too soft and the characters merge, too hard and you see a line.regions- JSON the on-node visual editor maintains. Blue box is A, red box is B; drag and resize. You don't type this.
Outputs: MODEL (patched - wire to your guider/sampler), CONDITIONING, and NEGATIVE.
Installing and the usual gotchas
Search Nougan in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Winnougan/Nougan_Nodes
# restart ComfyUI
No extra pip packages - the suite declares zero dependencies and each node family boots in its own try/except, so a failed family never takes the rest down.
Where people actually hit walls: 0 layers matched means the LoRA keys don't line up with your model - almost always a LoRA trained for a different architecture. Feather above ~0.15 and you're back to blending. And the node prints diagnostic lines on every run (matched N layers, n_text, n_img) - if a character lands in the wrong region, that's the token-offset clue to look at first. Two characters, one image, no post-processing. That's the deal.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | β | |
| clip | CLIP | β | |
| lora_a | COMBO | 0 options: | |
| strength_a | FLOAT | 1.00-4β4 | β |
| lora_b | COMBO | 0 options: | |
| strength_b | FLOAT | 1.00-4β4 | β |
| feather | FLOAT | 0.060β0.3 | β |
| regions | STRING | {} | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | β |
| CONDITIONING | CONDITIONING | β |
| NEGATIVE | CONDITIONING | β |