Nodes/ComfyUI-UltraTex/UltraTex Text Encode
ComfyUI Node

UltraTex Text Encode

The node you should type nothing into

By visualbruno·Created 23 days ago·Updated 3 days ago· 46
UltraTex Text Encode
  • clip
  • CONDITIONING
◄text►

An empty text box, on purpose. UltraTex is image-guided: what decides the texture is the reference photo, the mesh geometry and the normal maps - not a sentence. The empty prompt is what the model was trained with, so don't fight it.

So why does this node exist instead of ComfyUI's CLIP Text Encode? One token-count detail, and it only applies to FLUX.1.

The 256 vs 512 thing

FLUX.1's prompt path is two encoders - CLIP-L and T5-XXL - and ComfyUI pads the T5 context out to 256 tokens by default. UltraTex's FLUX.1 LoRA was trained with the T5 context padded to 512. Same weights, different amount of nothing on the end.

The node sets that tokenizer option (t5xxl_min_length, 512), then hands off to ComfyUI's regular text encode. Everything else about it is stock. Pack README is honest that the effect is small - it's a "match the training configuration" change, not a fix for a broken image. But it's free, so use it on the FLUX.1 path.

On the FLUX.2 path this node is a no-op, and the README says so plainly: FLUX.2's context is already 512 tokens there, so the setting changes nothing. Klein's encoder is a Qwen3-8B, not CLIP-L+T5, and it doesn't have this quirk. If you're on Klein, use whichever encode node you like - this one, or plain CLIP Text Encode. The sampler logs a warning if it sees a FLUX.1 context that isn't 512 tokens, which is your clue that you grabbed the stock node by mistake.

Inputs and output

clip is the loaded text encoder - the Qwen3-8B encoder via Load CLIP with type flux2 on the Klein path, or a DualCLIPLoader with clip_l + t5xxl and type flux on the FLUX.1 path. text is the multiline box, default empty, and the tooltip in the schema literally says leave it empty.

Output is CONDITIONING, and it goes into UltraTex Sampler's positive. Leave negative unconnected.

The negative is worth understanding, because connecting it costs you real time. With an empty prompt, the negative and positive conditionings are identical, and the sampler detects that and skips the whole unconditional pass - that's a 2x saving on every single step. Wire up a real negative and you get CFG back, which for FLUX.2 means running real classifier-free guidance at the guidance value (the sampler's tooltip notes UltraTex itself uses 4). On FLUX.1 the guidance value is distilled guidance baked into the model, not CFG, and there's no negative pass at all. Either way: for texturing, the negative prompt has nothing to say. There's no "blurry" to subtract from a bake.

Install

Manager → ComfyUI-UltraTex, or:

cd ComfyUI/custom_nodes
git clone https://github.com/visualbruno/ComfyUI-UltraTex

The pack needs trimesh, moderngl, xatlas and scipy - none of which this node touches, so if only the text path is failing, look at your CLIP loader type instead. The classic mistakes are using type flux for the Qwen encoder (it wants flux2 on the Klein path) and grabbing the FLUX.1 text encoder for a FLUX.2 model.

Gotchas

  • Don't prompt it. "a beautiful anime girl, detailed" changes nothing useful and, on FLUX.2, silently obliges you to run a negative if you also connect one.
  • Type into it anyway? It won't crash. It just gives the sampler a context it wasn't trained to condition on, and UltraTex's training data had empty prompts, so you're asking a paint-by-numbers model to also do word association. If you want a say in the look, change the reference image.
  • The warning line is the tell. If your log says the FLUX.1 context has a token count other than 512, you're on the stock encode node.
CategoryUltraTex

Inputs (2)

NameTypeDefaultDescription
clipCLIP—
textSTRINGLeave empty: UltraTex is image-guided and was trained with empty prompts.

Outputs (1)

NameTypeDescription
CONDITIONINGCONDITIONING—