Blender to TSL/Reference
Supported nodes
Which shader nodes convert exactly, which are approximated, and how to get the closest match to Blender.
The converter rebuilds the node graph in TSL node for node. Node groups are inlined, and every output gets a named constant, so you can trace any line of the module back to Blender. Where Blender’s two renderers disagree, it follows EEVEE, since that’s what a real-time three.js scene is closest to.
Each node is tested on its own: Blender renders it, three.js renders the exported module, and the two images are compared. The tests run on Blender 5.0 and 5.2 whenever the converter changes.
Supported
These convert directly to TSL. A few have small differences from Blender in edge cases (Refraction, for example, comes out a little brighter on a sphere); when one applies, the export notes say so.
Shaders
Principled BSDF, Diffuse, Glossy, Metallic, Glass, Refraction, Sheen, Specular (EEVEE), Emission, Transparent, Holdout, Mix Shader, Add Shader, Shader to RGB.
Textures
Image Texture, Noise, Wave, Gradient, Checker, White Noise, Brick, Magic, and Voronoi (see below).
Colour and maths
Math, Vector Math, Mix (every blend mode), Color Ramp (every interpolation), RGB Curves, Float Curve, Vector Curves, Map Range, Clamp, Invert, Gamma, Bright/Contrast, Hue/Saturation/Value, RGB to BW, Blackbody, Wavelength, and all the Separate / Combine nodes (XYZ, Color, RGB, HSV, HSL).
Vectors
Mapping, Vector Rotate, Vector Transform, Normal Map (tangent, object and world space, OpenGL and DirectX), Bump, Displacement, Vector Displacement.
Inputs
Value, RGB, Attribute, Color Attribute, UV Map, Texture Coordinate, Geometry, Tangent, Object Info, Camera Data, Light Path (as seen from the camera), Normal, Fresnel, Layer Weight.
Keyframes
Keyframed input values, including inside node groups, become curves driven by a frame uniform. Linear and constant keys are exact. See Uniforms.
Approximated
These convert to the nearest thing three.js has, and the export notes name each one:
| Node or feature | What you get |
|---|---|
| Translucent, Subsurface Scattering, hair BSDFs | A diffuse shader of the same colour |
| Toon BSDF | Diffuse, or glossy with roughness = Size |
| Ray Portal | Transparent |
| Shader to RGB | A simple light from three uniforms (details) |
| Ambient Occlusion | AO = 1, colour passed through (real-time AO is a post-process in three.js) |
| Bevel | The unbevelled normal |
| Hair / Particle / Point / Volume Info | 0, as on a mesh surface in Cycles |
| Noise: 2D, 4D and non-fBm types | 3D fBm noise |
| Voronoi: 2D, 4D, F2, distance to edge, n-sphere, Detail above 0 | One octave of three.js’ Voronoi |
| Eased keyframes | Linear between keys |
| F-curve modifiers | Ignored |
| Subsurface, coat tint, volume | Ignored |
| Vertex displacement | Bumps the normal instead of recomputing it; detail depends on mesh density |
| Filmic and other view transforms | No three.js tone mapping matches them |
Any node not listed becomes a constant 0.5 and gets a note, so the module still compiles.
Voronoi
Blender’s Voronoi and three.js’ built-in one have the same scale and range, but different cells. Turn on Match Blender Voronoi Exactly in the panel to include a port of Blender’s Voronoi in the module, so cells land exactly where Blender puts them. It costs some extra code.
A material that needs something three.js’ Voronoi doesn’t have (Smooth F1, the Color or Position outputs, or a distance other than Euclidean) always uses the port for all its Voronoi nodes, so cells stay shared between them.
Getting the closest match
- Use EEVEE in Blender when you compare. three.js is a real-time renderer, and the converter targets EEVEE where it and Cycles differ.
- Set three’s tone mapping to match your view transform. See Matching Blender’s colours.
- Leave Match Blender Highlights on, unless highlights shimmer on small, moving objects.
- Export tangents with meshes that use tangent-space normal maps.
- Compare from the same camera. An agent can render Blender’s viewport and screenshot your page for you.