If a PBR material looks correct in Blender or an image editor but wrong after you import it into Unreal Engine, the problem is often not the texture itself. Unreal needs to know whether each image represents visible color, numerical material data, or a normal vector, and those categories use different texture settings.
For a common metallic-roughness material, the basic split is simple. Base color should normally stay in sRGB. Roughness, metallic, height, ambient occlusion, and packed mask textures should be treated as linear data. A tangent-space normal map should use Unreal's Normalmap compression setting rather than the normal color-texture path.
This guide focuses on those import decisions in Unreal Engine 5, including what to check when a roughness map looks wrong, when to use Masks compression, and how OpenGL versus DirectX normal orientation affects the result.
Base color should normally use sRGB
Base color is the part of the material that represents visible surface color, so it is normally imported with sRGB enabled. Epic's own Datasmith material guidance shows albedo imported with sRGB on and sampled as color, while non-color material data is handled separately. Epic's Datasmith Export SDK Guidelines are a useful reference for that distinction.
For an ordinary opaque base-color texture, Unreal's Default compression setting is a reasonable starting point. You do not need to switch a normal albedo image to Masks just because the material also contains roughness or metallic maps. Those other maps have their own import settings.
A common mistake is disabling sRGB across the entire texture set because the material is "PBR." PBR does not mean every texture is linear data. Base color still represents color, while roughness and metallic represent scalar values used by the shader.
Roughness should have sRGB disabled
A roughness map stores a value from smooth to rough rather than visible color. Unreal's Roughness input also operates on values between 0 and 1, with darker values producing a smoother response and lighter values producing a rougher one. Epic's Physically Based Materials documentation explains the expected roughness range and how it changes reflections.
Because those grayscale values are material data, sRGB should be disabled on the roughness texture. If Unreal applies an sRGB decode to a roughness map, the stored midtones no longer reach the shader as the same numerical values. The map can still look recognizable in the texture viewer while the material response becomes noticeably more or less glossy than the source intended.
For a standalone roughness image, the most important import check is the color-space setting. Compression can be adjusted for a particular project's quality and memory requirements, but you should first make sure the map is being treated as linear data. Our PBR texture color space guide covers the same distinction across Blender, Unreal, and other material workflows.
Metallic is data too
Metallic should also have sRGB disabled. Unreal's metallic input is a scalar property, and Epic recommends treating clean material regions as either metal or non-metal in most cases rather than using arbitrary gray values. Epic's PBR material documentation covers the metallic input in more detail.
That does not mean a metallic texture has to contain only pure black and white pixels. Transitions, antialiasing, weathering, coatings, and mixed pixel coverage can create intermediate values. The underlying interpretation is still material data rather than display color.
If you are debugging a surface that looks partly metallic when it should not, check the texture channel, sRGB setting, and material connection before changing the artwork. Our metallic map guide goes deeper on painted metal, rust, exposed metal, and when gray values make sense.
Normal maps should use Normalmap compression
Normal maps are a different case because their RGB values encode a direction rather than a color or a single grayscale property. Unreal has a dedicated Normalmap compression setting for this data. Epic's supported rendering documentation lists Normalmap as a separate texture compression mode and identifies BC5 as the normal-map format on supported DirectX desktop paths. Epic's texture compression reference documents the available compression modes, including Normalmap and Masks.
In practice, Unreal often recognizes a normal map automatically, especially when the filename and image contents look like a conventional tangent-space normal. It is still worth opening the texture and checking. If a normal map was imported as a normal color image, the sampler and compression path may not match the data it contains.
Normal maps should not use sRGB. When the texture is correctly configured as a normal map, Unreal handles it as vector data rather than display color.
There is a second issue that compression cannot fix: normal-map orientation. Unreal uses the DirectX convention for tangent-space normals. If your source map uses the OpenGL convention, dents can appear as bumps and lighting can look inverted along one axis. Unreal exposes Flip Green Channel in the texture settings, which lets you correct that mismatch without editing the source image. Our OpenGL vs DirectX normal map guide explains the difference in more detail.
Packed ORM textures should use Masks and no sRGB
When ambient occlusion, roughness, and metallic are packed into separate RGB channels of one image, the texture is no longer a color image at all. Each channel carries an independent grayscale mask.
Epic's texture masking documentation specifically recommends disabling sRGB for packed masks because the channels should not be gamma corrected. Unreal also provides a Masks (no sRGB) compression setting for this kind of texture data.
For a conventional ORM texture, red usually carries ambient occlusion, green carries roughness, and blue carries metallic. Unreal does not require that exact channel order, so always verify the source convention before connecting the channels. Our ORM texture guide covers ORM, RMA, MRA, and why packed-map names should not be treated as proof of the channel layout.
One useful detail from Epic's mask documentation is that changing a texture from sRGB color to linear mask data does not always update an existing Texture Sample node automatically. If a material begins reporting a sampler-type error after you change the texture settings, inspect the sample node and make sure it is using a linear sampler type rather than Color.
Importing a twirl material into Unreal Engine 5
twirl currently exports separate albedo, normal, roughness, metallic, and height maps. That means you can configure each texture according to the data it contains instead of inheriting an engine-specific packed format.
For the current twirl map set, keep albedo in sRGB and connect it to Base Color. Set roughness and metallic to linear data with sRGB disabled and connect them to their matching material inputs. Configure the normal texture as a normal map, then check its green-channel orientation if the surface detail appears inverted. Keep height as linear data and only use it if the material is actually set up for a height or displacement workflow.
The twirl Unreal Engine material page covers the broader Unreal workflow, and the AI PBR material generator can generate the five-map source set when you need a material that is not already in the library.
Height maps should stay linear, but their use depends on the material
Height maps also contain numerical surface data, so they should not be treated as sRGB color. The correct way to use a height map after import depends on the material setup and target rendering technique.
Unlike Base Color, Roughness, Metallic, and Normal, there is not one universal height input that every Unreal material should use. A project might use height for parallax-style effects, displacement, virtual heightfield workflows, or a custom material function. In other cases, the height texture may not be used at all because the normal map already provides enough surface detail for the camera distance.
This is why we would not force a generic height map into another material input just because it was included in the download. Keep the source map linear and wire it only when the material graph has a defined use for it.
Masks compression is useful for masks, not a universal PBR setting
It is easy to turn "data maps should not use sRGB" into "every data map must use Masks compression," but those are two separate decisions.
The sRGB checkbox determines whether Unreal treats the stored values as gamma-encoded color. Compression determines how the texture is represented for the target platform. Epic's current Unreal Python API describes TC_MASKS as using the same compression family as Default, while dedicated options also exist for normal maps, alpha or single-channel data, grayscale, BC7, displacement-related data, and other texture types. Epic's TextureCompressionSettings reference lists the available modes.
For an RGB texture where each channel contains an independent mask, Masks is a clear fit. For a standalone grayscale roughness or height map, the best compression choice can depend on how the texture is stored, the target platform, memory requirements, and how visible compression artifacts are in that particular map.
So the reliable first pass is to get the semantic type correct: color stays color, masks stay linear, normals use the normal-map path. Compression tuning comes after the material is behaving correctly.
Why a material can look wrong even when the maps are correct
When imported PBR textures look different from the source application, there are several places where the interpretation can change. Roughness may have sRGB enabled, the normal map may use the opposite Y orientation, a packed texture may be sampled as Color, or the wrong packed channel may be connected to a material input.
Those problems often look like bad texture generation because they affect the final reflections and shading. Changing the source image can make the result look closer by accident while leaving the actual import problem in place.
We would check the map type before editing the artwork. Confirm that base color is treated as color, roughness and metallic are linear, the normal map uses Normalmap compression, and any packed masks have sRGB disabled. Then verify the channel connections in the material itself.
Do not disable mipmaps just to make a texture look sharper
Texture import settings also affect how materials behave at distance. Unreal uses mipmaps and texture streaming to control texture detail and memory as objects move closer to or farther from the camera. Epic's texture format and settings documentation explains how texture groups, LOD bias, filtering, and streamed mips affect the texture that reaches the renderer.
If a material looks soft from far away, turning mipmaps off is usually not the first fix for a normal environment texture. It can increase aliasing and work against the engine's normal streaming behavior. Check the source resolution, UV scale, texture group, streaming state, and material scale before treating mipmaps as the problem.
This matters for tileable environment materials because a single surface can cover a large range of screen sizes. A wall texture that looks right from two meters away may become noisy or expensive if it is forced to stay at full resolution across an entire level.
A practical Unreal PBR import check
For a normal metallic-roughness material, the import settings are predictable once you separate color from data. Base color stays in sRGB. Roughness and metallic use linear values with sRGB disabled. Tangent-space normals use Normalmap compression and need the DirectX green-channel orientation Unreal expects. Packed ORM or other mask textures should have sRGB disabled and are a natural use for the Masks compression setting. Height remains linear and is only connected when the material has a defined height workflow.
After those settings are correct, the material graph becomes much easier to judge. If the surface still looks wrong, you can start looking at the actual map content, texture scale, lighting, material parameters, and mesh tangents instead of compensating for an import setting that was changing the data before the shader ever saw it.