IMAGE → SURFACE DIRECTIONS
Normal map generator
JPG, PNG or WebP → PNG
No upload, login or watermark.
Start with an image
JPG · PNG · WebP
Shape the surface response
Scales the estimated height slope. Zero gives a flat normal.
Box-filter radius in source pixels, applied before the gradient.
The DirectX option flips the green channel.
Wrap height samples across opposite edges. Use for a source that already repeats; this does not repair a mismatched source.
Brightness is an estimated height, not measured geometry. Shadows and printed color can become false bumps.
Compare input and normal
Input image
Normal map
Choose a photo or height image to begin.
HOW IT WORKS
Generate a normal map online from brightness
Upload one image, adjust strength and smoothing, then compare the source with the normal map. PNG export keeps the decoded image width, height and alpha channel.
The worker estimates height as (0.2126 R + 0.7152 G + 0.0722 B) / 255 using the decoded 8-bit RGB values. A photograph is only a brightness proxy for height. A deliberate grayscale height image gives you more control over the result.
Smoothing averages neighboring height samples in a box of radius 0–8 pixels, weighted by alpha. Central differences estimate the horizontal and vertical slopes. The tool normalizes the vector (−strength × horizontal slope, +strength × vertical slope, 1) and encodes each component into an 8-bit channel. DirectX export replaces green with 255 − green.
SCOPE
What the PNG does—and what it cannot infer
This is a tangent-space normal map. It describes estimated surface directions; it does not add geometry or recover physical surface depth. Bright paint, shadows, highlights and perspective are not separated from relief.
Edges use clamped samples by default. Enable Tileable sampling to wrap both smoothing and gradient samples across the image boundaries. This does not automatically make a mismatched input tileable. To work on repetition first, use the Seamless Texture Generator, then bring its PNG here.
JPG, PNG and WebP are supported. The limit is 16,777,216 pixels and a 16,384-pixel side; there is no resize step. Browser memory can impose a lower limit. Fully transparent pixels use a flat normal, and transparent neighbors do not create an artificial height step. PNG processing uses 8-bit channels. Load the result as normal/vector data in your renderer.
QUESTIONS
Before you export
Can I turn a color photo into a normal map?
Yes, as an estimate from brightness. Dark color and cast shadows may be mistaken for low height; this is not a physically accurate reconstruction.
What is the difference between OpenGL and DirectX here?
Only the green channel changes: DirectX uses 255 minus the OpenGL green value. Choose the convention expected by your material.
Does smoothing blur the exported normal image?
It smooths the estimated height before computing normals. It does not resize the image or apply a cosmetic blur to an already generated normal map.
Are my images uploaded?
No. Decoding, height estimation, normal generation and PNG encoding happen in your browser. Refreshing or closing the page clears the working session.
Will this produce a seamless normal map?
Only from a source that already repeats. Enable Tileable sampling to calculate across its boundaries. It does not align mismatched edges; the default remains clamped sampling.