There is a number that tends to clarify the catalog photography debate instantly: 96.
That is how many unique SKU combinations a mid-market sofa generates when it comes in 8 fabrics, 4 leg finishes, and 3 sizes. A traditional photo shoot can cover 4 of them if the budget is generous. The remaining 92 are either photographed with a "close-enough" hero and a colour swatch chip, or they simply do not exist as images.
Shoppers buying the navy velvet version with the walnut legs and the 3-seat configuration are asked to imagine a product they cannot actually see. A meaningful share of them do not buy. A meaningful share of those who do buy return it when it does not match the mental image they constructed.
A 3D configurator solves this completely — but only if you understand what it is actually doing under the hood and where the complexity lives.
What a 3D configurator actually is
The term is overloaded. For our purposes: a 3D configurator is a system that generates a live, interactive product viewer for any combination of product attributes — material, finish, dimension, component — from a single parameterised base model.
The user selects "navy velvet + walnut legs + 3-seat." The system swaps the relevant material and geometry parameters on the base model and serves a viewer for that exact configuration. No pre-rendered image for that combination needs to exist. It is generated on demand.
This is distinct from:
- Static variant images — one photograph per combination, manually produced
- Colour swatch overlays — a CSS filter or canvas composite that tints a static hero image (this is not 3D)
- Lifestyle photography variants — hero shots for hero colours, everything else ignored
A real configurator renders the actual geometry and materials for each combination. The output is indistinguishable from a product-specific shoot — because for all practical purposes, it is one.
The model structure that makes it possible
The key to a scalable configurator is how the base 3D model is structured. A well-authored GLB for configurator use has three layers:
1. Base geometry (shared across all variants)
The underlying mesh — the sofa's foam, frame, and cushion volumes — does not change between fabric variants. It is authored once and loaded once. Geometry variants (arm style, leg height, size) are handled as discrete mesh swaps or morph targets rather than separate files.
2. Material slots (swappable at runtime)
Each surface in the model is assigned to a named material slot. The fabric surfaces reference a slot called upholstery. The leg surfaces reference leg_finish. Changing a variant means replacing the texture set bound to that slot — albedo, normal, roughness, metalness — not reloading the geometry.
{
"materials": [
{
"name": "upholstery",
"pbrMetallicRoughness": {
"baseColorTexture": { "index": 0 },
"roughnessFactor": 0.85
}
},
{
"name": "leg_finish",
"pbrMetallicRoughness": {
"baseColorTexture": { "index": 1 },
"metallicFactor": 0.0,
"roughnessFactor": 0.4
}
}
]
}
This is standard glTF 2.0 — no proprietary extensions needed. Any PBR-capable renderer handles material slot swaps natively.
3. LOD (level of detail) hierarchy
A configurator viewer is interactive: the user will zoom, spin, and inspect close-up. LOD management ensures the full-resolution geometry loads only when needed — a coarse mesh for thumbnails and initial paint, the detail mesh for close inspection. This keeps the configurator snappy even for high-poly industrial or furniture models.
The variant explosion problem, quantified
Let us be specific about how fast the combination count grows:
| Variable | Options | Cumulative combinations |
|---|---|---|
| Fabric | 8 | 8 |
| Leg finish | 4 | 32 |
| Size | 3 | 96 |
| Arm style | 2 | 192 |
| Cushion fill | 2 | 384 |
A sofa with five configurable attributes and modest option counts generates 384 combinations. A traditional photo shoot of all 384 would require 384 physical sofas. No brand does this. So they pick 4–8 hero configurations and hope the rest sells on imagination.
With a configurator, all 384 are rendered on demand. Every combination gets its own viewer, its own still export for product listings, its own OG image if needed. The catalog is complete by construction.
The Meshless approach: encode variants as frame sets
Here is where the architecture becomes interesting. A standard 3D configurator serves real-time WebGL to the browser: the geometry and textures arrive, a renderer parses them, the GPU renders each frame. This is powerful but carries the same performance and IP exposure problems as any WebGL viewer.
Meshless takes a different path. Each variant configuration — upholstery × leg finish × size — is encoded into a WebP frame set at configuration time, not at render time. The encoding runs in your browser; the source geometry never leaves your machine. The output is a set of pre-rendered images covering the full 360° rotation.
What the visitor receives is not a 3D engine. It is a viewer that plays back pre-rendered frames — indistinguishable from real-time rendering in interaction, but with image-gallery performance and zero geometry exposure.
The trade-off is storage: 384 configurations × ~150 frames per rotation × ~40 KB per WebP frame ≈ 2.3 GB of frame data for the full catalog. At CDN pricing (roughly $0.02/GB/month) that is under $50/month for a complete 384-variant interactive catalog. Compare that to a single half-day studio shoot.
For most catalogs, only a subset of combinations exist in inventory at any time. Encoding on-demand — at purchase or at inventory entry — keeps the active frame set to a fraction of the theoretical maximum.
The material authoring workflow in practice
The bottleneck in configurator projects is rarely the rendering infrastructure. It is material authoring — the process of creating production-quality PBR texture sets for each material option.
A fabric variant needs at minimum:
- Albedo map (colour and pattern at the correct scale)
- Normal map (weave or grain surface detail)
- Roughness map (how light scatters across the surface)
Sourcing these from a fabric manufacturer is increasingly common — suppliers provide digital material swatches in glTF-compatible formats. For manufactured finishes like painted metal or lacquered wood, the texture sets can be generated from physical samples using photogrammetry or PBR capture rigs, or licensed from material libraries like Adobe Substance or Quixel.
Once the material library exists, adding a new fabric option to the configurator is a matter of minutes: import the texture set, bind it to the upholstery slot, encode the new variant set, publish. No photographer, no studio, no shipping a physical sample anywhere.
Measuring the lift
The business case for configurators has become measurable enough that it is worth being specific:
Conversion rate: Shoppers who interact with a 3D configurator convert at higher rates than those who view static images — the ability to see the exact combination they are considering reduces purchase uncertainty. The effect is strongest in high-consideration categories (furniture, automotive accessories, footwear, jewellery).
Return rate: Expectation mismatch is the primary driver of returns in configurable-product categories. When the customer has seen the exact configuration they ordered — not a close approximation — the "not what I expected" return shrinks. Furniture brands implementing full-SKU 3D coverage consistently report meaningful return rate reductions.
Catalog velocity: New product introductions no longer require scheduling a shoot. A new fabric option is live in the configurator the day the texture set is finalised — weeks before the physical inventory arrives, which enables pre-order and demand testing.
Getting started without rebuilding your stack
Adding configurator capability to an existing Meshless integration does not require a new infrastructure project. If you already have a .glb with named material slots:
- Prepare your material library — gather PBR texture sets for each material option. If you are working with a supplier, ask for Substance or glTF-native formats.
- Parameterise the base model — ensure your GLB uses named material slots rather than baked-in textures per variant. If your current model is baked, a 3D artist can restructure it in Blender in a few hours.
- Encode each variant — upload each material configuration to the Meshless dashboard and encode its frame set. This is a browser operation; no server setup needed.
- Build the selector UI — a set of buttons or swatches that map user selections to the correct viewer embed. The Meshless React component accepts a
projectIdprop; swapping variants is a state change.
const VARIANTS: Record<string, string> = {
"navy-walnut": "project_abc123",
"sage-black": "project_def456",
"oat-oak": "project_ghi789",
};
function SofaConfigurator() {
const [fabric, setFabric] = useState("navy");
const [legs, setLegs] = useState("walnut");
const projectId = VARIANTS[`${fabric}-${legs}`];
return (
<>
<MeshlessViewer projectId={projectId} />
<FabricPicker value={fabric} onChange={setFabric} />
<LegPicker value={legs} onChange={setLegs} />
</>
);
}
The variant swap is instant — the next frame set is prefetched in the background as the user browses options, so by the time they click, it is already loaded.
The catalog coverage argument
The most compelling pitch for 3D configurators is not performance or IP protection — it is completeness. Every combination covered. Every purchase decision supported by an accurate visual. No shopper left to imagine.
For brands competing on customisation — and an increasing number of brands are, because it is a meaningful differentiator — the catalog photography problem is not a logistics problem. It is a 3D authoring problem. And that problem is now solved.
Ready to build a configurator? Open the dashboard and start with your base model, or read the quick start to see what the embed looks like in a real product page.