Circular VAE Decode (Texturaizer)
Decode latents into seamless, tileable textures
- samples
- vae
- IMAGE
This is the node that gives away what Texturaizer is actually for underneath the Blender integration: generating textures that tile. A normal VAE decode treats the latent's edges as, well, edges - the generated image has a left side and a right side that have no idea about each other. Wrap a texture like that onto a 3D mesh's UVs and you get a visible seam wherever the edges meet. Circular VAE Decode fixes that at decode time by padding the convolution circularly instead of the usual zero-padding, so pixels near one edge factor in what's happening at the opposite edge - the output image tiles cleanly when repeated.
How it works
Standard convolutional decoding pads the edges of each feature map with zeros before the convolution kernel slides over them, which is exactly why the output has a seam: the model has no information about what's "beyond" the edge, so it doesn't try to make the edges match. Circular (a.k.a. "wrap") padding instead pads each edge with pixels copied from the opposite side, so the convolution genuinely sees the image as continuous - left wraps into right, top wraps into bottom. Run the whole VAE decode with that padding mode and the resulting image tiles seamlessly when you repeat it, which is exactly what you want for a material texture headed onto a 3D surface rather than a single standalone image.
The inputs and outputs that matter
samples- the latent to decode, same as any VAE Decode node.vae- the VAE model to decode with.tiling- an enum:enable,x_only,y_only, ordisable. This is the one field that actually matters here.enablewraps both axes for a texture that tiles in every direction;x_onlyory_onlywraps a single axis, useful for something like a seamless horizontal band or a vertical repeat where the other axis genuinely has a top and bottom;disablefalls back to a normal decode when you don't need tiling at all and just want this node to behave like the stock one.
Output is a single IMAGE, same shape as any VAE Decode output - save it, preview it, or feed it straight into whatever texture pipeline picks it up on the Blender side.
Installing it
ComfyUI Manager → search Texturaizer → Install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/LatentSpaceDirective/ComfyUI-Texturaizer
then restart ComfyUI. No extra models or dependencies - it decodes with whatever VAE you're already using, just with a different padding mode under the hood.
Where people get burned
Tiling only works if the content of the image cooperates, not just the edges - a texture with a clear directional light source, a single obvious focal object, or strong asymmetric composition will still tile without visible seams but will look obviously repeated the moment you tile it more than once or twice, because the content itself doesn't read as tileable even when the pixels technically wrap. That's a prompting and composition problem, not something this node can fix for you - think flat, evenly-lit, pattern-like material references (the kind of thing you'd actually put in a texture library) rather than a scene with a clear "up." And don't forget tiling defaults matter: leaving it on disable gets you a perfectly normal decode with none of the wrap behavior, so if your output has the seam you were trying to avoid, check this dropdown before assuming the model itself is the problem.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| samples | LATENT | — | |
| vae | VAE | — | |
| tiling | COMBO | 4 options: enable, x_only, y_only, disable |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |