[00] · LEADERBOARD

Us vs the free tools. Losses included.

SpatialPack, gltf-transform optimize and gltfpack -cc run at defaults over all 103 assets of the Khronos glTF-Sample-Assets corpus. One identical render harness scores every tool's output against the original. Every asset where a free tool beats us is published below — no cherry-picking, no excluded rows.

corpus assets
103
median gz reduction (us)
81.5%
wins / losses (worst pairing)
80W · 21L
our crashes
0
[01] · FULLCORPUS

Full-corpus medians.

ToolCompletedCrashesMedian gz reductionMedian ΔE94Median SSIMVisible-change assetsMedian wall ms
SpatialPack103/103081.5%0.140.997861654
gltf-transform103/103020.9%0.060.999321032
gltfpack103/103017.2%0.050.999526
gltfpack -tc103/103068.2%0.280.99253434

gz reduction = gzip -9 of the whole GLB vs the original. ΔE94/SSIM measured against the ORIGINAL asset — lower ΔE94 / higher SSIM means closer to the source. Tools trade size against fidelity differently: SpatialPack's web-mobile preset re-encodes textures (smaller, more visual change); gltfpack's default leaves textures untouched (larger, near-zero visual change). Read size and quality columns together.

[02] · WIN / LOSS

Win / loss pairings.

PairingWe winWe loseTie (≤1%)Excluded (crash)
SpatialPack vs gltf-transform90940
SpatialPack vs gltfpack832000
SpatialPack vs gltfpack -tc802120
[03] · WHERE WE

Where we lose.

AssetCohortBeaten byOur gz kBTheir gz kBMarginOur ΔE94Their ΔE94
DispersionTestlow-poly / untexturedgltfpack -tc328.3136.9−58.3%0.040.88
SimpleInstancinglow-poly / untexturedgltfpack3.81.7−54.2%00.01
MetalRoughSpheresNoTextureshigh-poly / untexturedgltfpack34.318.8−45.3%2.010.09
TransmissionTestlow-poly / textured-pbrgltf-transform183.4110.7−39.6%0.050.11
AnimatedColorsCubelow-poly / untexturedgltfpack2.31.4−38.5%0.450
AnimatedMorphCubelow-poly / untexturedgltfpack2.41.5−37.2%0.030
UnlitTestlow-poly / untexturedgltfpack1.30.8−34.6%00
TransmissionOrderTestmedium-poly / textured-pbrgltf-transform173.4116.1−33.1%0.970.06
CompareSpecularmedium-poly / textured-pbrgltfpack -tc337.6244.1−27.7%0.080.42
SheenTestGridmedium-poly / textured-pbrgltfpack10.37.9−23.3%0.020.02
TransmissionThinwallTestGridmedium-poly / textured-pbrgltfpack10.17.8−22.7%0.010.02
EmissiveStrengthTestlow-poly / textured-pbrgltfpack2.41.9−22.4%0.060.03
RiggedFiguremedium-poly / untexturedgltfpack8.87−20.6%0.010.01
OrientationTestlow-poly / untexturedgltfpack6.95.5−19.2%15.620.02
IORTestGridmedium-poly / textured-pbrgltfpack14.812−18.8%0.060.06
CompareSheenlow-poly / textured-pbrgltfpack -tc344.9281.2−18.5%0.080.39
MetalRoughSpheresmedium-poly / textured-pbrgltfpack467.4382.4−18.2%0.10.06
MorphPrimitivesTestlow-poly / untexturedgltfpack -tc32.727.3−16.4%0.190.18
ClearCoatCarPaintmedium-poly / textured-pbrgltfpack -tc1916.5−12.9%0.090.21
BrainStemmedium-poly / textured-pbrgltfpack283.9250−11.9%0.030.03
Foxmedium-poly / textured-flatgltfpack4238.3−8.8%0.030
DiffuseTransmissionTestlow-poly / textured-pbrgltfpack21.519.7−8.2%0.050.02
RiggedSimplelow-poly / untexturedgltfpack2.22.1−4.7%0.020.02
Boxlow-poly / untexturedgltfpack0.80.8−4.2%00
RecursiveSkeletonsmedium-poly / untexturedgltf-transform13.513.1−2.7%0.050.01
GlamVelvetSofahigh-poly / textured-pbrgltfpack -tc376.4370.3−1.6%0.070.53

A loss = the best non-crashed rival output is >1% smaller (gzip) than ours on that asset. Quality columns are shown so you can judge the trade each tool made on that asset.

[04] · COHORT

Cohort medians.

AxisCohortnSpatialPackgltf-transformgltfpackgltfpack -tc
polyhigh1484.1%16.6%35.7%75.1%
polylow3860.2%11.9%11.2%32.9%
polymedium5189.6%31.4%22.4%75.9%
texturetextured-flat1055.7%6.8%6.4%35.5%
texturetextured-pbr7587.6%29.6%17.9%73.9%
texturetextured-photo380.9%27.8%14.8%77.3%
textureuntextured1525%5.7%25.1%31.8%
[05] · EVERY

Every asset.

AssetOriginalSpatialPackgltf-transformgltfpackgltfpack -tc
Box0.60.8 (-35.7%)0.8 (-34.9%)0.8 (-30%)0.8 (-30%)
BoxTextured4.53.3 (27.5%)7.5 (-64.3%)4.8 (-4.9%)6.3 (-37.6%)
Duck95.826.4 (72.4%)47.3 (50.6%)38.1 (60.3%)36.5 (62%)
CesiumMilkTruck236.745.2 (80.9%)170.8 (27.8%)201.7 (14.8%)210.8 (10.9%)
BrainStem992.8283.9 (71.4%)282 (71.6%)250 (74.8%)250 (74.8%)
DamagedHelmet3298.9343.6 (89.6%)2458.6 (25.5%)3131.3 (5.1%)2233.2 (32.3%)
BoxAnimated2.62.1 (18.7%)2.4 (5.7%)2.5 (3.8%)2.5 (3.8%)
Lantern9161.4189.7 (97.9%)9119.4 (0.5%)9061.7 (1.1%)1152.8 (87.4%)
ABeautifulGame29937.12088.9 (93%)16102.1 (46.2%)18243.2 (39.1%)14425.8 (51.8%)
WaterBottle8606.944.3 (99.5%)6977.6 (18.9%)8540.5 (0.8%)777.3 (91%)
Avocado7884.843.6 (99.4%)8523.9 (-8.1%)7871.2 (0.2%)619.9 (92.1%)
Corset12924.3258.1 (98%)14011.7 (-8.4%)12604.4 (2.5%)1531.8 (88.1%)
BoomBox10258.4103.3 (99%)8278.2 (19.3%)10140.2 (1.2%)755.3 (92.6%)
CesiumMan277.964.3 (76.8%)110 (60.4%)179.7 (35.4%)98 (64.7%)
Fox78.842 (46.7%)63.7 (19.2%)38.3 (51.4%)51.1 (35.1%)
RiggedFigure14.38.8 (38.5%)8.8 (38.5%)7 (51.2%)7 (51.2%)
RiggedSimple5.22.2 (57%)2.3 (56%)2.1 (59%)2.1 (59%)
AnimatedMorphCube2.22.4 (-8.5%)2.4 (-8.6%)1.5 (31.8%)1.5 (31.8%)
ClearCoatTest192.859 (69.4%)209.4 (-8.6%)169.3 (12.2%)151.6 (21.4%)
DragonAttenuation4148.81164.2 (71.9%)1385.7 (66.6%)1279.2 (69.2%)1307.5 (68.5%)
IridescenceLamp3743.6102.9 (97.3%)4605.8 (-23%)3582.6 (4.3%)818.5 (78.1%)
TransmissionTest864.7183.4 (78.8%)110.7 (87.2%)152.6 (82.4%)200.3 (76.8%)
MetalRoughSpheres4904.5467.4 (90.5%)1126 (77%)382.4 (92.2%)391.1 (92%)
NormalTangentTest1630.348.9 (97%)2174.4 (-33.4%)1581.3 (3%)350.4 (78.5%)
OrientationTest9.16.9 (25%)7.2 (20.9%)5.5 (39.3%)5.5 (39.3%)
TextureCoordinateTest84.2 (47.1%)7 (12%)7.3 (8%)8.6 (-7.4%)
ToyCar4365.9694.2 (84.1%)2778.3 (36.4%)2182.6 (50%)921.2 (78.9%)
AntiqueCamera16674.5404.6 (97.6%)20238.2 (-21.4%)16452.2 (1.3%)3095.3 (81.4%)
CommercialRefrigerator6338.71156.3 (81.8%)2841.9 (55.2%)2710 (57.2%)3057.2 (51.8%)
ChronographWatch5876.81088.1 (81.5%)6682.1 (-13.7%)3979 (32.3%)2036.7 (65.3%)
MaterialsVariantsShoe7323378 (94.8%)2709.2 (63%)6996.8 (4.5%)2854.5 (61%)
BarramundiFish12123.6180.2 (98.5%)13175.2 (-8.7%)12053.6 (0.6%)1327.9 (89%)
GlamVelvetSofa3043.8376.4 (87.6%)3120.5 (-2.5%)2974.3 (2.3%)370.3 (87.8%)
ChairDamaskPurplegold1879.1368.9 (80.4%)555.5 (70.4%)1718.7 (8.5%)519.6 (72.3%)
SheenChair3721.4619.8 (83.3%)4156.6 (-11.7%)3079.6 (17.2%)725.1 (80.5%)
SpecularSilkPouf3585.8513.3 (85.7%)3097.3 (13.6%)2485.6 (30.7%)510 (85.8%)
IridescenceAbalone9052.4465.9 (94.9%)5693.6 (37.1%)8948.9 (1.1%)1570.8 (82.6%)
IridescenceSuzanne43654.3 (87.6%)581.7 (-33.4%)405.3 (7%)177.9 (59.2%)
IridescentDishWithOlives5112.1285.5 (94.4%)6758.6 (-32.2%)4820 (5.7%)1334.8 (73.9%)
DispersionTest827.4328.3 (60.3%)266 (67.8%)141.5 (82.9%)136.9 (83.4%)
AttenuationTest33.920.2 (40.6%)29.9 (11.8%)33.2 (2.1%)23.8 (29.9%)
EmissiveStrengthTest22.4 (-17.7%)2.1 (-3.6%)1.9 (8.6%)2.4 (-20.4%)
AnisotropyBarnLamp7504183.7 (97.6%)10247 (-36.6%)7280.1 (3%)1254.5 (83.3%)
ScatteringSkull6386.2670 (89.5%)3185.9 (50.1%)2571.7 (59.7%)1004.5 (84.3%)
PotOfCoals3214.5408.5 (87.3%)3054.3 (5%)2676.6 (16.7%)2457.4 (23.6%)
ClearCoatCarPaint7919 (76%)54.2 (31.4%)51.5 (34.7%)16.5 (79.1%)
ClearcoatWicker1232.4118.2 (90.4%)1925.5 (-56.2%)1204.9 (2.2%)235.4 (80.9%)
GlassVaseFlowers1713.1141 (91.8%)1562.3 (8.8%)1625.6 (5.1%)432.7 (74.7%)
GlassBrokenWindow1019101.9 (90%)436.8 (57.1%)1007.8 (1.1%)303.5 (70.2%)
GlassHurricaneCandleHolder2588.127.7 (98.9%)3235.9 (-25%)2543.5 (1.7%)446.9 (82.7%)
DiffuseTransmissionPlant4954.11002.3 (79.8%)2838.7 (42.7%)3899.4 (21.3%)1574.2 (68.2%)
DiffuseTransmissionTeacup2466.7165.9 (93.3%)2993.6 (-21.4%)1789.9 (27.4%)1025.9 (58.4%)
MosquitoInAmber23133.4737.9 (96.8%)10976.3 (52.6%)22663.4 (2%)6007.2 (74%)
SunglassesKhronos267.451.9 (80.6%)125.1 (53.2%)121.1 (54.7%)55.8 (79.1%)
CarbonFibre378.532.7 (91.4%)687.9 (-81.7%)335.8 (11.3%)85.9 (77.3%)
MorphStressTest202.911.8 (94.2%)200.7 (1.1%)171.9 (15.3%)47.1 (76.8%)
MorphPrimitivesTest3332.7 (1.1%)34.4 (-4.2%)33.3 (-0.6%)27.3 (17.3%)
RecursiveSkeletons30.213.5 (55.4%)13.1 (56.6%)22.8 (24.5%)22.8 (24.5%)
CarConcept8681.31660.1 (80.9%)5839.1 (32.7%)4037.3 (53.5%)2048.7 (76.4%)
SheenWoodLeatherSofa5021.6979.1 (80.5%)1187 (76.4%)3664.3 (27%)3664.3 (27%)
PotOfCoalsAnimationPointer4767.1417.7 (91.2%)3347.8 (29.8%)4226 (11.3%)2506.9 (47.4%)
USDShaderBallForGltf913.7135.8 (85.1%)361 (60.5%)361.9 (60.4%)169.4 (81.5%)
LightsPunctualLamp3973.8207.1 (94.8%)4168.9 (-4.9%)3839.9 (3.4%)1100.2 (72.3%)
CompareAlphaCoverage3766.3375.7 (90%)4355 (-15.6%)3766 (0%)841 (77.7%)
CompareAmbientOcclusion3811.6605.3 (84.1%)1494.3 (60.8%)1498.7 (60.7%)1290.8 (66.1%)
CompareAnisotropy805.197.1 (87.9%)233.3 (71%)285.7 (64.5%)157 (80.5%)
CompareBaseColor625.238.7 (93.8%)568.5 (9.1%)400.9 (35.9%)88.7 (85.8%)
CompareClearcoat57.313.1 (77.1%)40.3 (29.6%)43.4 (24.2%)37 (35.5%)
CompareDispersion18.25.5 (69.7%)14.1 (22.6%)17.7 (2.6%)14.6 (19.7%)
CompareEmissiveStrength37.810.8 (71.3%)22.3 (40.9%)24.4 (35.5%)24.8 (34.4%)
CompareIor71.116.5 (76.8%)51.2 (27.9%)57.3 (19.3%)51.7 (27.3%)
CompareIridescence74.517.4 (76.7%)56.2 (24.6%)61.1 (17.9%)57.5 (22.7%)
CompareMetallic70.813.8 (80.6%)47.1 (33.5%)57.5 (18.9%)46.8 (33.9%)
CompareNormal159.739.7 (75.1%)71.8 (55%)106.4 (33.4%)80.3 (49.7%)
CompareRoughness49.312.5 (74.6%)32.9 (33.3%)36 (27%)35.1 (28.8%)
CompareSheen759.8344.9 (54.6%)410.9 (45.9%)746.4 (1.8%)281.2 (63%)
CompareSpecular1273.9337.6 (73.5%)1079.1 (15.3%)1134.5 (10.9%)244.1 (80.8%)
CompareTransmission207.115.5 (92.5%)98.8 (52.3%)75.7 (63.4%)81.7 (60.5%)
CompareVolume234.216 (93.1%)77.4 (66.9%)93.6 (60%)109.5 (53.2%)
AnisotropyDiscTest153.118.7 (87.8%)434 (-183.5%)134.9 (11.9%)78.5 (48.7%)
AnisotropyRotationTest636.4165.6 (74%)387.6 (39.1%)504 (20.8%)173.7 (72.7%)
AnisotropyStrengthTest37.712.2 (67.8%)37.2 (1.3%)17.1 (54.5%)12.4 (67.2%)
DiffuseTransmissionTest6221.5 (65.4%)32.3 (47.9%)19.7 (68.2%)21.3 (65.7%)
IORTestGrid636.214.8 (97.7%)15.9 (97.5%)12 (98.1%)12.6 (98%)
SheenTestGrid467.710.3 (97.8%)9.7 (97.9%)7.9 (98.3%)8.5 (98.2%)
SpecGlossVsMetalRough9620.9317.2 (96.7%)11032.7 (-14.7%)9554 (0.7%)1596.8 (83.4%)
SpecularTest121.535.4 (70.9%)52.2 (57%)44 (63.8%)36 (70.4%)
TransmissionOrderTest810.3173.4 (78.6%)116.1 (85.7%)136.9 (83.1%)169.2 (79.1%)
TransmissionRoughnessTest170.431.3 (81.6%)56.8 (66.7%)62 (63.6%)36 (78.9%)
TransmissionThinwallTestGrid296.710.1 (96.6%)9.5 (96.8%)7.8 (97.4%)8.4 (97.2%)
UnlitTest1.11.3 (-14.5%)0.9 (16.8%)0.8 (25.1%)0.8 (25.1%)
AlphaBlendModeTest2873.1224.5 (92.2%)1932.7 (32.7%)2871.5 (0.1%)1501.6 (47.7%)
MultiUVTest26.210.5 (60%)32.6 (-24.8%)26 (0.7%)28.7 (-9.9%)
NormalTangentMirrorTest1417.740.5 (97.1%)2181.5 (-53.9%)1355.7 (4.4%)348.7 (75.4%)
TextureEncodingTest11.811.1 (5.5%)18.1 (-54%)11.3 (4.2%)22.6 (-92%)
TextureSettingsTest27.413.3 (51.4%)23.1 (15.6%)26.1 (4.8%)17.6 (35.9%)
TextureTransformMultiTest308.444 (85.7%)303.6 (1.5%)277.1 (10.1%)85.3 (72.3%)
AnimatedColorsCube3.32.3 (29.6%)2.2 (34.2%)1.4 (56.7%)1.4 (56.7%)
AnimationPointerUVs3138.5441.6 (85.9%)3917.9 (-24.8%)2435.3 (22.4%)757 (75.9%)
InterpolationTest3.13.9 (-24.6%)4.7 (-48.6%)4.5 (-41.6%)7.6 (-140.4%)
SimpleInstancing23.8 (-93.8%)4.5 (-131.4%)1.7 (11.2%)1.7 (11.2%)
MetalRoughSpheresNoTextures115.834.3 (70.4%)741.1 (-539.7%)18.8 (83.8%)18.8 (83.8%)
BoxVertexColors0.50.6 (-18.3%)0.7 (-38.8%)0.7 (-37%)0.7 (-37%)
[06] · METHODOLOGY

Methodology, precisely.

Pipelines (exact commands)
  • SpatialPack SpatialPack (web-mobile preset, defaults); textures: WebP (KTX2 chain falls back to WebP without toktx installed)
  • gltf-transform gltf-transform optimize (defaults), @gltf-transform/cli@4.4.0; textures: auto (re-encodes in original format, max 2048px)
  • gltfpack gltfpack -cc, native v1.1 release binary; textures: original textures untouched
  • gltfpack -tc gltfpack -cc -tc (KTX2/BasisU textures), native v1.1 release binary; textures: KTX2 BasisU (ETC1S) supercompression
Versions

spatialpack 0.1.0 (git 89ce61f) · @gltf-transform/cli@4.4.0 (reports 4.4.0) · gltfpack 1.1 (native meshoptimizer release binary; the npm build ships without KTX2/WebP encoders) · node v25.9.0 · darwin arm64 · toktx installed: false — so SpatialPack's KTX2 chain fell back to WebP in this run, exactly as it does for users without toktx.

Corpus

All 103 assets of the SpatialPack seed corpus, vendored from Khronos glTF-Sample-Assets (per-asset licenses in the repo). Nothing excluded; tool crashes are recorded and counted above.

Quality harness (v2)

ΔE94 mean + SSIM vs the ORIGINAL asset, SpatialPack visual-diff harness (model-viewer 4.0.0 in headless Chromium via Playwright), orbit-8 grid, 1 view, 512x512, deterministic camera (harness v2). Identical harness and identical camera for every tool. Both renders use the same vendored model-viewer + decoders; no tool gets a friendlier renderer. ΔE94 mean > 5 or SSIM < 0.95 vs the original at the benchmark view. Single-view scoring is a coarse signal — it can miss back-face or animated-pose regressions; it is the same coarse signal for every tool.

Camera (changed in v2): harness v2 (2026-06-11): camera-target pinned to the ORIGINAL asset's world-space scene-bounds center (EXT_mesh_gpu_instancing-aware) and orbit radius locked to 1.2x the bounds-sphere fit distance at 35deg FOV — model-viewer auto-framing disabled. v1 auto-framed on base-mesh bounds, which reframed the camera on instanced assets whose quantized outputs legally move the dequant transform into the instance TRS (world-space bounds identical); every tool scored a bogus SSIM 0.56-0.69 on SimpleInstancing. The same fixed camera scores every tool on a given asset.

Render-prep: harness v2: EXT_mesh_gpu_instancing batches are expanded into explicit child nodes (identical world-space placement) in a render-only copy before loading into model-viewer, because three.js computes framing/near/far from geometry bounds without composing instance TRS — a pinned camera otherwise near-clips outputs that store the dequant transform in instance TRS. Applied identically to the original and every tool output; non-instanced files are rendered as-is and the benchmarked artifacts are never modified.

Win/loss rule

win/loss requires >1% gz-size difference; crashed pairings excluded from win/loss and counted separately.

Reproduce

node bench/spec-0157-leaderboard/run.mjs && node bench/spec-0157-leaderboard/aggregate.mjs(SpatialPack bench harness; raw results.json ships with the repo)

Run your own asset through the same pipeline.

The analyzer scores your GLB with the exact harness used above — before/after, no signup.

Analyze a model