The practical difference

OpenGL convention is usually called +Y, where the green channel points upward in tangent space. DirectX convention is −Y. A map imported with the wrong convention makes dents look like bumps along one axis and produces visibly incorrect lighting.

  • Blender: OpenGL / +Y
  • Unity: OpenGL / +Y
  • Godot: OpenGL / +Y
  • Unreal Engine: DirectX / −Y

How to verify

Rotate a directional light around a simple sphere or plane. Raised features should respond consistently from all directions. If only vertical slopes look reversed, invert the green channel or switch the convention in the tool.

What tangent-space normal maps store

A tangent-space normal map stores a direction relative to the surface of a UV-mapped model. Red represents the tangent X component, green represents tangent Y and blue represents the direction away from the surface. A flat tangent-space normal is therefore close to RGB 128, 128, 255 and appears blue-purple. The texture is numerical vector data, not a color image, so it must bypass ordinary sRGB color conversion.

Tangent space lets the same texture follow an animated or transformed mesh because its directions are interpreted from the surface basis rather than fixed world axes. That basis depends on UVs, vertex normals, tangents and triangulation. OpenGL versus DirectX names one convention difference inside this data; it does not describe the graphics API used to display the final project.

Why the green channel changes

OpenGL-style normal maps encode tangent Y as positive upward, often written +Y. DirectX-style maps encode the opposite sign, written −Y. Converting between them requires inverting the green channel around its midpoint. Red, blue and alpha remain unchanged. Recalculating the map from the source is unnecessary when the only problem is this known convention mismatch.

The raw images can look almost identical because both remain predominantly blue and the green differences appear mainly around vertical slopes. A filename, asset preset or import option is more dependable than guessing from the thumbnail. Normal Map Maker includes opengl or directx in exported normal filenames so the decision remains visible after download.

OpenGL and DirectX choices by application

Current Blender, Unity and Godot workflows use OpenGL-style +Y tangent normals. Unreal Engine uses DirectX-style −Y. These are practical defaults for the standard material systems documented by each application. A custom shader, legacy asset pipeline or third-party material package can still make a different assumption, so the receiving shader remains the final authority.

Do not infer the convention from the operating system. A Unity project running on Windows does not automatically need a DirectX-style source map, and a project rendered through another graphics backend does not automatically change the authored texture. The material importer and shader define how the stored green values are decoded.

  • Blender: OpenGL +Y for tangent-space Normal Map nodes
  • Unity: OpenGL +Y in current Unity documentation
  • Godot: OpenGL +Y for StandardMaterial3D normal maps
  • Unreal Engine: DirectX −Y for the standard normal workflow

How to identify a reversed normal map

Apply the normal map to a simple plane or sphere and move a single directional light above, below, left and right. Horizontal and vertical features should react consistently. If left-to-right slopes look correct but top-to-bottom slopes look recessed when they should be raised, the green channel is likely reversed. A uniformly excessive or weak effect points to strength, color space or tangent problems instead.

Use a source with an obvious raised shape, such as a beveled square or embossed letter, when testing a pipeline. Complex stone and fabric textures can hide the error because they contain no clear up direction. Disable height, parallax and ambient occlusion during the diagnosis so other effects do not imitate a normal-direction problem.

Convert the convention safely

The safest conversion is the OpenGL or DirectX selector in the generator because it flips the intended tangent Y component before export and labels the result. An image editor can perform the same operation by inverting only green. Do not invert the complete RGB image, rotate hue or swap red and green; those operations change other vector components and produce invalid lighting.

Some engines expose an import setting or channel-remap option that flips green without modifying the source file. That can be useful when a shared asset must serve multiple projects. Document where the conversion happens so it is not applied twice. A green channel inverted in the file and then inverted again by the importer returns to the original convention and preserves the error.

Separate convention errors from tangent errors

A convention mismatch affects one directional axis across the texture. Tangent-basis problems often appear as seams, gradients across triangulated faces or changes after mesh deformation. Ensure the low-poly mesh uses the same UV layout, vertex normals, tangents and triangulation expected by the bake. Mirrored UV islands require a tangent system that preserves the handedness correctly.

Color-space mistakes create another distinctive failure. Sampling a normal texture as sRGB bends its numerical components before the shader reconstructs the direction, which can weaken or skew lighting across the whole material. Set the texture type to normal where the engine provides that option, or use Linear or Non-Color sampling with the appropriate Normal Map node.

Normal strength, blue channel and reconstruction

Increasing normal strength scales the lateral X and Y slopes before the vector is normalized. Excessive values make small source noise produce hard lighting and can cause grazing-angle artifacts. A healthy tangent-space image normally stays blue-dominant because most texels point generally away from the surface. Strong red or green is reasonable around steep features but should not fill every flat region.

Some compression workflows store only red and green, then reconstruct blue in the shader from the unit-length relationship. This is normal and does not change the +Y or −Y decision. It does mean that channel editing, compression and normalization should be handled as vector data rather than ordinary color correction.

Export and handoff checklist

Choose the destination preset, verify an unmistakable raised feature under moving light and export the labeled normal file. Import it as a normal or linear data texture. Confirm that no automatic green inversion conflicts with the chosen file and test with the final mesh, UVs and tangent settings. Keep height and AO disabled until the normal response is proven.

For teams, record the convention in filenames, material documentation and asset validation rules. Avoid ambiguous names such as final_normal.png when files cross applications. A clear normal_opengl.png or normal_directx.png label prevents silent channel flips and makes automated import configuration possible.

  • Flip only green when converting +Y and −Y
  • Never sample a normal map as ordinary sRGB color
  • Test direction with a simple raised shape and moving light
  • Investigate mesh tangents when the problem follows seams rather than one axis

Keep source maps and conversions traceable

Retain the original normal map beside every converted variant and record which application or shader each file targets. Repeated manual edits can make it impossible to know whether green has already been inverted, especially when two blue thumbnails look nearly identical. A small asset note that names the source convention, conversion step, tangent basis and destination prevents destructive guesswork later. When updating a material, regenerate both variants from the same master instead of converting an already converted copy, then repeat the moving-light test in each destination.

Ready to verify the workflow? Open the texture workspace and use the matching engine preset before export.