Dicey Table

Material and Texture Fields

Field-by-field reference for the two asset-inspector kinds: a material selection and a texture selection. Both are Project Definitions — not engine components and not Platform panels — so neither carries the tone="engine"/tone="platform" accent the object Inspector's sections do. How to assign a material or texture, and the built-in-vs-project/"editing copies itself" workflow, is Working with materials and Working with textures; this page only documents the fields themselves.

The Material Inspector for the built-in Felt material, showing the NAME/Duplicate row and the ADVANCED, TEXTURE TRANSFORM, DIFFUSE, SPECULAR and EMISSIVE sections

Verified section count: 15, exact match#

The plan estimated 15 material sections. Walking MATERIAL_INSPECTOR_SECTIONS in packages/shared/src/sceneEditor.ts directly: exactly 15 sections — Texture Transform, Ambient, Diffuse, Specular, Emissive, Opacity, Normals, Parallax, Clearcoat, Sheen, Refraction, Iridescence, Environment, Lightmap, Other, in that order, matching PlayCanvas's own StandardMaterial inspector layout. The array itself carries a comment recording the same count, and sceneEditor.test.ts asserts it. No discrepancy to report here.

The Material Inspector#

Selecting a material (project or built-in) renders MaterialInspector (apps/web/src/ui/editor/MaterialInspector.tsx) — the Advanced toggle, then the 15 sections, each a collapsible built from the shared MATERIAL_INSPECTOR_SECTIONS descriptor so the scene Inspector and the Material editor tab render identically from one source. Every field maps ~1:1 onto a pc.StandardMaterial property.

Advanced#

Field Type Default Runtime effect Replicates
Advanced boolean false Reveals every section marked advanced below in full, and the individually-advanced-marked fields inside otherwise-basic sections (see each table). Persisted in localStorage under diceytable.editor.materialAdvanced — browser-wide, not scoped per user the way the panel layout and undo history are. n/a — pure UI state, not part of the document

Four sections — Diffuse, Specular, Emissive, Opacity — start expanded; every other section starts collapsed, regardless of Advanced mode.

What every field row means#

Every material field lives on SceneMaterial.props (MaterialProps in sceneEditor.ts), a Project Definition. It is not TableObjectState, so it is not covered by objectStateEq; an object references a material only by id (metadata.materialId), and that reference — not the material's own props — is what's threaded through the per-object replication system. Below, Replicates always means "part of the scene document's material list," not "a per-object delta field."

Texture Transform

Field Type Range / units Default Runtime effect
Tiling X number unbounded, step 0.1 1 Horizontal UV repeat multiplier across every texture map on this material.
Tiling Y number unbounded, step 0.1 1 Vertical UV repeat multiplier.
Offset X number unbounded, step 0.1 0 Horizontal UV offset.
Offset Y number unbounded, step 0.1 0 Vertical UV offset.

All four apply to every map slot on the material at once, not just the diffuse map.

These four fields are a recolouring tool, not just a tiling knob. When a model's texture is a palette atlas — a grid of flat colour swatches that the mesh's UVs pick one cell from — shifting Offset X/Y moves which cell the whole model samples, and so changes its colour without touching the mesh or the texture. The bundled KayKit materials (KayKit Blue, KayKit Red, KayKit Gold, …) are exactly this: sixteen materials that differ only in their offset into one shared 35 KB atlas. Assign a different one to a KayKit piece and it changes colour at zero download cost. See Working with materials.

Ambient — Advanced section

Field Type Range / units Default Runtime effect
Ambient color hex #rrggbb #ffffff Tint applied to ambient/indirect light on this material, before any AO map is factored in.
AO Map texture slot any project/built-in texture none Ambient-occlusion map — darkens ambient contribution in occluded crevices.
Tint boolean false Whether the Ambient color actually multiplies the AO map, versus the map being used alone.

Diffuse

Field Type Range / units Default Runtime effect
Diffuse color hex #rrggbb #ffffff The material's base/albedo color.
Diffuse Map texture slot any project/built-in texture none Base color texture, multiplied by Diffuse when Tint (below) is on.
Tint (Advanced) boolean true Whether the Diffuse color multiplies the Diffuse Map, or the map is used at full strength alone.
Vertex Color (Advanced) boolean false Multiplies in per-vertex mesh color data, when the mesh carries any.

Specular

Field Type Range / units Default Runtime effect
Use Metalness boolean true Selects the metalness/roughness PBR workflow over the legacy specular-color workflow.
Metalness slider 0–1, step 0.01 0 How metallic the surface is — 0 fully dielectric (plastic, wood, cloth), 1 fully metal. Multiplies the Metalness Map when one is set.
Metalness Map (Advanced) texture slot any project/built-in texture none Per-pixel metalness, read from a single channel (see Metalness Channel).
Metalness Channel (Advanced) select R / G / B / A B Which channel of the Metalness Map holds metalness. Defaults to blue because glTF packs it there.
Gloss slider 0–1, step 0.01 0.5 Surface smoothness — higher is a tighter, sharper specular highlight. Multiplies the Gloss Map when one is set. Means roughness instead when Gloss Is Roughness is on.
Specular (Advanced) color hex #rrggbb #ffffff Specular reflectance tint, used by the legacy (non-metalness) workflow.
Specular Map (Advanced) texture slot any project/built-in texture none Per-pixel specular tint, legacy workflow.
Gloss Map (Advanced) texture slot any project/built-in texture none Per-pixel gloss/roughness, read from a single channel (see Gloss Channel).
Gloss Channel (Advanced) select R / G / B / A G Which channel of the Gloss Map holds the value. Defaults to green because glTF packs roughness there.
Gloss Is Roughness (Advanced) boolean false Inverts gloss, so Gloss and the Gloss Map are read as roughness0 mirror-smooth, 1 fully matte. Turn this on for any map authored as a roughness map.
Specularity Factor (Advanced) slider 0–1, step 0.01 1 Overall strength multiplier on the specular response.
Wiring a glTF metallic-roughness texture

glTF (and therefore every .glb/.gltf model) packs metalness in blue and roughness in green of one image. To reproduce that exactly, assign the same texture to both Metalness Map and Gloss Map, leave the two channel selectors at their defaults (B and G), and turn Gloss Is Roughness on.

The order matters: the renderer multiplies the scalar by the sampled channel and then inverts, so Gloss must hold the raw roughness factor — not 1 − roughness. Wiring the map without Gloss Is Roughness reads roughness as gloss, which makes matte surfaces shiny and shiny surfaces matte.

Materials extracted from a built-in model are already wired this way.

Emissive

Field Type Range / units Default Runtime effect
Emissive color hex #rrggbb #000000 Self-lit color, added on top of lighting — visible even with no light on the surface.
Intensity slider 0–10, step 0.1 0 Multiplier on the Emissive color; 0 means no self-illumination regardless of the color set.
Emissive Map (Advanced) texture slot any project/built-in texture none Per-pixel emissive mask/color.

Opacity

Field Type Range / units Default Runtime effect
Opacity slider 0–1, step 0.01 1 Overall transparency; 1 is fully opaque.
Blend Type select None, Alpha, Additive, Premultiplied, Multiplicative, Screen None How this material's color blends with what's already drawn behind it. None skips blending entirely (cheapest, fully opaque).
Opacity Map (Advanced) texture slot any project/built-in texture none Per-pixel opacity mask.
Alpha Test (Advanced) slider 0–1, step 0.01 0 A cutoff below which a pixel is discarded outright rather than blended — cheap "cutout" transparency (foliage, mesh grilles) without sorting cost.
Alpha To Coverage (Advanced) boolean false Uses MSAA sample coverage to soften an alpha-tested edge instead of a hard cutoff, where the device supports it.

Normals

Field Type Range / units Default Runtime effect
Normal Map texture slot any project/built-in texture none Per-pixel surface-normal perturbation — adds apparent surface detail without more geometry.
Bumpiness slider 0–2, step 0.01 1 Strength multiplier on the Normal Map's effect.

Parallax — Advanced section

Field Type Range / units Default Runtime effect
Height Map texture slot any project/built-in texture none Per-pixel height data used to fake depth via parallax offset mapping.
Strength slider 0–2, step 0.01 1 How pronounced the parallax depth effect is.

Clearcoat — Advanced section

Field Type Range / units Default Runtime effect
Clearcoat slider 0–1, step 0.01 0 Strength of a second, clear specular layer over the base material — a lacquered-wood or varnished-card effect.
Gloss slider 0–1, step 0.01 1 Smoothness of the clearcoat layer itself, independent of the base Specular Gloss.
Bumpiness slider 0–2, step 0.01 1 Normal-strength multiplier for the clearcoat layer.

Sheen — Advanced section

Field Type Range / units Default Runtime effect
Use Sheen boolean false Enables a fabric-like retroreflective sheen response — for felt, cloth bags, card-holder linings.
Sheen color hex #rrggbb #ffffff Sheen tint color.
Gloss slider 0–1, step 0.01 1 Sheen layer smoothness.

Refraction — Advanced section

Field Type Range / units Default Runtime effect
Refraction slider 0–1, step 0.01 0 Strength of see-through refraction — for glass dice, resin tokens.
Index of Refraction slider 0–1, step 0.01 0.66 The material's IOR, bending how much background light distorts through it.
Thickness slider 0–1, step 0.01 0 Assumed material thickness, feeding the refraction and absorption calculation.

Iridescence — Advanced section

Field Type Range / units Default Runtime effect
Use Iridescence boolean false Enables a thin-film iridescent color shift (soap-bubble/oil-slick effect) — foil card accents, holographic tokens.
Iridescence slider 0–1, step 0.01 0 Strength of the iridescent response.
Thickness Min slider 0–1000, step 1 100 Lower bound of the simulated thin-film thickness range (nanometres), which drives the hue shift.
Thickness Max slider 0–1000, step 1 400 Upper bound of the same range.

Environment — Advanced section

Field Type Range / units Default Runtime effect
Cube Map texture slot any project/built-in texture none Environment reflection source for this material.
Reflectivity slider 0–1, step 0.01 1 Strength of the environment reflection.

Lightmap — Advanced section

Field Type Range / units Default Runtime effect
Lightmap texture slot any project/built-in texture none A pre-baked lighting texture, added into the shading result. Assign one here only to supply your own; the Room panel's Static lighting → Bake generates and binds lightmaps itself for room geometry and models flagged Static scenery, and does not use this slot.

Other — Advanced section

Field Type Range / units Default Runtime effect
Cull Mode select None, Back, Front Back Which triangle winding is culled — Back (the PlayCanvas/GL default) skips drawing back-facing triangles; None draws both faces, useful for thin planes like a poster or a single-sided card viewed from behind.
Depth Test boolean true Whether this material respects the depth buffer — disabling can cause draw-order artifacts and is rarely wanted.
Depth Write boolean true Whether this material writes to the depth buffer. Typically off only for certain transparency setups.
Two-Sided Lighting boolean false Flips the lighting normal for back-facing triangles instead of leaving them unlit, relevant when Cull Mode is None.
Opacity Fades Specular boolean true Whether the specular highlight fades out along with Opacity, rather than staying fully bright on a fading-out surface.

The Texture Inspector#

Selecting a texture (project or built-in) shows a preview image, a read-only Texture info block, then the same three panels the Texture editor tab uses — Sampling, Compression, WebP Compression — sourced from apps/web/src/ui/editor/TextureInspectorPanels.tsx so both surfaces render identically.

Texture (read-only info block)#

Field Type Runtime effect
ID read-only text The asset id.
Name read-only text Display name, derived from the asset's path.
Type read-only text Always texture — a fixed label, not a live field.
Size read-only text File size on disk, formatted (e.g. 240 KB).
Width / Height read-only text Pixel dimensions, read from the decoded image; while dimensions haven't resolved yet.
Depth read-only text Always 8 bit — a fixed display value, not measured per asset.
Alpha read-only text true/false, from whether the asset's content type is one of the alpha-capable formats (TEXTURE_ALPHA_CONTENT_TYPES).
Interlaced read-only text Always false — a fixed display value, not measured per asset.

Depth and Interlaced are not measured. Unlike every other row in this block, Depth (8 bit) and Interlaced (false) are hard-coded display strings (TableEditModeShell.tsx's texture-inspector branch), not values read from the actual image file. Treat them as decorative PlayCanvas-parity rows, not as an assertion about a specific asset — a PNG with a genuine 16-bit channel or an interlaced encoding would still show 8 bit / false here.

None of these eight fields are editable — they describe the file, not authoring settings.

Sampling#

Full field reference and which settings are worth changing (with the "when" reasoning) live on Working with textures. The fields themselves:

Field Type Range / units Default Runtime effect Replicates
sRGB boolean true Whether the GPU treats this texture's stored bytes as sRGB-encoded color data (correct for color/albedo maps) versus linear data (correct for normal/roughness/AO maps). Scene document — SceneTexture.srgb
RGBM boolean false Enables RGBM encoding, for representing high-dynamic-range color in a standard 8-bit texture. Scene document — SceneTexture.rgbm
Mipmaps boolean true Whether the GPU generates and uses mip levels, reducing aliasing and bandwidth at a distance. Scene document — SceneTexture.mipmaps
Filtering select Nearest, Linear Linear Nearest keeps hard pixel edges (pixel art); Linear smooths sampling between texels (everything else). Scene document — SceneTexture.filtering
Anisotropy number 1–16, step 1 1 Sharpens the texture when viewed at a shallow angle — a table surface or floor benefits most. Scene document — SceneTexture.anisotropy
Address U select Repeat, Clamp, Mirror Repeat Horizontal wrap behavior past [0,1] UV range. Scene document — SceneTexture.addressU
Address V select Repeat, Clamp, Mirror Repeat Vertical wrap behavior. Scene document — SceneTexture.addressV

Compression#

Field Type Values Default Runtime effect
Mode select ETC1S (smaller, color/albedo), UASTC (higher quality, normals/detail) ETC1S Chooses the Basis Universal codec used by Compress to Basis, below.
Compress to Basis button Encodes a .ktx2 copy of this texture beside the original (never replacing it), in the chosen codec, so every peer transcodes it to whatever their own GPU supports at load. Only available for a decodable image content type — an asset that is already .ktx2 shows an explanatory message instead of the controls.

This panel produces a new, separate asset — it does not modify SceneTexture settings on the source texture at all. See Working with textures for why this is safe across every peer's hardware, and the known gap where a resulting .ktx2 asset does not appear back in this same Textures list.

WebP Compression#

Field Type Range / units Default Runtime effect
Quality slider 1–100, step 1 the asset's last-used quality, or a filename-derived default The WebP encode quality Re-encode from original will use.
Encoded size read-only text The asset's current file size, for comparing before/after a re-encode.
Re-encode from original button Rebuilds this asset's bytes in place from its preserved originals/ source at the chosen quality. Disabled unless the asset is already .webp and a preserved original exists — an asset uploaded before WebP conversion existed has neither, and the panel says so instead of a silent no-op.

Unlike Compression, this panel replaces the same asset's bytes rather than creating a new one — that is why it requires the original to already be .webp and to have a preserved source.

See also#