MatLoom: Layered Text-to-Material Generation in a Compact Program Space
Organizations: Department of Computer Science and Engineering The Chinese University of Hong Kong Hong Kong, China
Abstract
Material generation should produce not only an appearance, but also the rules that construct it. We introduce MatLoom, a compact, layer-oriented language for text-to-material generation with pretrained language models. Each program composes alpha-masked layers whose shared spatial expressions define coverage and physically based rendering (PBR) channels, making dependencies between patterns, color, and relief explicit. A standalone interpreter evaluates the program into material maps, while the source retains named fields and layer parameters for subsequent authoring. Without task-specific fine-tuning, our pipeline uses parser-guided repair and preview-based critique to revise material designs, then searches noise seeds while keeping each candidate's remaining source fixed. On a curated benchmark of 141 prompts evaluated with six backbones, our best-performing configuration achieves higher mean scores than three diffusion baselines on all four flat-layout prompt-alignment metrics. Its initial programs already exceed all three baselines on mean BLIPScore, before critique or seed search. Retained programs have a median length of 21 lines when pooled across backbones. In a blind four-way comparison involving 30 participants and 20 prompts, our renders receive 59.2% of choices, compared with 19.3% for the most-preferred baseline. Compact executable programs thus offer a way to generate prompt-aligned materials while retaining their construction as part of the asset.
Figures & tables
| Flat | Staged | |||||||
| Method | BLIPScore | CLIPScore | VQAScore | Judge | BLIPScore | CLIPScore | VQAScore | Judge |
| IntrinsiX ( Kocsis et al., 2025 ) | 29.94 | 24.29 | 43.61 | 56.10 | 20.96 | 21.80 | 41.97 | 49.60 |
| MatFuse ( Vecchio et al., 2024 ) | 8.27 | 20.12 | 30.61 | 36.36 | 8.58 | 19.25 | 30.56 | 33.63 |
| StableMaterials ( Vecchio, 2026 ) | 28.57 | 25.66 | 45.36 | 57.41 | 21.33 | 23.59 | 45.53 | 54.29 |
| MatLoom (gemma-4-26b-a4b-it) | 33.56 | 25.46 | 47.12 | 47.48 | 22.07 | 22.48 | 47.43 | 40.17 |
| MatLoom (qwen3.6-35b-a3b) | 35.64 | 25.70 | 46.36 | 45.80 | 21.93 | 22.55 | 46.60 | 37.47 |
| Flat | Staged | |||||||
|---|---|---|---|---|---|---|---|---|
| Stage | BLIPScore | CLIPScore | VQAScore | Judge | BLIPScore | CLIPScore | VQAScore | Judge |
| Round 0 | 48.31 | 27.70 | 53.34 | 61.35 | 30.95 | 24.37 | 52.67 | 52.98 |
| Round 5 | 51.86 | 28.25 | 52.93 | 67.61 | 33.23 | 24.91 | 53.43 | 56.82 |
| Selected | 54.17 | 28.71 | 53.97 | 66.56 | 35.50 | 25.25 | 54.07 | 57.20 |
| Final (full) | 56.06 | 28.80 | 54.71 | 67.01 | 36.14 | 25.30 | 54.26 | 57.34 |
Appendix figures & tables16 assets
Supplementary material from the paper’s appendix.
Appendix
| Work | User conditioning | Generated representation | Execution dependence | Relevant distinction |
|---|---|---|---|---|
| Raster generators ( Vecchio et al., 2024 ; Vecchio, 2026 ; Kocsis et al., 2025 ) | Text; additional modalities vary | PBR raster maps | Renderer consuming the maps | Material appearance without an explicit generative program |
| Conditional MatFormer ( Hu et al., 2023 ) | Text, image, or partial graph | Procedural node graph | Substance ecosystem | Prior text-conditioned procedural synthesis |
| VLMaterial ( Li et al., 2025 ) | Image | Python program constructing a shader graph | Blender API | Learned image-to-program synthesis |
| MultiMat ( Belouadi et al., 2026 ) | Image or unconditional | CompactSBS, a compact YAML graph program | Substance Designer | Intermediate visual feedback and incremental validation |
| MatLayerNet | Text | Layer plans, per-layer parameters, and library-derived masks over PBR maps | MetaGPT multi-agent pipeline with a curated mask-generator library | Prior language-guided substrate, texture, and aging layers ( Cai et al., 2026 ) |
| Material Apprentice ( Gupta et al., 2026 ) | Text; optional reference image; editing instruction | Expert process trace compiled to a shader graph | Blender API | Closest text-to-procedural system, using process retrieval |
| Budget | Mean gain | % of | Runs at best (%) |
|---|---|---|---|
| 18 | 0 | ||
| 48 | 1 | ||
| 67 | 6 | ||
| 75 | 9 | ||
| 85 | 22 | ||
| 94 | 50 |
| Flat | Staged | |||||||
|---|---|---|---|---|---|---|---|---|
| Round | BLIPScore | CLIPScore | VQAScore | Judge | BLIPScore | CLIPScore | VQAScore | Judge |
| 0 | 48.31 | 27.70 | 53.34 | 61.35 | 30.95 | 24.37 | 52.67 | 52.98 |
| 1 | 1.30 | 0.13 | 0.76 | 3.71 | 0.57 | 0.27 | 0.02 | 1.80 |
| 2 | 1.74 | 0.22 | 0.41 | 4.19 | 1.38 | 0.40 | 0.22 | 2.28 |
| 3 | 1.89 | 0.31 | 0.40 | 3.87 | 1.66 | 0.46 | 0.37 | 3.32 |
| 4 | 2.95 | 0.38 | 0.75 | 3.32 | 2.02 | 0.46 | 0.02 | 3.04 |
| Flat | Staged | |||||||
| Program | BLIPScore | CLIPScore | VQAScore | Judge | BLIPScore | CLIPScore | VQAScore | Judge |
| First | 48.31 | 27.70 | 53.34 | 61.35 | 30.95 | 24.37 | 52.67 | 52.98 |
| Selected | 54.17 | 28.71 | 53.97 | 66.56 | 35.50 | 25.25 | 54.07 | 57.20 |
| Last | 51.86 | 28.25 | 52.93 | 67.61 | 33.23 | 24.91 | 53.43 | 56.82 |
| Oracle | 64.80 | 30.01 | 60.71 | 79.24 | 44.48 | 26.31 | 60.42 | 69.07 |
| Win rate | 42.1 | 41.4 | 38.1 | 30.5 | 42.8 | 43.3 | 36.4 | 35.0 |
| Flat | Staged | |||||||
|---|---|---|---|---|---|---|---|---|
| Polished | BLIPScore | CLIPScore | VQAScore | Judge | BLIPScore | CLIPScore | VQAScore | Judge |
| First | 2.22 | 0.17 | 0.49 | 0.64 | 0.23 | 0.08 | 0.33 | 0.27 |
| Selected | 1.54 | 0.12 | 0.22 | 0.13 | 0.17 | 0.04 | 0.09 | 0.59 |
| Last | 1.63 | 0.18 | 0.36 | 0.11 | 1.09 | 0.09 | 0.25 | 0.90 |
| Mean | 1.80 | 0.16 | 0.36 | 0.30 | 0.50 | 0.07 | 0.22 | 0.59 |
| Backbone | Median total (min) | Median polish share (%) | Polish p90 (min) |
|---|---|---|---|
| gemini-3.6-flash | 4.6 | 68 | 5.6 |
| gpt-5.6-luna | 6.3 | 43 | 5.2 |
| gemma-4-26b-a4b-it | 7.7 | 33 | 3.6 |
| glm-5.2 | 10.3 | 27 | 4.7 |
| qwen3.6-35b-a3b | 12.8 | 20 | 3.6 |
| deepseek-v4-flash-0731 | 20.0 | 18 | 7.2 |
| Flat | Staged | |||||||
| Configuration | BLIPScore | CLIPScore | VQAScore | Judge | BLIPScore | CLIPScore | VQAScore | Judge |
| Full (ours) | 51.23 | 27.53 | 50.01 | 56.76 | 32.90 | 24.48 | 49.95 | 47.60 |
| w/o playbook | 4.99 | 0.52 | 1.47 | 0.08 | 4.66 | 0.54 | 1.30 | 1.87 |
| w/o few-shot | 1.06 | 0.32 | 1.60 | 0.69 | 2.53 | 0.18 | 2.06 | 2.40 |
| w/o both | 0.52 | 0.31 | 0.78 | 0.21 | 0.17 | 0.14 | 0.61 | 0.64 |
| w/o render critique | 6.84 | 1.03 | 0.08 | 2.42 | 4.27 | 0.55 | 0.10 | 1.64 |
| Flat | Staged | |||||||
|---|---|---|---|---|---|---|---|---|
| Critic | BLIPScore | CLIPScore | VQAScore | Judge | BLIPScore | CLIPScore | VQAScore | Judge |
| Self (gpt) | 51.23 | 27.53 | 50.01 | 56.76 | 32.90 | 24.48 | 49.95 | 47.60 |
| Gemini | 3.56 | 0.99 | 1.74 | 5.08 | 1.77 | 0.83 | 2.01 | 2.99 |
| DeepSeek | 0.40 | 0.13 | 1.22 | 2.80 | 0.04 | 0.09 | 1.17 | 0.65 |
| GLM | 8.57 | 0.51 | 0.87 | 7.16 | 2.20 | 0.14 | 2.23 | 10.20 |
| Qwen | 5.75 | 0.53 | 1.22 | 4.71 | 4.37 | 0.34 | 1.75 | 2.44 |
| Method | Share of forced choices (%) | Mean fidelity ( – ) |
|---|---|---|
| MatLoom (ours) | ||
| StableMaterials | ||
| IntrinsiX | ||
| MatFuse |
| Prompt source | MatLoom | StableMaterials | IntrinsiX | MatFuse | Rating gap |
|---|---|---|---|---|---|
| GenProc | |||||
| MatSynth | |||||
| StableMaterials | |||||
| text2fabric |
| Method | Backbone | Steps | Guidance | Height map |
|---|---|---|---|---|
| MatFuse | latent diffusion | 50 | 5.0 | ✗ |
| StableMaterials | SD-class LDM + LCM | 4 | 10.0 (LCM) | ✓ |
| IntrinsiX | FLUX.1-dev + LoRA | 28 | 3.5 | ✗ |
| MatLoom (ours) | LLM program | n/a | n/a | ✓ |
| Method | Flat CLIP-IQA | Staged CLIP-IQA |
|---|---|---|
| IntrinsiX | 46.51 | 24.08 |
| MatFuse | 19.39 | 10.68 |
| StableMaterials | 52.17 | 21.27 |
| MatLoom (gemma-4-26b-a4b-it) | 47.51 | 28.95 |
| MatLoom (qwen3.6-35b-a3b) | 44.65 | 28.42 |
| MatLoom (deepseek-v4-flash-0731) | 49.68 | 29.00 |
| BLIPScore | CLIPScore | VQAScore | Judge | |||||
|---|---|---|---|---|---|---|---|---|
| Source ( ) | ours | SM | ours | SM | ours | SM | ours | SM |
| Hu et al. ( ) | 45.12 | 30.30 | 27.53 | 26.12 | 63.50 | 58.39 | 71.43 | 72.59 |
| MatSynth ( ) | 73.72 | 28.46 | 30.83 | 25.05 | 59.04 | 42.69 | 76.30 | 38.82 |
| StableMaterials ( ) | 48.24 | 34.34 | 26.83 | 25.17 | 43.98 | 36.64 | 56.35 | 59.40 |
| text2fabric ( ) | 66.55 | 21.80 | 31.09 | 26.00 | 59.21 | 46.85 | 72.97 | 50.39 |
| Idiom | Use |
|---|---|
| Multi-octave layering | A low-frequency fBm for broad form plus a high-frequency one for fine grain, reused wherever each scale is needed. |
| Anisotropic striation | fBm / Worley with base_freq_x base_freq_y elongates features along an axis (bark, brushed metal). |
| Coordinate-domain warping | Add a noise to a coordinate term before a Sin pattern to turn banding into turbulent stratification, and drive height from the same warped pattern. |
| Micro-gloss grain | A high-frequency, low-amplitude fBm added only to roughness for skin, bark, or stone microstructure. |
| Substrate-matrix-first | Continuous substrate in a bottom Layer(1) , discrete features as upper layers whose thresholded masks let the substrate show through. |