← Back to project

3D Tokenizer Quality: SS + SLAT, and the codes-vs-cells law

All three discrete tokenizers (sparse-structure, shape, texture) on the frozen TRELLIS.2 VAE — and why each modality wants a different way to spend its token budget · 2026-06-25
tokenizer3dsparse-structuretexturegeometryvqconvnextcodes-vs-cellsdecode-loss

TL;DR

The full 3D-token vocabulary is now three discrete tokenizers on the frozen TRELLIS.2 representations: SS (sparse structure / "where"), shape and texture SLAT ("what", on the structure). The headline finding: the two modalities want opposite ways to spend tokens.

1 · The three components & the budget question

A 3D object is generated coarse-to-fine: SS (a 64³ occupancy → defines which voxels exist) → shape/texture SLAT (32-ch features on those voxels). For a VLM to read & write 3D as tokens, each stage is its own discrete tokenizer. Per-object budget today: SS ≈ 1728 + shape 2048 + texture 2048 ≈ 5.8k tokens (≈ a high-res image).

For every tokenizer the same question arises: given N tokens, how do you arrange them in 3D? Two knobs:

2 · The codes-vs-cells law (the key finding)

Same total bit budget, two ways to spend it — and the right choice flips by modality:

Intuition: cells buy spatial precision (where), codes buy descriptive richness (what). SS needs "where" → cells; SLAT needs "what" → codes. The two are mirror images.
Left: SS gains hugely from more spatial cells (8³→16³: 0.55→0.96 occ-IoU). Right: SLAT, at matched ~2048 tokens, is better with more codes/cell (8³×4) than more cells (13³×1). Opposite preferences.

3 · SS tokenizer (the new third component)

The SS latent is already dense (8, 16,16,16) — so the tokenizer is a plain dense 3D-conv VQ-VAE (no densify, no occupancy channel). The decode-space metric is occupancy: decode the recon latent through the frozen SS decoder → 64³ occupancy, compare to the GT-latent decode.

Measure at the right resolution. The pipeline never uses the 64³ occupancy directly — it max-pools 2× to 32³ to get the SLAT coordinates (verified in the TRELLIS pipeline code). occ-IoU@64 is brittle (a 1-voxel surface shift tanks it); occ-IoU@32 is what matters, and it's much higher.
SS config (full 490K, convnext, 32³-supervised)tokensocc-IoU@64occ-IoU@32 (what SLAT uses)
8³ grid (1 code/cell)512~0.550.76
12³ grid (1 code/cell)17280.88
16³ grid (2 codes/cell)81920.960.98

1728 tokens (12³) is the VLM-affordable sweet spot at occ-IoU@32 ≈ 0.88. Near-lossless (0.98) needs 8192 tokens — too many for the VLM, and unnecessary once you measure at 32³.

SS reconstruction at 32³ (the SLAT resolution), held-out, depth-shaded projection (front|side): GT | 10³ 1000tok | 12³ 1728tok | 16³ 8192tok.

4 · SLAT winner: 8³ × n_groups=4 + ConvNeXt

Applying the codes-vs-cells law to SLAT: keep the 8³ grid, scale tokens via codes/cell (n_groups), and use the more-expressive ConvNeXt blocks (conv + per-voxel MLP, like TRELLIS's own SLAT VAE). At matched 150K data / 20k steps:

SLAT config (150K/20k)mechanismtokenstex feat-L1shape feat-L1
8³ × ng4, ConvNeXtcodes20480.41370.3990
13³ × ng1, ConvNeXt (grid)cells21970.44350.4529
8³ × ng2, conv (old prod)codes10240.44960.4682
old full-data baselinecodes10240.4188 (420K)0.4381 (590K)
The 8³×ng4 ConvNeXt config at 150K already beats the old VQ-1024 at full data (tex 0.414<0.419, shape 0.399<0.438). Now scaling it to full data + the decode-space loss for the final checkpoints.

Caveat: the 8³ config (34M params) is ~10× bigger than the grid config (3.5M), so "codes win" is partly confounded by capacity; and the grid path also pays an interpolation cost. But the 8³×ng4 config beating the old full baselines makes it the practical winner regardless.

Shape SLAT held-out (normal maps): GT | VQ-1024 (1024 tok) | 8³×ng4 ConvNeXt (2048 tok). Decoded latent-L1 2.21 → 1.97.

5 · Decode-space loss (carries over)

On top of the latent base, each component matches the frozen decoder's output, not the latent:

All decode-space losses lower decoded-output error while raising latent-fidelity metrics (occ-IoU/feat-L1) — that's the expected signature: the loss moves the latent off "best latent reconstruction" toward "best decoded output". Judge on the decode metric + renders.

6 · Final recipes (scaling to full data now)

componentlatentconfigtokensdecode losskey held-out metric
SS (structure)dense (8,16³)12³ grid · ng1 · ConvNeXt · more cells1728occ-BCE @32³occ-IoU@32 0.88 ✅ full
Shape (geometry)sparse SLAT 32³8³ · ng4 · ConvNeXt · more codes2048geom-decode L1geom-dec 1.539 (was 1.713, −10%) ✅ full
Texturesparse SLAT 32³8³ · ng4 · ConvNeXt · more codes2048material-L1material-L1 0.0993 (was 0.1241, −20%) ✅ full
All three components are now full-data final checkpoints. The new SLAT config (8³×ng4 ConvNeXt + decode-loss) beats the previous VQ-1024 production: texture material-L1 0.1241 → 0.0993 (−20%), shape geom-decode 1.713 → 1.539 (−10%). One law, two opposite answers: SS spends its budget on cells (where), SLAT on codes (what).
Final texture (held-out, envmap render): GT | old VQ-1024+material (1024 tok) | new 8³×ng4+material (2048 tok). material-L1 0.1241 → 0.0993.
Final shape (held-out, normal maps): GT | old VQ-1024+geom (1024 tok) | new 8³×ng4+geom (2048 tok). geom-decode L1 1.713 → 1.539.

7 · Notes &amp; open

8 · Held-out generalization & FSQ-vs-VQ (merged from the v1 FSQ→512 report, 2026-06-22)

The discrete tokenizer generalizes to held-out assets — the prerequisite for VP1 (a 3D-literate VLM): compress any TRELLIS.2 asset to a few hundred tokens/modality and decode back a faithful mesh + PBR on assets never seen during tokenizer training.
repo weikaih04/slat-tokenizer · all comparisons same held-out assets · frozen decoders from TRELLIS.2 (2512.14692) · 2026-06-25