Un pipeline automatisé de la 3D au concept art dans ComfyUI : blockouts, listes de prompts et tri automatique

Transformez un dossier de captures de blockouts 3D en concept art avec Flux : ControlNet de profondeur, listes de prompts, empilement de prompts, un prompt par objet et tri automatique portrait/paysage, construit de workflows simples jusqu'à un pipeline complet pour la nuit.

Anton Tenitsky13 octobre 202611 min de lectureVersion vidéo plus bas

Ce guide a été traduit de l'anglais par IA et peut contenir des erreurs. Lire l'original.

Quatre accessoires de blockout 3D gris (un fusil, un bouclier, un vaisseau de transport et une caisse) au-dessus des mêmes accessoires rendus en concept art détaillé

C’est le pipeline que j’utilise pour transformer de simples blockouts 3D de Blender en concept art : des dizaines d’accessoires et de personnages, chacun avec sa propre description, dans de nombreux styles, pendant la nuit. C’est aussi l’étape centrale d’un pipeline plus vaste, du blockout au concept art puis au modèle 3D.

Cela fait beaucoup de nodes, je l’ai donc construit par étapes, d’un simple workflow de profondeur jusqu’à la version entièrement automatisée. Chaque étape est utile en soi, et c’est la meilleure façon de comprendre l’ensemble.

Un ensemble de blockouts 3D gris : armes, un bouclier, un vaisseau de transport, un char, des caisses, des robots et des figures de soldats
L'entrée : un ensemble d'accessoires et de personnages en blockout, capturés depuis Blender.

En bref

  • GPU : 12 Go de VRAM au minimum pour Flux, ou utilisez une version GGUF ou un GPU cloud.
  • Profondeur : Depth Anything produit la carte de profondeur ; Flux depth ControlNet à environ 0,7.
  • Flux : guidance 3–3,5, 25 étapes, prompt négatif vide.
  • Automatisation : listes de prompts (Inspire Pack), empilement de prompts et compteurs de boucle qui associent chaque capture à son propre prompt.
  • Tri : une vérification du rapport d’aspect bascule automatiquement la toile entre paysage et portrait.

Vous pouvez essayer le workflow terminé sans rien installer sur RunComfy, déjà configuré, avec environ 15 minutes gratuites : de quoi faire une image ou deux. Tous les workflows, listes de prompts et modèles 3D sont sur mon Patreon, mais rien n’est caché : tout est expliqué ci-dessous.

Étape 1 : de l’image à la profondeur puis à l’image

Le workflow le plus simple. Chargez une capture, redimensionnez-la si elle ne correspond pas à votre taille cible, et passez-la dans Depth Anything. J’ai réglé sa résolution à 1088, ce qui s’applique au côté court de l’image : une capture en portrait n’a donc besoin d’aucun changement à cet endroit.

Workflow ComfyUI avec une capture de deux soldats en blockout et sa carte de profondeur
Capture en entrée, carte de profondeur en sortie.

Vous pouvez rendre une carte de profondeur dans Blender à la place et contourner le node Depth Anything (Ctrl+B). Je ne m’en donne pas la peine : Depth Anything est suffisant, la précision n’est pas critique ici, et cela fait gagner du temps.

ControlNet. La carte de profondeur va dans Apply Flux ControlNet avec un Flux depth ControlNet chargé. La force est le réglage clé. Je la garde à 0,7 ; toute valeur de 0,6 à 0,8 fonctionne. Plus bas, le résultat est flou et trop lâche ; à 1,0, l’image présente des défauts. Avec SDXL, je descends à environ 0,5.

Sampler. Il va dans le XLabs Sampler, pas dans le KSampler standard, qui n’a pas d’entrée pour le conditionnement du ControlNet.

Modèle. J’utilise le modèle Flux dev complet. Avec peu de VRAM, utilisez une version GGUF : la même configuration avec un Unet Loader (GGUF) et un modèle Flux GGUF Q4. La qualité n’en souffre pas beaucoup, et cela tourne plus vite.

Prompt. Le DualCLIPLoader avec les deux encodeurs de texte de Flux, puis le prompt. Flux Guidance de 3 à 3,5 : plus haut, cela pousse davantage le prompt et commence à brûler l’image. Flux ne soustrait pas de prompt négatif comme SDXL, je le laisse donc généralement vide.

Réglages du sampler. Seed en increment (les images sont numérotées 2265, 2266 et ainsi de suite, ce qui facilite le suivi de ce qui a tourné pendant la nuit), 25 étapes. Plus d’étapes, ce sont des rendements décroissants, et au-delà de 50 vous perdez simplement du temps.

Écrire de meilleurs prompts avec un chatbot

Mon premier prompt de test était simplement « sci-fi soldier », et le résultat était laid. Deux corrections rapides l’ont beaucoup amélioré :

  • Mettez « cartoony, stylized illustration » dans le prompt négatif. Cela a un petit effet dans Flux.
  • Demandez à ChatGPT (ou à n’importe quel chatbot) d’étoffer le prompt. J’ai demandé un prompt positif pour un soldat de science-fiction cyberpunk et je l’ai collé. Lisez-le d’abord et retirez tout ce qui est bizarre.
Deux soldats de science-fiction en armure jaune dans un désert, générés à partir du blockout
Avec un meilleur prompt, les soldats du blockout sont devenus bien plus convaincants.
Un soldat en blockout gris à côté du même soldat rendu en armure jaune
Blockout et résultat, côte à côte.

Une remarque sur ce texte de « copyright » que Flux ajoute parfois dans un coin : ce n’est le droit d’auteur de personne. Flux imite des images qui comportaient souvent du texte à cet endroit.

Les images carrées donnent les meilleurs résultats. Je voulais du paysage et du portrait dans ce pipeline parce que beaucoup d’accessoires sont longs ou hauts. Les images très larges donnent parfois à l’accessoire un fin contour ou un cadre. Vous le verrez dans mes résultats ; les images carrées en ont beaucoup moins.

Étape 2 : listes de prompts

La même configuration de profondeur, plus un node Load Single Prompt From File de l’Inspire Pack, qui lit des prompts dans un fichier texte.

Le node Load Single Prompt From File de l'Inspire Pack, avec une note montrant le format de la liste de prompts
Le chargeur de prompts de l'Inspire Pack et le format qu'il attend.

Le format est strict :

positive: item one, properties, colours, weather, etc
negative: blurry, low quality, jpeg artefacts, etc
---
positive: item two, properties, colours, weather, etc
negative: blurry, low quality, jpeg artefacts, etc
  • Gardez positive: et negative: en minuscules. Une majuscule au mauvais endroit fait que le node ne lit rien. Je garde tout en minuscules par sécurité.
  • Le fichier doit se trouver dans ComfyUI/custom_nodes/comfyui-inspire-pack/prompts/ (j’utilise le sous-dossier example). Vous ne pouvez pas le pointer ailleurs.
  • Comptez vos entrées, car le node ne vous le dira pas. Demandez à ChatGPT exactement 10 entrées dans ce format et il vous donnera une liste de ce genre.
  • Après avoir modifié une liste, rechargez ComfyUI (Ctrl+R). S’il utilise encore l’ancien texte, passez à une autre liste, lancez une fois, puis revenez.

Ma première liste s’appelait variable-styles-10-prompts : uniquement des styles, sans aucun objet décrit, de sorte que la même liste fonctionne sur n’importe quel accessoire.

Câblage. Le prompt passe par un node Unzip Prompt (il doit être dézippé). Ce node a aussi besoin qu’une image quelconque soit connectée pour fonctionner, même s’il ne l’utilise pas. Ses propres champs de texte positif et négatif n’apportent rien, laissez-les donc tranquilles.

Le faire défiler. Seule, la liste n’exécute que le premier prompt. Un loop counter de la WAS Node Suite alimente l’index : incrément 1, maximum = le nombre de prompts. Un node d’affichage montre l’index, qui compte de 0 (prompt 1) à 9 (prompt 10). Pour recommencer, mettez reset à true, lancez une fois, remettez-le à false et relancez. Un node d’aperçu de texte montre quel prompt est en cours.

Étape 3 : empilement de prompts

L’empilement de prompts construit un long prompt à partir de plusieurs morceaux avec un node text concatenate : chaque entrée s’ajoute à la chaîne. Dans mon test :

  • Text B : le style, venant de la liste de prompts (par exemple un style « ork » de science-fiction).
  • Text A : le sujet, une longue description d’un robot humanoïde militaire fournie par ChatGPT.
  • Text C : l’arrière-plan, une forêt.

Mettez d’abord la partie la plus importante. Les encodeurs de texte donnent plus de poids aux premiers mots, le sujet (un robot de combat) passe donc avant le style. Cela dit, Flux suit assez bien le prompt dans son ensemble.

Deux robots de combat blancs dans une forêt brumeuse, générés avec un prompt empilé
Un prompt empilé : description du robot, style, puis arrière-plan de forêt.

Pas ma meilleure génération, mais elle suit le prompt. J’en lancerais cinq ou six de plus pour choisir la meilleure, ou je baisserais la force du ControlNet pour plus de liberté. Une fois que vous avez trouvé un style qui vous plaît, affinez le prompt en ajoutant et en retirant des mots.

Étape 4 : un dossier de captures, chacune avec son propre prompt

Maintenant les captures viennent aussi d’un dossier, via Load Image Batch, et le même compteur de boucle pilote à la fois l’index de l’image et celui du prompt. Le prompt 3 va toujours avec la capture 3.

Le node Load Image Batch avec un aperçu d'une capture de blockout d'un couteau
Load Image Batch, avec un aperçu de la capture en cours.

J’avais 18 captures et une liste de prompts d’accessoires de science-fiction avec 18 descriptions correspondantes : le lance-roquettes est l’entrée 1, le fusil automatique l’entrée 2, et ainsi de suite. Réglez le maximum du compteur sur le nombre de captures (je l’avais laissé à 10 par erreur ; il devrait être à 18). Utilisez l’aperçu d’image et l’aperçu de texte pour vérifier que la description correspond à la capture.

Un pistolet-mitrailleur de science-fiction blanc et noir contre un arbre dans une forêt
La capture 3 avec sa description correspondante : un pistolet-mitrailleur.

Le pistolet-mitrailleur est sorti plutôt joli. Il ne remplit pas le cadre, mais les poignées et beaucoup de pièces sont de haute qualité. Cette étape n’a pas de tri portrait/paysage, les captures en portrait sont donc étirées. Si toutes vos images sont en paysage, ou toutes carrées, ce workflow plus simple suffit. J’utilise des workflows plus simples pour beaucoup de travaux.

Étape 5 : trier automatiquement paysage et portrait

Pour mélanger des accessoires hauts et larges, le workflow doit détecter l’orientation de chaque image et dimensionner la toile en conséquence. J’ai construit deux versions.

L’image switch (plus facile à lire). Chaque image est redimensionnée dans les deux sens, en paysage et en portrait. Un node image aspect de la WAS Node Suite sort 1 pour le paysage et 0 pour le portrait, un petit node convertit ce nombre en vrai/faux, et un image input switch choisit l’image correctement redimensionnée. La taille va ensuite à l’Empty Latent Image. L’inconvénient : vous redimensionnez chaque image deux fois et gardez les deux en mémoire.

Le number switch (celui que j’utilise). Au lieu de commuter des images, il commute les nombres : deux number input switches, un pour la largeur et un pour la hauteur, pilotés par la même valeur vrai/faux. Le paysage choisit 1920 × 1088 ; le portrait choisit 1088 × 1920. C’est plus rapide et très robuste, bien que plus difficile à suivre. Même moi, j’ai du mal à le relire après quelques jours d’absence, ce qui explique en partie pourquoi j’ai enregistré cette vidéo.

Des nodes de nombres constants et deux nodes Number Input Switch qui choisissent la largeur et la hauteur selon l'orientation de l'image
Le number switch : l'orientation de l'image choisit la largeur et la hauteur.

Il existe un guide à part qui explique cette astuce de tri à elle seule : trier les images par rapport d’aspect dans ComfyUI.

Le pipeline complet

Le workflow complet combine tout : cartographie de la profondeur, le tri par number switch, le dossier de captures avec sa liste de prompts, et une seconde liste de prompts pour les styles. Chaque partie est simple ; ensemble, elles sont difficiles à suivre, c’est pourquoi je les ai construites séparément.

Avec deux compteurs de boucle, vous pouvez multiplier les variations. Ma boucle d’accessoires parcourait 18 captures, et une liste de couleurs de 54 entrées (18 bleues, 18 vertes, 18 blanches) tournait à côté, de sorte que chaque accessoire a été rendu dans chaque couleur. D’autres matériaux fonctionnent aussi : acier inoxydable, fibre de carbone, « 3D printed » (qui avait l’air de plastique). Pour changer une liste, collez-la dans ChatGPT et demandez, par exemple, de changer le blanc en noir. Il conserve le format.

Par-dessus viennent un champ de style libre (camouflage, motifs à damiers, n’importe quoi) et un champ d’arrière-plan.

Un lance-roquettes de science-fiction bleu posé sur des rochers gris islandais
Le résultat final : le lance-roquettes en bleu, avec un arrière-plan d'Islande.
Une grille du même soldat rendu en de nombreuses variations de couleur et de matériau, dans des déserts et dans la neige
Un blockout, de nombreuses couleurs et matières, le tout issu des listes.

L’utiliser au quotidien :

  • Changez le chemin du dossier vers vos captures et la liste de prompts pour qu’elle corresponde.
  • Réglez les compteurs : avec 10 captures et 3 couleurs, le compteur de styles monte à 30. Lancez pendant la nuit avec dix couleurs et matériaux et vous avez 100 idées au matin.
  • Réglez les valeurs de largeur et de hauteur, y compris sur le node de profondeur, pour des images carrées ou plus petites. Le workflow contient des notes listant de bonnes tailles.
  • Pour tout réinitialiser, mettez le reset des deux compteurs de boucle à true, lancez, puis mettez les deux à false et relancez. Sauter à un prompt précis en milieu de liste est délicat ; pour travailler sur un seul accessoire, j’utilise un workflow plus simple avec seulement cette image et la liste de prompts.

Vitesse : sur ma RTX A5000 de 24 Go de VRAM, une image prend environ 160 secondes (300 quand d’autres modèles devaient d’abord se charger). C’est un temps conséquent, et c’est pourquoi je cherchais à changer de matériel.

Où l’exécuter

Il vous faut au moins 12 Go de VRAM pour Flux. Sur une carte plus petite, utilisez le modèle GGUF, ou faites-le tourner sur un GPU loué ; j’ai ensuite déplacé ce type de travail vers RunPod, comme décrit dans mon introduction à RunPod.

Le lien RunComfy ci-dessus est un lien de parrainage, tout comme mon lien de parrainage RunPod : les nouveaux comptes RunPod inscrits avec Google reçoivent entre 5 et 500 $ de crédit après leurs 10 premiers dollars, et je touche une petite commission.

Voir la version vidéo (29:54)

Tout ce qui précède est aussi dans la vidéo, si vous préférez suivre à l’écran. La vidéo est en anglais.

Questions fréquentes

De quel GPU ai-je besoin pour ce pipeline ?

Au moins 12 Go de VRAM pour Flux. Avec moins de VRAM, utilisez la version GGUF de Flux avec un chargeur GGUF : la qualité n'en souffre pas beaucoup. Sur ma RTX A5000 de 24 Go, une image a pris environ 160 secondes.

Quelle force de ControlNet utiliser pour les blockouts 3D ?

Environ 0,7 avec Flux ; entre 0,6 et 0,8 fonctionne. À 1,0, l'image présente des défauts. Avec SDXL je descends, vers 0,5.

Pourquoi ma liste de prompts n'exécute-t-elle que le premier prompt, ou ne se met-elle pas à jour ?

Une liste de prompts a besoin d'un index venant d'un compteur de boucle pour défiler. Si vous modifiez le fichier texte, rechargez ComfyUI ; s'il utilise encore l'ancien texte, passez à une autre liste, lancez, puis revenez.

Pourquoi mes images larges ont-elles un fin contour ou un cadre autour de l'accessoire ?

Cela vient du format très large, non carré. Les images carrées donnent les résultats les plus prévisibles, mais les accessoires longs comme les lance-roquettes demandent des images larges. Pour du concept art, cela compte rarement.

Anton Tenitsky est artiste 3D avec plus de 15 ans d'expérience en infographie, qui a travaillé avec Nickelodeon, Gameloft, Marvel Rivals et de nombreux autres clients. En savoir plus sur moi

Guides associés