Every game artist hits the same wall: your textures look perfect in Substance Painter, then land in Unreal Engine 5 looking flat, washed out, or wrong. The problem is almost never the art. It's the export pipeline.
This guide walks you through every decision point — from setting up your export template to wiring the final material in UE5 — so your assets look the same in both tools.
Setting Up Your Export Template in Substance Painter
Substance Painter ships with a built-in Unreal Engine 4 (Packed) export preset. In 2026, this preset still works for UE5 — the format hasn't changed. Navigate to File → Export Textures, then select `Unreal Engine 4 (Packed)` from the Config dropdown.
This preset produces four textures:
- `_BaseColor` — RGB diffuse color (sRGB)
- `_Normal` — DirectX tangent-space normal map
- `_OcclusionRoughnessMetallic` — packed ORM (see next section)
- `_Emissive` — optional emissive color
Key settings to lock in before exporting:
- File type: PNG for lossless export (you'll apply compression inside UE5)
- Size: Match your texel density target — typically 2048×2048 for hero assets, 1024×1024 for background props
- Padding: Set to `Dilation + Transparent` to avoid seam bleed artifacts at mip boundaries
- Normal map format: Keep it on DirectX — UE5 expects DirectX-style normals (green channel up)
Avoid exporting TGA unless your pipeline specifically requires it. PNG is smaller and lossless. Avoid EXR for anything except HDR emissive or displacement data — EXR files are massive and UE5 won't apply GPU texture compression to them automatically.
Understanding Channel Packing for UE5
Channel packing is the single biggest performance win in a PBR pipeline. Instead of three separate grayscale textures (AO, Roughness, Metallic), you pack all three into the RGB channels of a single texture. UE5 reads them out per-channel with zero overhead.
![]()
The ORM packing convention used by UE5 is:
| Channel | Data |
|---------|------|
| R | Ambient Occlusion |
| G | Roughness |
| B | Metallic |
The Substance Painter preset does this automatically. But if you're baking from Blender or using a custom pipeline, you need to pack manually. Here's a Python snippet using Pillow:
```python
from PIL import Image
ao = Image.open("asset_AO.png").convert("L")
roughness = Image.open("asset_Roughness.png").convert("L")
metallic = Image.open("asset_Metallic.png").convert("L")
width, height = ao.size
orm = Image.merge("RGB", (ao, roughness, metallic))
orm.save("asset_OcclusionRoughnessMetallic.png")
```
One important note: the ORM texture is not sRGB data. It's linear mask data. Marking it as sRGB in UE5 will destroy your roughness and metallic values. More on this in the import section.
Exporting Textures at the Right Resolution
Resolution decisions compound. Export at the wrong size and you're either wasting texture memory or losing detail that can't be recovered later.
Here's a practical resolution guide based on asset role:
| Asset Type | Base Color | Normal | ORM |
|------------|------------|--------|-----|
| Hero character | 4096 | 4096 | 2048 |
| Standard prop | 2048 | 2048 | 2048 |
| Background/LOD prop | 1024 | 1024 | 1024 |
| Tiling surface | 2048 | 2048 | 2048 |
UE5's texture streaming system handles these efficiently, but only if you follow consistent naming conventions. Adopt a naming standard before exporting:
```
AssetName_BaseColor.png
AssetName_Normal.png
AssetName_OcclusionRoughnessMetallic.png
AssetName_Emissive.png
```
Keep names lowercase and hyphen/underscore separated. UE5 uses the filename as the asset name — inconsistent naming creates chaos in your Content Browser.
Importing Textures into Unreal Engine 5
Drag your exported PNGs into the UE5 Content Browser. UE5 will auto-detect most settings, but it gets two things wrong almost every time:
- It marks ORM textures as sRGB
- It uses Default compression instead of optimal per-type compression
![]()
For each texture, open its settings and configure as follows:
BaseColor texture:
- sRGB: ✅ Enabled
- Compression: `Default` (BC1 for opaque, BC3 for alpha)
- Mip Gen Settings: `FromTextureGroup`
Normal map texture:
- sRGB: ❌ Disabled
- Compression: `Normalmap` (BC5 — preserves both R and G channels)
- Texture Group: `World Normal Map`
ORM texture:
- sRGB: ❌ Disabled (critical — linear data)
- Compression: `Masks` (BC4 or BC7 depending on channel count)
- Mip Gen Settings: `FromTextureGroup`
Emissive texture (if used):
- sRGB: ✅ Enabled
- Compression: `Default`
To save time importing multiple assets with correct settings, create a Texture Import Profile in Project Settings → Texture Import Settings. You can define rules that auto-apply compression and sRGB flags based on filename suffix.
Building the Material in UE5 Material Editor
Create a new Material asset in the Content Browser. Set the Shading Model to `Default Lit` (or `Subsurface` for skin). Open the Material Editor.
Here's the standard node hookup:
```
BaseColor texture (sRGB) → Base Color pin
Normal texture → Normal pin (after TextureCoordinate)
ORM.R (AO channel) → Ambient Occlusion pin
ORM.G (Roughness channel) → Roughness pin
ORM.B (Metallic channel) → Metallic pin
Emissive texture → Emissive Color pin
```
To split the ORM channels, use a Texture Sample node connected to three Component Mask nodes:
- Mask R → Ambient Occlusion
- Mask G → Roughness
- Mask B → Metallic
This uses a single texture sample — no extra draw cost.
For production workflows, consider converting your Material to a Material Instance immediately after verifying it looks correct. Material Instances compile instantly, expose parameters to level designers, and are required by UE5's batching systems for instanced static meshes.
If you're distributing assets through BitSoul's marketplace, pack your materials as Material Instances with sensible parameter defaults. Buyers should be able to adjust color tint, roughness multiplier, and emissive intensity without touching the master material.
Common Mistakes and Quick Fixes
A few issues come up constantly:
Textures look washed out in UE5. Almost always an sRGB mismatch. Check your ORM texture — if it's flagged as sRGB, disable it and re-save.
Normal map has a seam visible. Usually a Mikktspace mismatch between Blender/Painter and UE5. Ensure your mesh was triangulated before baking, and that you didn't flip the green channel. UE5 uses DirectX-style normals.
Asset looks plastic in lit scenes. Your roughness values are probably too low (too smooth). Real-world surfaces rarely go below 0.2 roughness. Use UE5's built-in PBR validation tool (enable via Show → Visualize → PBR Validation) to check if values are physically plausible.
ORM texture looks all grey. You packed the channels in the wrong order, or exported non-packed textures. Re-export from Substance Painter using the UE4 Packed preset and check the channel assignments in the export dialog.
Conclusion
The Substance Painter to UE5 pipeline is straightforward once you lock in the right settings. Export with the UE4 Packed preset, keep ORM linear, set compression per texture type in UE5, and split ORM channels with Component Masks in the Material Editor.
Once your pipeline is set up, it takes under two minutes to import and wire a full PBR asset correctly. If you're looking for pre-optimized 3D assets with correct texture sets already packed for UE5, check out BitSoul's marketplace — assets are tagged by engine and include export-ready texture maps.