Unreal Engine (UE) supports three workflows for importing MaterialX™ surface descriptions:
The direct import of a .mtlx file in the content folder.
The import of external .mtlx files referenced by a USD™ file.
The processing of MaterialX surface descriptions embedded in a USD stage.
UE imports materials as non-Substrate Materials or Material Instance, and in a Substrate project will use auto-conversion so those materials can be used by the Substrate system. However, when importing a MaterialX surface description in a Substrate project, UE will create native- Substrate Materials. This provides Materials which match more closely the Surface Description.
Import a MaterialX File
To import MaterialX files (.mtlx) into UE, use the import button from the Content Browser or drag & drop the file in the Content Browser.
| Option | Description |
|---|---|
Volumetric Material | Defines how the importer will handle the Volumetric Distribution function. If enabled it will use an internal Substrate Volumetric FOG-Cloud BSDF instead of the simple volume slab BSDF. This option should be disabled for material graph operation. |
Normals from Height | Recompute the normals for the displacement shaders, this option is best suited with procedural normals (for example shader graphs created specifically for offline-renderers). Otherwise this option should be disabled if there’s already a normal map plugged to the normal input of the surface shader. |
If the imported file contains a Sparse Volume Texture (SVT) and creates a Heterogeneous Volume actor, enable the Volumetric setting; otherwise leave it unchecked. This follows the same logic as Volume Material support in glTF, which internally uses a Substrate Slab configured as a Simple Volume.
Image Source: Dragon Attenuation | Image Source: Mosquito In Amber |
To enable Heterogeneous Volume, check the box under Engine - Rendering in the project setting.
Recompute Normals Option
This option is for material with displacement authored in offline-renderer, especially with procedural normals. For already baked normal maps, the option should be disabled. For example; in the egg_gold from the MaterialEggs - USD MaterialX Examples, this material has displacement with procedural normals in its shader graph.
For the import of a file generated by Quixel which includes a MaterialX material, the normals are already baked in texture normal maps.
It’s also possible to set the setting once the material has been imported in the Material Editor by checking the Static Bool Parameter bRecomputeNormals:
Edit MaterialX Import Settings
You can customize the MaterialX import settings in two ways:
In UE's Project Settings editor.
During import in the dialog window.
For more information on customizing settings using the dialog window, see the Interchange Import Reference.
MaterialX import settings are found in Project Settings > Interchange MaterialX:
| Option | Description |
|---|---|
OpenPBR Surface | Defines the material function to use when translating data for OpenPBR Surface shader. See Limitations below. |
OpenPBR Surface Transmission | Defines the material function to use when translating OpenPBR Surface data for translucency. See Limitations below. |
Standard Surface | Defines the material function to use when translating data for Autodesk's Standard Surface shader. See Limitations below. |
Standard Surface Transmission | Defines the material function to use when translating Standard Surface data for translucency. See Limitations below. |
Surface Unlit | Defines the material function to use when translating Standard Surface data for unlit surfaces. |
USD Preview Surface | Defines the material function to use when translating data for USD's surface shader. |
With a Substrate project, the import process translates MaterialX definitions into Unreal Shader nodes using the following Material Functions:
/Engine/Functions/Substrate/MF_Substrate_OpenPBR_Opaque/Engine/Functions/Substrate/MF_Substrate_OpenPBR_Translucent/Engine/Functions/Substrate/Substrate-StandardSurface-Opaque/Engine/Functions/Substrate/Substrate-StandardSurface-Translucent/InterchangeAssets/Substrate/MX_SurfaceUnlit/Engine/Functions/Substrate/MF_Surface_UsdPreviewSurface/InterchangeAssets/Substrate/MX_Surface/InterchangeAssets/Substrate/MX_Displacement/InterchangeAssets/Substrate/MX_SimpleVolumeor/InterchangeAssets/Substrate/MX_VolumetricFogClouddepending on the Volumetric Material setting in the MaterialX pipeline
If Substrate is deactivated in the project, the import process will use the following Material Functions instead of the Substrate ones:
/InterchangeAssets/Functions/MX_OpenPBR_Opaque/InterchangeAssets/Functions/MX_OpenPBR_Translucent/InterchangeAssets/Functions/MX_StandardSurface/InterchangeAssets/Functions/MX_TransmissionSurface/InterchangeAssets/Functions/MX_SurfaceUnlit/InterchangeAssets/Functions/MX_USDPreviewSurface/InterchangeAssets/Functions/MX_Surface/InterchangeAssets/Functions/MX_Displacement
If the imported file defines an unsupported surface or volume material, Unreal attempts to generate the corresponding UE shader graph based on the provided surfaceshader node definition using the predefined Material assets.
These assets are found in the following UE directories:
Engine/Plugins/InterchangeFrameworkContent/FunctionsEngine/Plugins/InterchangeFrameworkContent/SubstrateEngine/Content/Functions/Substrate
Editing the default engine material functions is not recommended. If you need to customize these functions, follow these steps:
Create a copy of the material function you want to edit and move this new function into your project's Content folder.
Make changes to the material function and save.
Inputs can be different, removed or added as long as it respects the same naming of the
nodedef, but the outputs must match the name and numbers of the original Material Function.Set the newly created material function in Project Settings > Interchange MaterialX.
Transmission and Subsurface Limitations
Due to current Unreal Engine limitations, transmission and subsurface scattering cannot be evaluated simultaneously within the same shading path. Materials that use transmission must be rendered through a forward-shaded path, whereas subsurface scattering is evaluated in the deferred pipeline. As a result, translucent materials that exhibit partial diffuse or scattering behavior must have their inputs reinterpreted to conform to Substrate’s expected semantics. In particular, for translucent materials, the Diffuse input represents an approximation of multiple scattering within the medium, rather than a surface Lambertian response.
Because of this split representation, applicable Standard Surface and OpenPBR materials require minor adjustments to their shader graphs. The transformations depend on which inputs are present, as outlined below.
Materials with Transmission, Subsurface, and Base Color inputs:
The material is authored as Opaque using Masked blend mode.
All Transmission inputs are disconnected from surface shaders.
A dithered opacity mask is applied to the surface shader.
The Transmission input drives the dithering mask, effectively approximating transmission via stochastic coverage.
Materials with Transmission and Subsurface inputs only:
The material is authored as Translucent using a Translucent blend mode.
Subsurface Color is connected to the Base Color input of the surface shader.
Subsurface Weight replaces the Base Weight input.
If the surface shader has no Transmission Depth input, an empirical fallback value is provided(see egg_jade and masonJarWater).
Subsurface Color is connected to the Transmission Scatter input.
SubsurfaceRadius / SubsurfaceRadiusScale from the Standard Surface or OpenPBR material is:
Multiplied by the Transmission Color when present, or
Directly connected to the Transmission Color input when no explicit transmission color is provided.
These transformations preserve the intended material appearance while aligning with Substrate’s rendering constraints, ensuring that transmission-driven scattering behavior remains visually consistent despite the separation between forward and deferred shading paths.
Displacement Shaders
Displacement shaders are fully supported, with the possibility to recompute normals as explained above.
The displacement effect is only visible if Nanite is enabled on the mesh the material is applied to.
Nanite doesn’t support transparent materials.
Substrate: Standard Surface and OpenPBR materials
The OpenPBR Surface specification defines a BSDF structure with multiple concurrent scattering components, including an intrinsic clearcoat-like response layered over a base material. Accurately representing this structure is not possible within UE’s Legacy GBuffer layout, which encodes shading behavior by selecting from a set of mutually exclusive shading model representations on a per-pixel basis. Substrate’s Blendable GBuffer intentionally preserves this same encoding model in order to maintain feature parity and performance characteristics with the legacy system. As a result, it remains subject to the same structural limitations: only a single shading behavior can be expressed per pixel, constraining the range of BSDF compositions that can be faithfully represented.
To support the full BSDF expressiveness required by the OpenPBR specification, Substrate provides the Adaptive GBuffer project setting. This mode enables multiple shading behaviors to be encoded and evaluated concurrently within a single pixel, allowing layered and compound BSDFs to be represented without reinterpretation or some other lossy conversion. The use of Adaptive GBuffer introduces additional storage and evaluation cost and is generally intended for materials whose BSDF structure requires this level of expressiveness. In this instance, it enables a direct mapping between the OpenPBR Surface model and Substrate’s shading architecture, ensuring that materials authored with the OpenPBR specification can be represented accurately.