If a brick wall looks like it is embossed instead of carved, you probably loaded a DirectX normal into an OpenGL shader, or the reverse. The two tangent-space conventions agree on the red channel and disagree on green. This is not a quality difference. It is a sign convention. Fixing it takes one channel invert, not a new bake.

What the green channel stores

A tangent-space normal map encodes a unit vector in tangent, bitangent, and normal axes as RGB. The green channel is the bitangent (Y). DirectX and OpenGL disagree on whether +Y points up or down in texture space. That single flip inverts the perceived slope of every detail that is not a perfect pyramid.

Height and roughness are unrelated. Do not “fix” a bad normal by raising roughness. If you are new to the map set, read what PBR textures are. Locker3d packs in the catalog are standard tangent normals; confirm the convention in your engine import settings rather than assuming.

Engine defaults you should memorize

  • Blender: OpenGL. Principled BSDF + Normal Map node. Color space: Non-Color.
  • Unreal Engine: DirectX. Flip is handled in the texture asset if you mark it correctly.
  • Unity Built-in / URP / HDRP: often DirectX-style with a “Flip Green Channel” checkbox. HDRP can surprise you if the checkbox does not match the file.
  • Substance 3D Painter: project setting. Export presets exist for each engine; use them instead of a generic PNG dump.

Game engines that use DirectX shading typically want DirectX normals. Offline DCCs that follow OpenGL typically want OpenGL. Mixed pipelines (Blender lookdev, Unreal final) need an explicit convert at export, not a guess in the shader.

How to tell which file you have

Open the normal as a color image. A DirectX map often looks slightly “upside down” in the green compared with an OpenGL map of the same surface, but eyeballing green is unreliable. Better tests:

  1. Place a known concave detail: engraved letters, mortar lines, a drilled hole.
  2. Light from the top of the screen. Cavities should recede. If they pop out, invert green.
  3. Compare a wood grain or metal scratch under a rotating HDRI. See HDRI and PBR lighting. If scratches invert when you rotate light, the convention is wrong.

Do not use a noisy rock as the test. Random detail hides the invert. Use a surface with a clear “down” direction.

Convert, do not re-author

Invert green only. In Photoshop or Krita: select the green channel, invert. In Blender: Separate Color → Invert the G socket → Combine Color. In Unreal: a OneMinus on the green component, or the texture’s Flip Green setting. Never invert the whole RGB image; that also flips X and breaks the vector length.

After convert, keep the filename honest: _n_dx or _n_gl. Store one canonical file in the library and convert at export. 8-bit PNG is enough for most game normals; 16-bit helps only on very low-frequency, large surfaces. Resolution still follows the 1K–8K guide.

Library and license notes

When you download free CC0 maps from Locker3d, you may invert green and redistribute the converted file. That is allowed under CC0; see what you can and cannot do. Document the convention in a one-line readme inside the material folder so the next artist does not invert it twice. More engine notes are on the blog.

Frequently asked questions

What is the difference between DirectX and OpenGL normal maps?

The green channel is flipped. DirectX stores concave detail with the opposite green values from OpenGL. Red (X) is the same. Using the wrong convention inverts apparent bumps, especially on engraved text and brick mortar.

Which convention does Blender use?

Blender’s Normal Map node expects OpenGL-style tangent normals by default. Unreal Engine expects DirectX. Unity depends on the pipeline and the “Flip Green Channel” import option. Always check a known cavity, not a noisy rock.

How do I convert a map without re-baking?

Invert the green channel only. In an image editor: green = 1 − green. In Blender, a Separate RGB, Invert on G, Combine RGB works. Do not invert the whole image or the red channel.