Why texture memory is the hidden half of the budget
A 2K PNG might be a few megabytes on disk, but once decoded it occupies roughly 16 MB of GPU memory as uncompressed RGBA — and a model can carry many such textures. On mobile and AR devices, that VRAM pressure causes stutter, thermal throttling, and crashes long before polygon count does.
KTX2/Basis textures stay compressed on the GPU (transcoded to the device's native format — ASTC, ETC2, BCn), so they use a fraction of the memory and upload faster.
What Zlim does
Zlim transcodes a model's textures to KTX2 using Basis Universal (UASTC for high quality, ETC1S for maximum compression), generates the full mipmap chain, and rewrites the glTF to reference them via KHR_texture_basisu. This is applied alongside geometry compression so you optimize the whole budget in one job.
zlim optimize model.glb # textures → KTX2, mipmaps generatedFAQ
Do KTX2 textures need runtime support?
Yes — via the KHR_texture_basisu extension, which model-viewer, three.js, and Babylon.js support. The transcoder picks the device's native GPU format at load.
UASTC or ETC1S?
UASTC for high-fidelity textures (normal maps, detailed albedo); ETC1S for the smallest size on simpler textures. Zlim selects sensible defaults per profile.
Optimize your model now
Start free — 25 optimizations a month. No card required.