You've assembled a PBR material in Substance Painter, but it looks different in the engine? That's a familiar scenario. In 80% of cases, the issue is a mismatch in color spaces: Albedo imported as sRGB, but the engine expects Linear. Or a Normal Map without green channel inversion for DirectX. We've worked on projects where incorrect packing of a Mask Map in HDRP required manual rework of 50 materials. Our methodology eliminates such errors. We analyze source textures, select proper import settings, create a Master Material with parameters—and the material looks identical to Substance Painter. Contact us to get a consultation on your materials.
The problem is almost always one of three: incorrect color space, wrong channel packing, or a mismatch in Tone Mapping settings between the DCC tool and the engine. We solve it in 2–4 days for a set of 20 materials.
Why do PBR materials look different in the engine?
Each engine interprets PBR data differently. Unity uses different material formats depending on the pipeline; Unreal Engine 5 requires a packed ORM texture. If these nuances are not accounted for, Albedo shifts, Smoothness inverts, normals flip. The result is a material that "doesn't work."
How to set up channel packing for HDRP and URP?
In Unity, the difference between HDRP and URP is not just in rendering quality. They have completely different material formats.
Universal Render Pipeline (URP) uses a Lit Shader with straightforward packing: Albedo, Normal, Metallic (R) + Smoothness (A), AO (G), Emission. In URP, Smoothness is inverted Roughness. If you export Roughness from Substance Painter and plug it into the Smoothness channel without inversion, the material will be glossy where it should be matte.
High Definition Render Pipeline (HDRP) has a Mask Map packed as Metallic (R), AO (G), Detail Mask (B), Smoothness (A). This non-standard packing is not automatically generated by Substance Painter's default templates. You need to either use the HDRP template when creating the project in Substance Painter or manually compose the Mask Map. Incorrect channel packing is one of the most common bugs when migrating assets from another engine.
Color Space is another critical point. In Unity, Albedo is imported as sRGB, Normal Map as Linear (uncheck sRGB in Import Settings), Roughness, Metallic, AO as Linear. Ignoring these settings is the source of half the problems.
How to properly pack an ORM texture for Unreal Engine?
In Unreal's Material Graph, textures are connected to the corresponding inputs of the Principled BSDF analogue. But there are a few nuances.
Packed ORM texture. In Unreal Engine, the standard is packing AO (R), Roughness (G), Metallic (B) into one texture with the Linear Color flag. This reduces the number of texture samples in the shader from three to one, improving performance by 20% in scenes with many materials. The correct Export Preset for Unreal in Substance Painter is Unreal Engine 4 (Packed).
Normal Map coordinates. Unreal uses DirectX normal map space: the green channel (Y) is inverted relative to OpenGL. When importing normals, either use the DirectX flag when exporting from Substance, or enable the Flip Green Channel option in Unreal's Import Settings.
Texture Compression. Unreal compresses textures into BC7 (DirectX) or ETC2 (mobile). Albedo: Default (BC7), Normal Map: Normal Map (BC5), Metallic/Roughness/AO: Masks (BC4/BC7 without sRGB).
Material Instances are a must. Instead of duplicating the Material Graph for each variant, create one Master Material with parameters and then create Instances. This reduces the number of unique shaders by 3–4 times, speeds up loading by 30%, and allows parameter changes without recompilation. Such shader optimization reduces draw calls and improves FPS. For example, we optimized a project from 200 materials down to 15 Master Materials + 200 Instances, cutting load time by 40%.
How we set up PBR materials: step-by-step process
- Audit source textures: check bit depth, color space, presence of all maps.
- Select the target engine and render pipeline, determine the packing format.
- Configure export from Substance Painter with the correct preset or write a custom JSON config.
- Import into the engine with proper Import Settings (sRGB/Linear).
- Assemble a Master Material with parameters, create Instances.
- Verify the material on a test scene: Albedo (30–240 sRGB), Normal Map (no artifacts), Smoothness (0–1), AO (no double shadowing), Metallic (binary).
Comparison of render pipelines by PBR parameters
| Parameter | Unity HDRP | Unity URP | Unreal Engine 5 |
|---|---|---|---|
| Texture packing | Mask Map (RGBA) | Separate with Smoothness | ORM packed (R=AO, G=Rough, B=Met) |
| Smoothness | From stored roughness | Inverted Roughness | From Roughness channel |
| Normal Map space | OpenGL (default) | OpenGL | DirectX (requires Y inversion) |
| Normal compression | BC5 | BC5 | BC5 |
| Material inheritance | Shader Graph / Instances | Shader Graph / Instances | Master Material + Instances |
What's included in PBR material setup
- Analysis of source textures and their suitability for the target engine.
- Export Preset configuration and texture conversion (channels, color space).
- Creation of Master Material with parameters (Base Color, Normal, ORM/Mask, Emission).
- Assembly of Material Instances for each asset.
- Verification on a test scene with side lighting and HDRI.
- Documentation of settings and transfer to the project's git repository.
| Task Scale | Estimated Time |
|---|---|
| Setup of one material | from 0.5 day |
| Migration of 10–20 assets | from 2 days |
| Development of Master Material + 30 Instances | from 5 days |
| Full material audit of a project | by agreement |
Timelines are clarified after project analysis. Order PBR material setup—we guarantee compatibility with your engine. Contact us for a free work scope assessment.
Physically Based Rendering is the foundation of modern game materials. More on Wikipedia.





