Normal Map ValidatorLocal browser processing
Drop an image hereChoose a PNG, JPEG, WebP, or BMP (up to 50 MB).Local image processing

Choose a local image or try the sample.

Diagnostic guidance, not certification. Vector statistics exclude fully transparent pixels; thresholds are documented below.

The intended OpenGL/DirectX Y convention cannot be reliably determined from pixels alone.

Drag or touch the lit preview, or use the light sliders.

Open Normal Map Fixer

Normal Map Validator

Use this normal map validator to measure an existing tangent-space texture before changing it. Check vector lengths, channel distributions, repeating edges, and transparent boundaries, then compare lighting under both Y interpretations. Your image stays in browser memory; the report provides diagnostic guidance, not certification of a finished asset.

How to Get Started with the Normal Map Validator

Choose a local normal texture or try the generated sample. PNG is preferable because JPEG can alter the numeric channels before analysis begins. Read the compact length and seam summaries, then open the complete measurements and issue explanations. Switch between the normal texture, lit preview, length heatmap, and offset seam inspection. Move the light with a mouse, touch, or keyboard sliders. Keep the source available for any deliberate repairs.

What Is a Normal Map Validator?

A normal map validator is a numeric checker for textures that are expected to store surface directions. It decodes red, green, and blue into signed X, Y, and Z components using component = channel / 127.5 − 1. Unlike a color-image analyzer, it does not apply display gamma to these calculations. The measurements describe the supplied pixels; they cannot establish whether a texture matches a mesh's UV layout or tangent basis.

What This Normal Map Validator Checks

The report includes dimensions, decoded transparency, visible-pixel channel ranges, average signed components, and vector-length statistics. It also measures distance from the neutral direction, near-zero and negative Z, opposite-edge differences, and hidden-to-visible alpha boundaries. Uniformity and eight-pixel discontinuities provide additional review signals. Fully transparent texels are excluded from the main vector statistics, but their boundary RGB is analyzed separately when the decoder preserves it. No visible pixels means no usable vector assessment.

Vector Length and Normalization Tolerance

For a unit normal, sqrt(x² + y² + z²) is one. This normal map validator counts lengths from 0.95 through 1.05 as inside its tolerance; that allowance is a practical heuristic for quantization and editing. Lengths below 0.02 are treated as degenerate. A decoded RGB 128, 128, 255 neutral texel is slightly longer than one because eight-bit channels cannot encode exact zero. Normalization must happen after measuring, otherwise the original error disappears.

OpenGL vs DirectX: What Pixels Cannot Determine

The intended OpenGL/DirectX Y convention cannot be reliably determined from pixels alone. Average green is especially unsuitable as a definitive detector: an asymmetric surface may legitimately lean upward or downward. The preview selector interprets the same file as Y+ or Y− under the same movable light. It never modifies your texture. Use an authored raised feature, source documentation, or a known renderer setup to decide which interpretation matches your asset.

Convert a confirmed normal-map convention

Seam and Edge Problems in Repeating Textures

Opposite edges are compared as normalized directions using average chord distance, from zero for identical directions to two for opposite directions. A score above 0.12 prompts review, rather than proving an unwanted seam. Pairs containing a fully transparent texel are excluded, and absent pairs are reported as unavailable. The offset preview moves the borders toward the center. Adjacent samples of a correctly periodic gradient can still differ, so inspect repetition at your intended texture scale.

Prepare a repeating normal texture

Alpha Edges and Compression Problems

At each transparent-to-visible boundary, a direction difference above 0.35 is counted as possible contamination; more than ten percent of these pairs triggers a warning. Eight-pixel block boundaries are also compared with interior neighbor differences. A ratio above 1.8 with a boundary difference above 0.025 is suspicious. These are heuristics: tiled artwork can resemble JPEG blocks, and intentional padding can differ from an edge. A compression warning does not identify the original file's compression history.

When a Validator Warning Is Acceptable

A flat neutral texture is a valid normal map even though the uniformity signal asks you to check that detail was expected. Strong X or Y averages may describe an intentionally tilted surface. Negative Z can be meaningful in unusual encodings, while the standard forward-facing tangent workflow usually warrants closer inspection. Unit-length violations are measured facts; whether they cause visible problems depends on renderer normalization, filtering, and compression. Keep the issue's certainty separate from its practical importance.

How to Fix Common Normal Map Problems

Start with the smallest justified change. Renormalize if lengths are inconsistent; flip green only after confirming a convention mismatch; rebuild positive Z only for a compatible X/Y encoding. Alpha cleanup can replace hidden contamination without altering partial transparency. This normal map validator does not repair the source or infer missing sculpted detail. After editing, run the exported file through the checker again and inspect it in the target material at both close and distant views.

Repair measured problems with the Normal Map Fixer

Who This Normal Map Validator Is For

Texture artists can use these diagnostics before delivering an asset, technical artists can compare import candidates, and developers can separate file-level problems from shading setup errors. The tool is also useful when combining or filtering normal textures: numerical lengths can drift even when the purple image looks plausible. The suspicious RGB-distribution signal considers poor unit-length coverage, substantial negative Z, or degenerate pixels; it is a plausibility check, not an automatic image classifier.

Diagnostic Limits and Final Visual Review

Analysis runs at the full decoded dimensions in a worker, while previews use bounded nearest samples to keep interaction responsive. Files are limited to 50 MB, 8192 pixels per side, and 16,777,216 pixels. Common non-interlaced eight-bit PNGs preserve numeric and hidden RGB directly. Other layouts use browser decoding, which may lose hidden color or apply browser behavior. This normal map validator cannot inspect engine mipmaps, mesh tangents, or runtime compression; finish with the existing viewer and your actual renderer.

Inspect the texture in the Normal Map Viewer

Frequently Asked Questions

Does Healthy certify a correct normal map?

No. Healthy means the enabled numeric heuristics found no review condition. Mesh tangents, UVs, convention, and renderer import settings still need inspection.

Can the normal map validator identify OpenGL or DirectX?

It cannot reliably infer the intended Y convention from the file alone. Compare both previews and confirm using authored features or pipeline documentation.

Why does a neutral normal texture show a warning?

The uniformity check notices the absence of variation. RGB 128, 128, 255 is a useful flat normal; the warning simply asks whether you expected surface detail.

Are uploaded textures sent to a server?

Image bytes are decoded and analyzed locally in browser memory. Ordinary page and asset requests still occur, but there is no image-upload API.