Mtlx Viewer for VS Code

See your MaterialX materials without leaving the editor.

Open any .mtlx or .mtlx.zip file and get a live, physically based 3D preview, an interactive node graph, and a full validation report, all in one tab. Free and open source, built on the same mtlx-core library as the CLI and this site's viewer.

Part of the Mtlx suite of web-focused MaterialX tools.

Mtlx Viewer switching between the 3D preview and the node graph
  • Real-time 3D previewTotem, sphere, cube, plane or your own glTF model, lit by HDR environments with bloom, AO and tone mapping.
  • Node graph viewPan, zoom and click through nodes and nested node graphs to inspect every parameter.
  • Validation at a glanceStructure, types, dependencies, textures and renderer support are checked as the file opens.
  • Live reloadSave the material or any texture it uses and the preview updates.
  • One-click packagingRight-click in Explorer to bundle a .mtlx and its textures into a .mtlx.zip, or unpack one.
  • Your lighting, your modelsAdd HDR/EXR environments and glTF/GLB geometry from disk or a URL.

Use Open VSX for Cursor, VSCodium and other VS Code-compatible editors that can't use the Microsoft Marketplace. Requires desktop VS Code 1.85+ with GPU acceleration.

Viewer settings

Set preview defaults under Settings → Mtlx Viewer, or in user/workspace settings.json. Everything can also be changed per preview from the Viewer settings panel.

Extension viewer settings and defaults
SettingDefaultValues and behavior
mtlx.preview.ibls[]Additional named equirectangular .hdr, .exr, .png, .jpg / .jpeg files.
mtlx.preview.defaultIbl"bridge"bridge, studio, or an additional IBL name.
mtlx.preview.autoRotatetrueRotate by default. Reduced motion takes precedence; rotation can still be enabled manually.
mtlx.preview.bloomtrueEnable HDR bloom by default.
mtlx.preview.aotrueEnable full-resolution, denoised GTAO by default.
mtlx.preview.toneMapping"neutral"neutral, aces (ACES Filmic), agx, reinhard, cineon, linear, none.
mtlx.preview.background"environment"environment shows the IBL behind the model; none leaves it transparent.
mtlx.preview.geometries[]Additional named .gltf / .glb mesh scenes.
mtlx.preview.defaultGeometry"totem"totem, sphere, cube, plane, or an additional geometry name.

Each additional asset has a name and a source file path or HTTP(S) URL. Replace these example paths and URLs with your files:

{
  "mtlx.preview.ibls": [
    { "name": "courtyard", "source": "~/IBLs/courtyard.hdr" },
    { "name": "gallery", "source": "https://example.com/ibl/gallery.exr" }
  ],
  "mtlx.preview.defaultIbl": "courtyard",
  "mtlx.preview.autoRotate": false,
  "mtlx.preview.bloom": true,
  "mtlx.preview.ao": true,
  "mtlx.preview.toneMapping": "neutral",
  "mtlx.preview.background": "environment",
  "mtlx.preview.geometries": [
    { "name": "bust", "source": "models/bust.gltf" },
    { "name": "sample_mesh", "source": "https://example.com/models/sample.glb" }
  ],
  "mtlx.preview.defaultGeometry": "bust"
}

Names are case-sensitive identifiers matching [a-zA-Z_][a-zA-Z0-9_]*: start with a letter or underscore, then use letters, digits or underscores. Duplicates within a list and built-in names are rejected. IBL and geometry names are separate namespaces, so a custom name can appear in both.

Relative paths resolve from the material's workspace folder, or its own folder when no workspace folder exists. Absolute paths and ~/ refer to the extension host's filesystem. HTTP(S) URLs are read by the extension host. glTF buffers and images resolve relative to the geometry file, including the final URL after a redirect. Custom geometry uses the selected MaterialX material, replacing its original materials. Draco, Meshopt and KTX2 decoders are not configured.

Assets load when selected, with a 128 MiB limit per IBL or geometry including its sidecars and at most 256 external glTF resources. Refresh reloads assets. Configuration edits refresh visible previews and reapply defaults; manual choices survive ordinary refreshes and tab recreation until settings change. Invalid entries and defaults appear in settings diagnostics and fall back to built-ins. Load failures keep the current preview, or use a built-in fallback if the initial asset fails.