Export web-ready textures straight from Blender.

Preview and export your scene’s textures as KTX2, WebP or AVIF with settings for each one, optimised for the web.

  • Blender 4.2+
  • KTX2 · WebP · AVIF · PNG
  • Windows · macOS · Linux
  • KTX-Software included
Properties ▸ Scene ▸ Texture Export
The Texture Export panel in Blender's Scene properties: a sofa’s 13 textures at a mix of formats and scales from 1x to .25x, and the details of the selected paisley fabric.
Details of fabric_orm with Select Objects open, listing Brown, Paisley and Stripes, the objects that use it.

Pick a format for each texture.

One scene can mix all four. The glTF gets the matching extension, and each texture is written as its own file next to it, linked by a relative URI.

  • KTX2

    GPU-compressed with Basis Universal, so textures stay compressed in GPU memory too.

    • ETC1S for small files
    • UASTC for quality
    • Codec picked by usage
    KHR_texture_basisu
  • WebP

    Small files that every current browser can decode.

    • Lossy, with a quality setting
    • or lossless
    EXT_texture_webp
  • AVIF

    Usually smaller than WebP at the same quality.

    • Lossy, with a quality setting
    • Written by Blender 5.2+
    EXT_texture_avif
  • PNG

    Lossless, for the textures that need every pixel.

    • Also the fallback if an encode fails
    glTF core

Change settings per texture.

Every texture your objects’ materials use is listed with a thumbnail, its export state and its settings. Filter by visible, selected, renderable or collection, and Select Objects shows which objects use a texture.

  • Texture list rows at 1x, .5x and .25x, with the wood_frame textures just changed to .5x, .25x and .125x and marked for re-export.

    Scale per texture

    Pick 1x, .5x, .25x, .125x or .0625x for each texture. KTX2 sizes are rounded to a multiple of 4 for you.

  • The texture list header showing “1 warning”, with a warning icon on fabric_brown_normal, a normal map set to ETC1S.

    Warnings before you export

    It flags sizes that aren’t a multiple of 4, textures over 4096 px, normal maps set to Colour or sRGB, ETC1S on normal maps, and missing image files.

  • Details of wood_frame_normal after a scale change: estimated size 126.5 KB, GPU 341.3 KB, glTF update needed, last export 568.0 KB.

    Size before you export

    Details shows the estimated file size and GPU memory up front, and the real size once it’s exported.

  • Format, Scale and an unticked Mipmaps checkbox in the texture settings.

    Mipmaps on or off

    Per texture, with the right sampler written to the glTF, so a texture without mips never renders black.

  • Details of fabric_orm: Data, UASTC, linear; inputs Metallic, Occlusion and Roughness; used by the Brown, Paisley and Striped materials.

    Packed maps as one

    An ORM map is listed once, with every input it feeds, and encoded as linear data. Metallic and Roughness from two separate images also show as one row, the way Blender’s glTF exporter combines them.

  • Hashed File Names and Only Export Modified Textures, both ticked.

    Only what changed

    Only Export Modified Textures re-encodes just the textures whose settings changed, were painted, or whose file went missing.

  • The fabric_paisley_color row being renamed in place to paisley-albedo.

    Rename the output

    Double-click a texture to rename the exported file. The source image in Blender keeps its name.

Preview inside Blender.

Turn on Preview on Models and the viewport shows every texture as it will be exported, at its format, codec and scale. Change a setting and see the preview live in Blender. Saving the .blend or exporting a glTF always uses the original images.

Preview off · original textures
Close-up of the sofa’s carved wooden arm and paisley seat cushions in Blender with the original textures: sharp carving and fine fabric detail.
Preview on · every texture at .25x
The same close-up with Preview on Models on and every texture at .25x: the carving on the arm is mostly gone and the paisley pattern is soft.

Built into Blender’s glTF exporter.

Tick Texture Export in the sidebar of File ▸ Export ▸ glTF 2.0. The list follows the exporter’s own Selected, Visible, Renderable and Collection options.

  • Change any texture’s settings right there, or open Edit All… for every texture at once
  • KTX2 encodes run in parallel
  • Untick a texture and it’s left out of the glTF completely
  • If an encode fails, that texture falls back to PNG and the file stays valid
File ▸ Export ▸ glTF 2.0
Blender's glTF export window with the Texture Export section open in its sidebar.
Texture Export
The Texture Export section of the glTF export sidebar: texture list with a warning, and the selected normal map's KTX2 ETC1S settings with the warning to use UASTC.

Why textures live outside the GLB.

The GLB holds the geometry and materials, and each texture is its own file next to it.

  • Load in parallel

    Geometry can render with a placeholder while the big textures stream in. A GLB with embedded textures can’t be parsed until the whole file has downloaded.

  • Cache per file

    Change one texture and only that file is downloaded again, not the whole model.

  • Straight to the GPU

    Each .ktx2 goes directly to KTX2Loader and transcodes in a worker, without first being copied out of the GLB’s buffer.

  • Shared textures load once

    Env maps, atlases and matcaps used by several models are downloaded once.

  • Load on your terms

    Lazy-load textures, serve 1k or 2k per device, or defer materials that aren’t on screen yet.

  • Extra requests are cheap

    HTTP/2 and HTTP/3 send dozens of small files over one connection.

Change a texture without re-exporting the scene.

After an export, the Scene panel tracks the glTF: Up to date, out of date, or N textures to re-encode.

Update glTF re-encodes only what changed and patches the file in place. For a GLB, only the JSON chunk is rewritten and the geometry is copied byte for byte. Then it validates the result.

You only need a full re-export when the scene itself changes.

glTF status
The glTF status box: “glTF: sofa.glb”, “Up to date (13 textures)”, Update glTF and Re-encode Selected buttons, and “Valid”.

Settings saved in the .blend.

Every texture setting is saved in the .blend file, not in your Blender preferences so everyone on the team who opens it exports the same textures.

  • Saved with each image

    Format, scale, codec, quality, mipmaps and output name are stored on the image itself, so they follow it when it’s appended or linked into another .blend.

  • Saved with the scene

    Packed-map settings, the texture folder, Hashed File Names and the glTF export options are stored in the scene.

  • Relative paths

    Texture folders are relative to the .blend or the glTF, so the export works on any machine.

One texture folder for many scenes.

Export several .blend files into one folder. With Hashed File Names, the same image with the same settings gets the same name from any file, so every GLB references one file and one URL.

  • A file’s content never changes under its name, so it can be cached forever
  • Two different images that share a name never overwrite each other
  • Clean Up finds the files no glTF uses any more and moves them to _unused/ or deletes them
  • Only files the add-on wrote are ever touched
assets/models/
  • sofa.glb1.2 MB
  • armchair.glb840 KB
  • footstool.glb310 KB
  • shared-normal-3f9a1c2e.ktx23 GLBs164 KB
  • shared-wood-orm-b71e04d9.ktx23 GLBs92 KB
  • paisley-basecolor-8c2d5f17.webp2 GLBs71 KB
  • fabric-orm-e40b9a63.ktx258 KB
  • wood-basecolor-1d7c33a8.webp84 KB
  • stripes-basecolor-a95e21b0.webp63 KB
  • cushion-normal-5b08e7f4.ktx2118 KB
  • leg-roughness-c63f1a9d.ktx227 KB
  • brass-orm-07da4e15.ktx219 KB
  • stool-basecolor-f2a8b36c.webp46 KB

Works natively in three.js.

GLTFLoader reads WebP and AVIF by itself, and KTX2 with three’s KTX2Loader. The add-on also comes with a three.js plugin that fetches, transcodes and uploads a texture once when several GLBs share it, on WebGL and WebGPU.

load.js
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';
import { SharedTextureCache } from './shared-texture-cache.js';

const ktx2 = new KTX2Loader()
  .setTranscoderPath( '/basis/' )
  .detectSupport( renderer ); // ASTC / BC7 / ETC2 / … for this GPU

const loader = new GLTFLoader()
  .setKTX2Loader( ktx2 )
  .register( SharedTextureCache ); // one texture for every GLB that uses it

const gltf = await loader.loadAsync( 'models/scene.glb' );
// textures load from models/textures/*.ktx2 / *.webp / *.avif

Get Texture Exporter

Get web-ready textures out of every glTF you export from Blender.

  • Use it on all your own machines
  • Lifetime updates inside Blender with your licence key
  • Blender 4.2+
Buy Now

Bundle

Get both add-ons for less

Buy Blender to TSL and Texture Exporter together in one bundle, at a lower price than buying them separately.

Buy the bundle