Skip to content

Model Compression

This is the default page when you open the app. It supports both single-file and batch modes.

Compression Workflow

① Import the model — click "Choose File" or drag & drop a .glb / .gltf file

After import, Zipoly automatically shows model statistics and a health check (duplicate vertices, oversized textures, missing normals, etc.), along with suggested compression parameters.

glTF / GLB input only

Compression accepts only .glb and .gltf files. Other formats such as FBX or OBJ must first be converted to GLB via Format Conversion.

② Choose the engine

DracoMeshopt (recommended)
Compression ratioHighHigher
Load speedFastFaster (WebGPU-friendly)
Texture compressionJPEG / WebP / KTX2BasisU (ETC1S / UASTC)
Framework supportNative in Three.js / Babylon.js / model-viewerThree.js only (decoder required)
Best forLegacy projects, broad compatibilityNew projects, maximum performance

Not sure which one? Choose Meshopt

If Meshopt is unavailable, Zipoly automatically falls back to Draco with a notice — processing never stalls.

Meshopt compression settings

Meshopt loading limitations

Models compressed with Meshopt cannot be loaded directly by Babylon.js or model-viewer — only Three.js (r136+) is supported. If your project uses either of those frameworks, choose the Draco engine instead.

③ Set the compression level

Default is 7, suitable for most scenarios.

LevelUse case
1–3Engineering / medical models, precision first
4–6Product showcases, architectural visualization
7 (default)General Web3D — the best starting point
8–9Mobile, low bandwidth; minor artifacts acceptable
10Distant decoration; visible geometric distortion

Higher is not always better

Level 10 can shift vertex positions and deform surfaces, producing visible "jaggies" or broken faces. Start with 7, and only step down if you see issues — don't start at the maximum.

④ Start compression — click "Start Optimize"; progress is shown live on the right

Start compression

⑤ Review the result — after compression, check the comparison window. We recommend clicking "Preview" every time to verify the visuals, since unsuitable parameters are best caught by eye.

Compression result comparison

Batch Compression

Enable "Batch Mode" → pick a folder → start. Zipoly recursively scans all .glb / .gltf files in subfolders and supports pause / resume / cancel.

Texture settings in batch mode

Batch mode shares the same parameters as single-file mode, including engine, compression level and texture settings. Confirm the parameters before starting a batch run.

Texture Settings

Click the "Texture Settings" button to configure texture processing.

Draco texture settings

Draco engine: JPEG (best compatibility) / WebP (30% smaller) / KTX2 (GPU-native, best performance)

Meshopt engine: BasisU built-in — pick ETC1S (small size) or UASTC (high quality)

ETC1S for color maps, UASTC for normal/specular maps

ETC1S compresses more aggressively with some loss; UASTC is near-lossless but larger — ideal for detail-critical textures like normal maps and specular maps.

Texture optimization only applies to GLB

If the target format is glTF (textures stored separately), the KTX2 / WebP conversion options under Texture Settings have no effect. Set the target format to GLB when you need texture compression.

Loading Compressed Models in Your Project

Why do I need to configure a loader?

Draco and Meshopt are lossy geometry compression algorithms. Browsers cannot decode them natively — the loader must decode them at runtime. The code below is required.

Draco:

js
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js'

const dracoLoader = new DRACOLoader()
// Recommended: copy the decoder files into your project's public folder (no external CDN dependency)
// cp node_modules/three/examples/jsm/libs/draco public/draco -r
dracoLoader.setDecoderPath('/draco/')

const loader = new GLTFLoader()
loader.setDRACOLoader(dracoLoader)
loader.load('model_optimized.glb', gltf => scene.add(gltf.scene))

Meshopt:

js
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'
import { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js'

const loader = new GLTFLoader()
loader.setMeshoptDecoder(MeshoptDecoder)
loader.load('model_optimized.glb', gltf => scene.add(gltf.scene))

Meshopt + KTX2 textures (configure both):

js
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'
import { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js'
import { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js'

// renderer is your THREE.WebGLRenderer instance
const ktx2Loader = new KTX2Loader()
// Recommended: copy the transcoder files into your project's public folder (no external CDN dependency)
// cp node_modules/three/examples/jsm/libs/basis public/basis -r
ktx2Loader.setTranscoderPath('/basis/')
ktx2Loader.detectSupport(renderer) // detects the KTX2 sub-formats your GPU supports

const loader = new GLTFLoader()
loader.setMeshoptDecoder(MeshoptDecoder)
loader.setKTX2Loader(ktx2Loader)
loader.load('model_optimized.glb', gltf => scene.add(gltf.scene))

Babylon.js and model-viewer users

Both frameworks have built-in Draco support — no extra configuration, just load the file. However, they do not support Meshopt, so compress with the Draco engine for them.

Advanced Quantization Parameters (Draco only)

Click "Advanced Parameters" to fine-tune precision. Most users can keep the defaults.

Draco quantization parameters
ParameterDescriptionRecommended range
Position precision qpVertex coordinate precision — higher means more accurate but larger files8–12
Normal precision qnAffects lighting detail6–10
UV precision qtAffects texture mapping accuracy6–10

Quantization vs. compression level

Quantization parameters are independent of the compression level. If the model is still distorted after lowering the compression level, the quantization precision may be too low — increase qp separately.

Built for Web3D developers