Textures & PBR · Free browser tool

PBR Channel Packer

Pack 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.

PBR channel packing settings
01

Add your source maps

Up to four PNG, JPG or static WebP images. Slots are independent of output channels.

Source 1

Drop a map here

No image selected

PNG · JPG · WebP

Choose a label or load a named map.

Source 2

Drop a map here

No image selected

PNG · JPG · WebP

Choose a label or load a named map.

Source 3

Drop a map here

No image selected

PNG · JPG · WebP

Choose a label or load a named map.

Source 4

Drop a map here

No image selected

PNG · JPG · WebP

Choose a label or load a named map.

Labels may be suggested from filename tokens; no pixel-based classification is performed. Check each suggestion. Your manual label choices take priority, including when replacing a source.

Drop multiple files onto a slot to fill that slot and the slots after it, in file order. Maximum 75 MiB per file. PNG inputs may be 8-bit or 16-bit; output is always 8-bit per channel.

02

Assign RGBA channels

Reuse any source, invert its values or fill a channel.

Start with Source 1 in Red. Choose the maps or constant values for the other channels.

Invert applies 255 − value, after resizing and extraction. It can convert roughness to smoothness. A fill needs no source image.

Active mapping

    03

    Set the output

    All selected maps resize to one shared resolution.

    Add Source 1 to determine the target size.

    Extraction & resampling

    Luminance = 0.2126R + 0.7152G + 0.0722B on decoded sample values, without a gamma transform. Source alpha is ignored. Choose R, G or B to extract an existing mask.

    Nearest keeps hard mask edges. Smooth blends neighboring values for maps such as roughness or height. Images stretch to fit; no cropping.

    Maximum 8,192 pixels per side, subject to the device memory budget. Large jobs may need a smaller target.

    Add a map to get started.

    04 · Inspect & export

    Packed texture preview

    Your packed texture will appear here. Map your channels, then select Pack texture.

    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.

    What is PBR channel packing?

    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.

    How to pack your maps

    1. Add your source textures. A slot can hold any supported map. The tool suggests a label from recognizable filename tokens; verify or change it. Labels are authoritative for presets, and your manual choices are kept when replacing a source.
    2. Choose Unreal Engine ORM for AO, roughness and metallic, or Unity Metallic + Smoothness for metallic and either roughness or smoothness. Slot order does not matter: presets use Map Labels. Missing or ambiguous inputs disable packing until you correct the labels or select the intended source. Custom assignments can reuse any source or use constant fills.
    3. Choose the target size. Largest and smallest refer to pixel count, with the first slot breaking ties. Different aspect ratios are stretched to fit, with a warning.
    4. Choose extraction and resampling if needed. Pack the texture, inspect each grayscale channel and download the PNG.

    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.

    What is an ORM texture?

    ORM means Occlusion, Roughness and Metallic. This preset uses the following explicit layout; Alpha defaults to a constant 255.

    ORM preset channel assignments
    Output channelMap / valueRequired Map Label
    R · RedAmbient occlusionAmbient Occlusion
    G · GreenRoughnessRoughness
    B · BlueMetallicMetallic
    A · Alpha255Constant 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.

    Why pack PBR textures?

    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.

    Roughness vs smoothness

    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 vs RGBA channel packing

    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.

    PBR maps are data, not display color

    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.

    Unity Metallic + Smoothness: which maps do I need?

    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.

    Why does the Unity packed texture look red?

    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.

    Using the packed texture in Unity

    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.

    How are source-map labels detected?

    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.

    Channel packing for Unreal Engine

    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.

    Start with a consistent material set

    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.

    Are my textures uploaded?

    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.

    What if a large texture will not pack?

    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.