Normal Map Converter
Convert tangent-space normal maps between OpenGL and DirectX conventions directly in your browser.
PNG, JPG & WebP · Local processing · Free
Open Normal Map ConverterPack PBR maps into a single texture.
Add up to four maps, assign Red, Green, Blue and Alpha, then export a PNG. Choose Unreal ORM, Unity Metallic + Smoothness or your own channel layout.
Private by design — your textures never leave your browser.
Enable JavaScript to load textures, preview channels and export a PNG. Nothing is uploaded.
Add a map to get started.
Your packed texture will appear here. Map your channels, then select Pack texture.
The combined RGB preview may appear red because Metallic is stored in Red while Green and Blue are unused. Smoothness is stored in Alpha. Select A channel to inspect it.
Combined RGB ignores alpha for visibility. Export preserves all four channels.
These are data textures rather than color textures. In your engine, ensure the texture is imported using the appropriate non-color / linear settings for the target workflow. Use the packed texture as the Metallic Map. Metallic is stored in Red and Smoothness in Alpha; check that your shader reads smoothness from Metallic Alpha.
PBR channel maps are data textures. Browser decoding and embedded color profiles can affect source values. Transparent WebP pixels can also change during browser decoding; use PNG for exact sample handling. The output is an 8-bit RGBA PNG. Import packed maps as non-color/data according to your engine workflow.
Channel packing stores separate grayscale maps inside the channels of one texture. A shader reads each channel as a different property: for example, Red for ambient occlusion, Green for roughness and Blue for metallic. The colorful combined preview is a container for those values, not a base-color image.
Start with the PBR material fundamentals if you are unsure what each map controls. Choose maps that describe the same surface, use compatible UVs and need the same tiling. Packing unrelated UV layouts into one file will not align them.
All exported files contain four 8-bit channels. A 16-bit PNG source is reduced to 8-bit by rounding each sample divided by 257. The tool does not bake material properties or produce new detail when upscaling. Keep your original high-precision height maps when the destination requires them.
ORM means Occlusion, Roughness and Metallic. This preset uses the following explicit layout; Alpha defaults to a constant 255.
| Output channel | Map / value | Required Map Label |
|---|---|---|
| R · Red | Ambient occlusion | Ambient Occlusion |
| G · Green | Roughness | Roughness |
| B · Blue | Metallic | Metallic |
| A · Alpha | 255 | Constant fill |
If you do not have a metallic map for a non-metallic surface, use Fill 0 in Blue. If no AO variation is needed, Fill 255 in Red is a common neutral choice. Changes that differ from the selected preset switch the layout to Custom so the interface always describes the current mapping. Verify these assumptions against your shader.
Packing can reduce the number of files to manage and allow a shader to obtain several masks from one sampled texture. It can simplify a PBR material workflow, but it does not guarantee lower memory use, fewer draw calls or a faster frame. Compression format, alpha, shader sampling and shared resolution determine the actual result.
After packing, estimate runtime texture storage with the Texture Memory Calculator. Compare your engine's imported format, not the PNG download size. Use the texture resolution guide to decide whether every mask needs the same resolution before combining them.
Many workflows use smoothness as the inverse of roughness. In this tool, Invert computes 255 − value after grayscale extraction and resizing: 0 becomes 255, 128 becomes 127 and 255 becomes 0. Use it on the output channel your shader expects for smoothness; avoid inverting a map that already stores smoothness.
RGB holds three independent grayscale maps. RGBA adds Alpha for a fourth map, such as height or another mask. Alpha is data here; a value of zero does not discard the exported RGB values. The Combined RGB preview ignores Alpha so you can inspect the color channels, while the A preview displays Alpha as grayscale.
The download is always an RGBA PNG, including when Alpha is filled with 255. Your engine may choose a different runtime format based on its settings. Retaining an alpha channel can affect compression and storage, so check the imported result rather than assuming four packed masks are always cheaper.
PNG samples are decoded locally without applying embedded display profiles. JPEG and WebP use browser decoding; color profiles and transparent pixels can affect their values. Prefer PNG for lossless mask data. Luminance uses 0.2126R + 0.7152G + 0.0722B on decoded samples without a gamma transform, and the final channel value is rounded to the nearest integer. For an already packed source, select its Red, Green or Blue channel directly.
Use Nearest for discrete hard masks. Bilinear blends neighboring values and can suit continuous roughness or height maps; inspect the result because resampling changes the data. Configure packed textures as non-color/data in the destination workflow. The Blender PBR setup guide explains how data-map connections differ from base color.
For Unity Built-in and URP metallic workflows, this preset places Metallic in Red, fills Green and Blue with 0, and stores Smoothness in Alpha. Add a Metallic map and either a Smoothness map or a Roughness map in any slots. Check their Map Labels, then select Unity Metallic + Smoothness.
If Roughness is supplied, the tool enables Invert on Alpha and calculates 255 − roughness. If a Smoothness map is present, it takes priority and is used directly without inversion. Metallic is never inverted by this preset. The active mapping and conversion message show exactly which sources are being used.
The combined RGB preview displays Metallic in Red; Green and Blue are unused. Smoothness is stored separately in Alpha, so it does not appear in that composite. A red-looking preview is therefore expected for metallic areas. Select A · Smoothness to inspect the grayscale smoothness values. The PNG preserves Alpha, including zeros, and does not flatten it into RGB.
Use the result as the Metallic Map for a compatible metallic-workflow shader. Check that its smoothness source reads Metallic Alpha rather than an alternative such as Albedo Alpha, where that setting is available. Unity's metallic workflow reference describes the Red/Alpha arrangement, and the URP Lit reference documents smoothness source selection.
These are data textures, not display color. Use the appropriate non-color/linear import settings for the target shader and retain the file's alpha channel. This preset is not an HDRP Mask Map: the HDRP layout instead uses metallic, AO, detail mask and smoothness in RGBA. For HDRP or a custom shader, verify the documented layout and configure Custom accordingly.
Review Unity texture import settings when the packed result looks different in the engine.
The tool recognizes whole filename tokens such as metallic, metalness, roughness, glossiness, AO, normal and albedo, ignoring case and common separators. For example, steel_panel_Glossiness.png suggests Smoothness. Names with no clear match or conflicting map tokens remain Custom. It does not infer map type from brightness or pixel appearance.
You can override any suggestion. A manual label, including Custom, is preserved when replacing that source; Remove or Reset clears it. The tool cannot verify whether the actual pixels represent the label you selected, so confirm the source map's purpose. Normal and Base Color labels will never be silently used as metallic or roughness inputs.
If multiple sources share a required label, choose one in the source selector. When both Roughness and Smoothness exist for the Unity preset, Smoothness takes priority; duplicate Smoothness maps still need an explicit selection. Switch to Custom whenever you need full manual control or constant fills instead of the preset's required maps.
Unreal material workflows often combine grayscale masks in RGB. ORM is one useful arrangement, but the material graph decides which property reads each channel. Connect R, G and B deliberately; a differently packed texture needs different connections.
Epic's texture mask guidance recommends disabling sRGB for packed masks. Choose compatible compression and confirm the material on your target platform. Packing a file does not change an existing material graph automatically.
Choose a material from the 3DSkillUp PBR material library, inspect its included maps, then pack only the channels required by your shader. Keep base color and normal maps separate from scalar masks unless a documented custom workflow calls for something different.
No. File validation, decoding, packing and export happen in your browser tab. The tool has no image upload endpoint, saved-file storage or file analytics. Reset removes the loaded sources and output from the tool; closing the page releases its resources. Normal website requests and server-side visit analytics are separate from the local texture operation.
Source files are limited to 75 MiB each. Dimensions are capped at 8,192 pixels per side, with lower pixel and working-memory limits on constrained devices or in compatibility mode. The tool estimates memory before decoding and packing, but available browser memory can still vary. Remove unused sources, reduce output resolution or try a desktop browser. Animated images, HDR/EXR and SVG are not supported.