Serie ComfyUI (XVI) — Multi-ControlNet: combinando varios controles en un mismo workflow
- hace 2 días
- 10 Min. de lectura
Continuamos la Serie ComfyUI, dedicada a entender y dominar la generación de imágenes con IA en local.
En artículos anteriores hemos visto cómo usar ControlNet para controlar la forma de una imagen y cómo combinarlo con LoRA para añadir estilo y coherencia visual. Pero cuando empiezas a construir workflows más avanzados, aparece una pregunta clave: ¿Qué pasa si usamos más de un ControlNet a la vez?.
La respuesta es que el control deja de ser unidimensional. Hasta ahora, con un solo ControlNet, el modelo recibe una única guía: bordes, profundidad, pose. Pero cada uno de esos controles representa solo una parte de la información visual.
En este artículo damos un paso más: combinar varios ControlNet dentro de un mismo workflow, y lo hacemos con uno de los casos más útiles y fáciles de entender:
Canny → controla la estructura (bordes)
Depth → controla el volumen (profundidad)

Además, trabajaremos con un ejemplo muy visual: partimos de una imagen real de la Catedral de León👉 y la reinterpretamos como un edificio industrial futurista. Esto nos permite ver claramente cómo la estructura se mantiene, el volumen se respeta y el estilo se transforma
Un ControlNet controla una dimensión. Varios ControlNet permiten un control multidimensional
🎯 Qué vas a lograr
Al finalizar este artículo serás capaz de:
Entender cómo funciona el uso de varios ControlNet en un mismo workflow dentro de ComfyUI.
Comprender el papel de cada tipo de control en este caso:
Canny → estructura y bordes
Depth → volumen y profundidad
Aplicar dos preprocessors distintos sobre una misma imagen base.
Entender cómo se reparten las responsabilidades entre varios controles sin que se “pisen” entre ellos.
Generar imágenes más coherentes en escenas complejas, especialmente en arquitectura, entornos industriales o composiciones con profundidad
Reutilizar este workflow como base para:
combinar más tipos de ControlNet
experimentar con distintos preprocessors
y construir pipelines más avanzados
🧩 Requisitos
Para seguir este artículo y ejecutar correctamente el workflow Multi-ControlNet (Canny + Depth) en ComfyUI, necesitas lo siguiente:
💻 Entorno
ComfyUI instalado y funcionando correctamente
Preferiblemente con GPU para obtener resultados fluidos
🧠 Modelo base (checkpoint)
En este workflow utilizamos: juggernautXL_v8Rundiffusion.safetensors (https://civitai.com/models/133005/juggernaut-xl?modelVersionId=782002), pero podríamos usar cualquier modelo compatible con SDXL.
🧠 ControlNet
Este workflow utiliza dos modelos de ControlNet:
controlnet-canny-sdxl-1.0.fp16.safetensors (diffusers/controlnet-canny-sdxl-1.0 at main)
ControlNetUnion_XL_ParaTodoControlNEt.safetensors (diffusers/controlnet-depth-sdxl-1.0 at main)
👉 Cada uno se encarga de un tipo de control distinto:
Canny → bordes y estructura
Depth → volumen y profundidad
🖼️ Imagen de entrada
El workflow parte de una única imagen base "Catedral_Leon.png"
🗂️ Crear o cargar el workflow en ComfyUI
Tienes dos maneras de trabajar con este flujo:
🅰️ Opción A — Cargar el workflow ya creado
1️⃣ Descarga el archivo JSON adjunto:📁 wf_ComfyUI_SDXL_Multi_ControlNet_Canny_Depth_OneImage.json
2️⃣ Abre ComfyUI.
3️⃣ En el menú superior selecciona:Workflow → Load
4️⃣ Carga el archivo JSON. Verás en el lienzo todos los nodos conectados y listos para funcionar.

🅱️ Opción B — Crear el workflow desde cero
Si prefieres entenderlo pieza a pieza, puedes recrearlo manualmente. En la siguiente sección explicamos qué hace cada bloque del flujo.

🧠 Qué significa usar varios ControlNet
Hasta ahora, en la serie, hemos trabajado con un único ControlNet en cada workflow. Y eso implica una forma bastante directa de control: le das al modelo una guía y el modelo la sigue.
Por ejemplo:
con Canny, el modelo respeta los bordes
con Depth, el modelo respeta el volumen
con Pose, el modelo respeta la postura
Cada ControlNet representa una forma de interpretar la imagen. Pero esa interpretación es parcial. Canny ve líneas y Depth ve volumen. Ninguno ve la imagen completa.
Cuando usamos varios ControlNet, no estamos “añadiendo más fuerza”. Estamos dando al modelo más información estructural, y lo importante es que esa información viene de la misma imagen, procesada de formas distintas
🎯 En este artículo
Trabajamos con:
Canny → lectura basada en bordes
Depth → lectura basada en profundidad
Ambos parten de la misma imagen, pero generan dos interpretaciones completamente distintas:
una describe la forma externa
la otra describe la estructura espacial
Cuando encadenas varios ControlNetApplyAdvanced, el modelo no “elige uno”. Integra todos los condicionamientos, es decir:
primero aplica el control de Canny
después añade el control de Depth
y genera teniendo en cuenta ambos
Cada ControlNet tiene sus propios parámetros: strength, start y end. Eso define cuanto influye y en que parte del proceso lo hace.
En este workflow:
Canny (0.7, 0→1) → mantiene la estructura durante todo el proceso
Depth (0.5, 0→0.7) → aporta volumen principalmente al inicio
👉 Resultado: la forma se conserva, el volumen se respeta, pero el modelo sigue teniendo libertad para reinterpretar
🔥 Qué cambia respecto a usar uno solo
Solo Canny: buena estructura pero volumen pobre o inconsistente
Solo Depth: buen volumen pero bordes difusos
Canny + Depth: estructura clara, volumen coherente y resultado mucho más sólido
⚙️ El workflow: estructura general
La lógica del workflow es la siguiente:
LoadImage
├── Canny → ControlNet (estructura)
└── Depth → ControlNet (volumen)
Checkpoint + Prompt
↓
Apply ControlNet (Canny)
↓
Apply ControlNet (Depth)
↓
KSampler
↓
VAE Decode
↓
Save / PreviewEl flujo completo se compone de los siguientes elementos:
Nº | Bloque | Función |
1️⃣ | LoadImage | Carga la imagen base |
2️⃣ | Canny | Extrae la estructura |
3️⃣ | DepthAnythingPreprocessor | Genera el mapa de profundidad |
4️⃣ | ControlNetLoader (Canny) | Carga el control de bordes |
5️⃣ | ControlNetLoader (Depth) | Carga el control de profundidad |
6️⃣ | CLIPTextEncode (+) | Prompt positivo |
7️⃣ | CLIPTextEncode (–) | Prompt negativo |
8️⃣ | CheckpointLoaderSimple | Modelo base SDXL |
9️⃣ | ControlNetApplyAdvanced (1) | Aplica Canny |
🔟 | ControlNetApplyAdvanced (2) | Aplica Depth |
1️⃣1️⃣ | EmptyLatentImage | Define resolución |
1️⃣2️⃣ | KSampler | Genera la imagen |
1️⃣3️⃣ | VAEDecode | Convierte a imagen |
1️⃣4️⃣ | SaveImage / PreviewImage | Visualiza y guarda |
🔗 Cómo fluye la información
1. Flujo de estructura (Canny): define bordes, contornos y geometría visible.
Imagen → Canny → ControlNetFlujo de volumen (Depth): define profundidad, jerarquía espacial y relación entre planos
Imagen → Depth → ControlNet3. Flujo de intención (Prompt): define que quieres generar y como reinterpretar la escena
Prompt → ControlNet → KSampler🧱 Entendiendo el workflow paso a paso
1️⃣ LoadImage (imagen base)
Qué hace: carga la imagen de entrada que se utilizará como referencia estructural.
Qué tocar:
La imagen de entrada. en este caso: "Catedral_Leon.png".
👉 Cuanto más clara sea la estructura, mejor funcionarán los ControlNet.
Salida:
IMAGE → Canny
IMAGE → Depth

2️⃣ Canny (estructura)
Qué hace: convierte la imagen en un mapa de bordes que define la estructura visible.
Qué tocar:
low: 0.1
high: 0.3
👉 Ajuste típico:
valores bajos → más detalle
valores altos → menos ruido
Salida:
IMAGE → ControlNetApply (Canny)
IMAGE → PreviewImage (para ver el resultado del preprocesado)
3️⃣ DepthAnythingPreprocessor (volumen)
Qué hace: genera un mapa de profundidad a partir de la misma imagen. Este nodo no detecta bordes, sino que interpreta la escena en términos de qué está cerca, qué está lejos y cómo se organiza el espacio. Es decir, convierte la imagen en una representación de volumen y jerarquía espacial.
El resultado no es una imagen “bonita”, sino una imagen donde:
zonas claras → más cercanas
zonas oscuras → más lejanas
👉 Esto permite al modelo entender la escena en 3D, aunque parta de una imagen 2D.
El mapa de profundidad influye directamente en:
cómo se distribuyen los elementos en el espacio
la sensación de escala
la coherencia entre planos (primer plano / fondo)
Qué tocar:
modelo: depth_anything_vitl14.pth
ersión grande y precisa del modelo DepthAnything
mejor calidad en escenas complejas (arquitectura, interiores, etc.)
algo más pesado, pero merece la pena en este caso
resolución: 1024
más alta (1024 o más)
mayor detalle en el mapa de profundidad
mejor coherencia espacial
más consumo de recursos
más baja (512–768)
más rápido
pero pierde precisión en volúmenes complejos
Salida:
IMAGE → ControlNetApply (Depth)
IMAGE → PreviewImage
4️⃣ ControlNetLoader (Canny)
Qué hace: carga el modelo de ControlNet especializado en bordes.
Qué tocar:
controlnet-canny-sdxl-1.0.fp16.safetensors (diffusers/controlnet-canny-sdxl-1.0 at main)
Debe ser compatible con SDXL.
En Pinokio hay que colocarlo en "..\pinokio\api\comfy.git\app\models\controlnet"
Salida:
CONTROL_NET → ControlNetApply (Canny)

5️⃣ ControlNetLoader (Depth)
Qué hace: carga el modelo de ControlNet especializado en profundidad.
Qué tocar:
controlnet-depth-sdxl-1.0.fp16.safetensors (diffusers/controlnet-depth-sdxl-1.0 at main)
Salida:
CONTROL_NET → ControlNetApply (Depth)
6️⃣ CLIPTextEncode (prompt positivo)
Qué hace: convierte el prompt en instrucciones para el modelo.
Qué tocar:
el contenido del prompt. Aquí defines la reinterpretación de la escena.
👉 En este workflow:
futuristic industrial cathedral, large scale industrial facility inspired by gothic architecture, massive metallic structures, pipes, reactors, steel beams, complex machinery integrated into architecture, volumetric fog, steam, dramatic cinematic lighting, dark industrial sci-fi environment, ultra detailedSalida:
CONDITIONING → ControlNetApply (Canny)

7️⃣ CLIPTextEncode (prompt negativo)
Qué hace: Indica al modelo qué debe evitar.
Qué tocar:
👉 En este workflow:
blurry, low quality, watermark, text, logo, artifactsañadir términos si aparecen errores
Salida:
CONDITIONING → ControlNetApply (Canny)
8️⃣ CheckpointLoaderSimple (modelo base)
Qué hace: carga el modelo SDXL base.
Qué tocar:
el checkpoint. En nuestro ejemplo "juggernautXL_v8Rundiffusion.safetensors" (https://civitai.com/models/133005/juggernaut-xl?modelVersionId=782002)
Salida:
MODEL → KSampler
CLIP → CLIPTextEncode
VAE → VAEDecode
9️⃣ ControlNetApplyAdvanced (Canny)
Qué hace: aplica el control de bordes sobre el conditioning inicial.
Qué tocar:
strength: 0.7
start: 0
end: 1
👉 Interpretación:
actúa durante todo el proceso
define la estructura global
Salida:
CONDITIONING → ControlNetApply (Depth)

🔟 ControlNetApplyAdvanced (Depth)
Qué hace: añade el control de profundidad sobre el conditioning ya modificado.
Qué tocar:
strength: 0.5
start: 0
end: 0.7
👉 Interpretación:
influye más al inicio
deja libertad al final
Salida:
CONDITIONING → KSampler
1️⃣1️⃣ EmptyLatentImage
Qué hace: define el lienzo donde se generará la imagen. Habrá que tener en cuenta el tamaño de la imagen de entrada.
Qué tocar:
resolución (en nuestro ejemplo 768 × 1152 )
proporción
Salida:
LATENT → KSampler
1️⃣2️⃣ KSampler
Qué hace: genera la imagen combinando: el modelo base, el doble ControlNet, el prompt y el latente
Qué tocar:
steps: 24
CFG: 6
sampler: euler
scheduler: normal
👉 Ajuste típico:
más steps → más calidad
más CFG → más fidelidad al prompt
Salida:
LATENT → VAEDecode
1️⃣3️⃣ VAEDecode
Qué hace: convierte el latente en imagen visible.
Qué tocar: nada en este flujo
Salida: IMAGE → Save / Preview
1️⃣4️⃣ SaveImage / PreviewImage
Qué hace:
muestra la imagen
la guarda en disco
🎛️ Ajustes clave: cómo controlar el resultado
Una vez que el workflow funciona, el resultado final depende del equilibrio entre tres elementos:
En Multi-ControlNet, este equilibrio es aún más importante que con un solo control, porque ahora tienes varios sistemas influyendo al mismo tiempo
Elemento | Función |
Canny | Mantiene la forma |
Depth | Mantiene el volumen |
Prompt | Define la reinterpretación |
🔁 Cómo ajustar correctamente
1️⃣ Empieza con valores base
Canny: 0.7
Depth: 0.5
2️⃣ Ajusta una variable cada vez. Regla clave:una variable por iteración
3️⃣ Orden recomendado
Canny (estructura)
Depth (volumen)
Prompt (interpretación)
🧪 Casos típicos y cómo corregirlos
Cuando trabajas con Multi-ControlNet (Canny + Depth), los problemas no suelen venir de un solo parámetro. Vienen de un mal equilibrio entre estructura, volumen e interpretación.
Aquí tienes los casos más habituales y cómo corregirlos rápidamente.
Caso | Qué ocurre | Causa probable | Solución |
🔴 Imagen demasiado rígida | Parece un “calco” de la original | Canny y Depth demasiado altos | Bajar Canny (0.7 → 0.6) o Depth (0.5 → 0.4) |
🔴 Imagen plana | Falta sensación de profundidad | Depth demasiado bajo | Subir Depth (0.5 → 0.6) |
🔴 Pérdida de forma | La estructura se deforma | Canny demasiado bajo | Subir Canny (0.7 → 0.8) |
🔴 Resultado caótico | Elementos incoherentes | Prompt poco claro o conflicto entre controles | Simplificar prompt |
🔴 Volumen incorrecto | Perspectiva rara o poco realista | Depth mal interpretado o resolución baja | Subir resolución del depth (ej. 1024) |
🔴 Demasiado detalle en bordes | Exceso de líneas | Canny demasiado sensible | Subir low/high en Canny |
🔴 Resultado poco industrial | No se transforma lo suficiente | Prompt débil | Reforzar conceptos industriales |
🔴 Resultado inconsistente entre pruebas | Difícil reproducir resultados | Cambios múltiples simultáneos | Ajustar una variable por iteración |
Si algo no funciona: 1️⃣ Revisa Canny (estructura)2️⃣ Revisa Depth (volumen)3️⃣ Revisa el prompt4️⃣ Ajusta solo una variable, y vuelve a probar
🔁 Qué puedes probar a continuación
Una vez que entiendes cómo combinar Canny + Depth dentro de un workflow Multi-ControlNet, el siguiente paso es experimentar de forma controlada.
Prueba | Qué hacer | Qué vas a observar |
🧪 Cambiar la imagen base | Probar con otras arquitecturas, interiores o ciudades | Cómo cambia la interpretación manteniendo estructura y volumen |
🎛️ Ajustar Canny | Probar valores: 0.6 / 0.7 / 0.8 | Diferencias en fidelidad estructural |
🌐 Ajustar Depth | Probar valores: 0.4 / 0.5 / 0.6 | Cambios en la sensación de volumen |
🧠 Modificar el prompt | Hacerlo más técnico o más creativo | Cómo cambia la reinterpretación sin perder coherencia |
⚙️ Cambiar resolución | Probar 768×1152 vs 1024×1024 | Impacto en composición y escala |
🔄 Cambiar modelo base | Probar otros checkpoints SDXL | Diferencias en estilo y detalle |

🗺️ Conclusión
En este artículo has dado un paso importante dentro de la serie: pasar de usar un único ControlNet a combinar varios dentro de un mismo workflow,
En cuanto introduces varios ControlNet, todo cambia. Ya no estás dando una única instrucción, estás construyendo una descripción más completa de la escena, en este caso Canny define la estructura, Depth define el volumen y juntos permiten reinterpretar la imagen de forma mucho más coherente.
A partir de ahora puedes:
entender cómo funcionan varios ControlNet en conjunto
construir workflows más ricos y controlados
separar forma y volumen de forma consciente
diagnosticar problemas de estructura vs profundidad
mejorar la coherencia en escenas complejas
Generar imágenes con IA no es cuestión de suerte. Es cuestión de control, y ahora tienes una herramienta más potente para hacerlo.
Si quieres seguir aprendiendo a dominar la IA en local y construir workflows realmente útiles:
🌐 Recursos útiles
🌍 Hugging Face: uno de los mayores repositorios de IA del mundo, donde encontrarás miles de modelos listos para descargar y usar.
🎨CivitAI: plataforma comunitaria donde los usuarios comparten modelos, estilos, LoRAs y nodos específicos para ComfyUI, clasificados por categoría, versión y nivel de complejidad.
Recursos dentro del workflow:
Modelo SDXL: juggernautXL_v8Rundiffusion.safetensors (https://civitai.com/models/133005/juggernaut-xl?modelVersionId=782002)
ControlNet
controlnet-canny-sdxl-1.0.fp16.safetensors (diffusers/controlnet-canny-sdxl-1.0 at main)
ControlNetUnion_XL_ParaTodoControlNEt.safetensors (diffusers/controlnet-depth-sdxl-1.0 at main)
🧠 En Lozkorp:
Descubre el artículo previo donde introdujimos ComfyUI dentro del ciclo “Generación de imágenes con IA en local (IV)”:🔗 Generación de imágenes con IA en local (IV) — ComfyUI
Serie ComfyUI (V) -- Generar imágenes a partir de prompts guardados en un archivo de texto
Serie ComfyUI (VI) — Extraer prompts desde una carpeta de imágenes (WD14 Tagger)
Serie ComfyUI (VII) — Img2Img simple: mejorar o modificar una imagen en local
Serie ComfyUI (VIII) — Upscale de imágenes: qué es, cómo funciona y workflow comparativo
Serie ComfyUI (IX) — Upscale y normalización automática de imágenes
Serie ComfyUI (XI) — Introducción a ControlNet: control real sobre la forma
Serie ComfyUI (XII) — ¿Qué es un LoRA y cómo usarlo en Stable Diffusion?
Serie ComfyUI (XIII) — Multi-LoRA: cómo combinar estilos sin romper la imagen
Serie Comfy-UI (XIV): ControlNet + LoRA: control total de forma y estilo
Serie ComfyUI (XV) — ControlNet + LoRA en FLUX: nuevas opciones para control de forma y estilo
Archivo JSON de este ejemplo 📁 wf_ComfyUI_SDXL_Multi_ControlNet_Canny_Depth_OneImage.json





















Comentarios