The breakthrough

Exact MaterialsBlender's node maths, running inside Unreal.

The usual way to get a Blender material into Unreal is to bake it into flat textures. Venom Bridge Link doesn't bake. It compiles the node tree itself into one Unreal shader that runs the same maths as Blender's Cycles renderer. Here is how it works, with a test you can run in this page.

493node tests, each within 0.002 of Cycles with Cycles Texture Filtering on
96tests on meshes: rotated, scaled and off-pivot, compared pixel by pixel
1shader per material, built from Cycles' own node code
0shader compiles when you change a value

Baking: a snapshot

  1. Render the procedural nodes into images at a fixed size
  2. Unreal gets pictures, not maths: up close they run out of pixels
  3. Change a value and the bake is out of date until you bake again
  4. Noise, ramps and maths only survive as far as the image resolution allows

Exact: the maths itself

  • The node tree becomes one Unreal shader, evaluated for every pixel
  • The node code is Cycles' own, ported to HLSL, so the numbers match
  • Values are shader parameters: change one and Unreal updates without a compile
  • Sharp at any distance, because nothing was rendered into a texture
Run it yourself

The test bench, live in your browser.

The plugin is checked by rendering a material in Cycles and in Unreal and comparing every pixel. This page does the same with one material, Noise Texture into a Color Ramp, computed three ways on your own machine. Move the sliders and watch the numbers.

Generated Noise Texture 3D · fBM · Normalize Color Ramp 3 stops · Linear Base Color
ReferenceCycles' node maths in double precision, on your CPU
Computing…

The yardstick: every pixel of the other two is compared with this.

Exact shaderThe same maths as one shader, on your GPU
GPU not available
difference ×100,000
Largest difference
…
Average
…
Baked 64×64How procedural nodes usually reach Unreal
difference ×4
Largest difference
…
Average
…

The bench starts when it scrolls into view.– integer hashes per pixel

Drag a slider

The exact shader changes in the same frame. Nothing is rebuilt: the new value is handed to the shader, the way the plugin updates a material instance's parameters in Unreal. The bake stays as it was until you bake again.

Zoom in

The reference and the exact shader stay sharp, because they are worked out for every pixel. The bake has 64×64 pixels to stretch: the fine detail it never captured turns to blur up close, and no zoom brings it back.

Read the numbers

The exact shader's difference is tiny, usually well under 0.001, and it is only rounding: 32-bit floats on the GPU against a 64-bit reference. The plugin's own bench holds Unreal to 0.002 of Cycles, about half of one step of an 8-bit screen.

This page runs the node maths as WebGL. In Unreal the plugin generates HLSL from the same Cycles code. The noise is Cycles' Perlin noise (BSD-3-Clause, Sony Pictures Imageworks and the Blender Foundation); the notice is in the page's script.

How it works

From a node tree to one shader.

Five things happen between Blender and Unreal. Step through them, or press Play.

Texture CoordGenerated ● GroupNoise TextureFac ● Color Ramp Principled→ Output Voronoi (muted)not reaching output

Read the node tree

  • Groups are opened up, reroutes followed and muted nodes passed through, as Cycles does.
  • Only nodes that reach the active Material Output are kept. Anything else stays in Blender.
  • Values, links, ramps, curves and images are read straight from Blender.

Shared masters, ramps and curves as lookup rows, and live Mapping and maths came in version 1.15.

The proof

What the plugin's test bench measures.

Two benches, run against Cycles. The image bench renders each node graph in Cycles as a 64×64 image and the same graph in Unreal, and reads both back as exact floats. The mesh bench renders a rotated, non-uniformly scaled sphere, moved off its pivot, in both, and compares every covered pixel.

Largest difference from Cycles, by test groupColour values from 0 to 1, on a log scale: further left is closer to Cycles.
Every test in the group is within thisBench limit, 0.002One step of an 8-bit screen, 1/255
Object Info10 tests on meshes, Nanite too
≤ 0.000001
Color Ramps and curves59 tests: every interpolation, colour mode and hue direction
≤ 0.00001
Constant maths and Mapping113 tests, worked out in Blender
≤ 0.00002
Math nodes122 tests
≤ 0.002
Texture nodes, ramps and curves143 tests
≤ 0.002
Image textures27 tests and 28 Clip cases, Cycles Texture Filtering on
≤ 0.002
Mesh bench55 of 96 tests: rotated, scaled, off-pivot sphere. Most within 0.0003
≤ 0.002

From the plugin's own test bench, version 1.17. The mesh tests that aren't within 0.002 are under Known differences.

0.6 mm
true displacement on a Nanite mesh, compared with Cycles' displaced surface
99%
of a real 2048 px normal map's pixels within 0.0007
1273 → 681
pixel-shader instructions for a test material with six image textures and a bump, after Exact mode got lighter in 1.15
Known differences

Where it isn't 1:1, and why.

The bench reports these as they are.

Measured differences

  • With Unreal's default GPU texture filtering, sRGB colour images seen magnified can differ by up to about 0.27. Turn on Cycles Texture Filtering and they are within 0.002.
  • Box-projected images: about 0.003.
  • Strong tangent-space normal maps on synthetic test images: up to about 0.05. On a real 2048 px normal map, 99% of pixels are within 0.0007.
  • Lighting is Unreal's own (Lumen): the material matches, and the final image follows Unreal's lights.

Not possible in a real-time shader

  • Sky and IES textures, OSL Script, Raycast, Wireframe, Pointiness, Random Per Island and volume shaders. Each material lists any it uses.
  • The Principled BSDF's subsurface, sheen, coat tint, coat normal, thin film and diffuse roughness: Unreal's Default Lit has no such layers, and a note says so for each one in use.
Is this really new?

We couldn't find anyone else doing it.

We went through the Blender ⇄ Unreal exporters, live-sync add-ons and bridges on sale. The material converters we found rebuild a Principled BSDF and bake procedural nodes into images. We couldn't find another that runs the node tree itself in Unreal, with Cycles' own maths, and measures the result against Cycles.

See your own materials in Unreal.

Every feature free for 7 days, Exact Materials included.