Generate PBR Maps from Seamless PNG Textures with pbr_batch_tool

Generate PBR Maps from Seamless PNG Textures with pbr_batch_tool
Generate PBR Maps from Seamless PNG Textures with pbr_batch_tool



1) What is this script?

pbr_batch_tool is a Python utility (Python 3 + NumPy, OpenCV) that:

  • scans the input directory in/ recursively,
  • generates from each seamless PNG texture a full PBR set: Albedo, Height, Normal, Roughness, AO, Metallic, and optional ORM (R=AO, G=Roughness, B=Metallic),
  • mirrors the folder structure in out/,
  • optionally packs results into one or several ZIP files,
  • always uses wrap-padding (BORDER_WRAP) so seamless tiling is preserved.

The script does not “magically guess” a material type – it generates physically plausible derived maps from the input Albedo using classic techniques: height from luminance, normals from gradients, micro-roughness from local contrast, etc.

2) Where to download script?

You can download from Github 

https://github.com/alexmmx/pbr_batch

3) What kind of input image do you need?

You need at least one seamless PNG texture. Ideally, it should be a clean, tileable surface photo or material scan without baked-in lighting.

Requirements for input:

  • Seamless: the texture must tile without visible seams at edges.
  • Neutral lighting: no strong shadows, highlights, or directional reflections.
  • Resolution: 1024–4096 px (1K–4K). Higher resolution = more detail.
  • Format: PNG 8-bit per channel (alpha supported). Avoid JPEG for derived maps.
  • Color space: sRGB for Albedo; other maps are grayscale or linear RGB.

If your source photo contains highlights or shadows, clean it first to a “flat diffuse” version. Always check seamlessness using Offset in Photoshop/GIMP/Krita.

4) Installation (Linux/Ubuntu)

# Go to the tool folder
cd ~/pbr_batch_tool

# Create and activate a virtual environment
python3 -m venv .venv
source .venv/bin/activate

# Install dependencies (pinned versions)
pip install --upgrade pip
pip install numpy==1.26.4 opencv-python-headless==4.9.0.80

# Verify
python -c "import numpy, cv2; print(numpy.__version__, cv2.__version__)"

5) Folder structure

Put your input PNGs in in/. The script mirrors all subfolders into out/.

in/
 ├─ floor/aged-ceramic-tiles.png
 └─ wall/painted-plaster.png

out/
 ├─ floor/aged-ceramic-tiles_albedo.png
 │                     _normal.png
 │                     _roughness.png
 │                     _ao.png
 │                     _metallic.png
 │                     _ORM.png
 └─ wall/painted-plaster_*.png

6) Running the tool

Basic run

python3 pbr_batch.py -i ./in -o ./out

Generate ORM + ZIP results

python3 pbr_batch.py -i ./in -o ./out --pack-orm --zip-results

ZIP per subfolder

python3 pbr_batch.py -i ./in -o ./out --pack-orm --zip-results --zip-per-folder

Tuning intensities

python3 pbr_batch.py -i ./in -o ./out \
  --normal-strength 4.0 \
  --roughness-contrast 1.3 \
  --ao-strength 1.5 \
  --pack-orm

7) Parameters

  • --normal-strength – intensity of normals (default 3.0)
  • --roughness-contrast – boost local contrast for roughness (default 1.2)
  • --ao-strength – ambient occlusion strength (default 1.0)
  • --metallic – constant metallic value (0–1, default 0)
  • --pack-orm – export combined ORM map (R=AO, G=Roughness, B=Metallic)
  • --skip-height – don’t export a separate height map
  • --zip-results – create one big ZIP with results
  • --zip-per-folder – also create per-subfolder ZIPs

8) How maps are generated

Height

Computed from perceptual luminance: 0.2126*R + 0.7152*G + 0.0722*B. Normalized to [0..1].

Normal

Gradients via Sobel (with wrap borders). Normal vector scaled by --normal-strength, then mapped to RGB (purple-blue tangent space normal map).

Roughness

Calculated from multi-scale local contrast. Higher contrast → rougher (brighter). Optionally inverted to “glossiness” with --keep-glossy.

AO (Ambient Occlusion)

Approximate cavities by comparing height to blurred neighborhoods (2/4/8 px radii). Lower than surroundings → darker AO.

Metallic

Scalar map: 0 for dielectrics, 1 for metals. Intermediate values possible.

ORM

Combined optimization map: R=AO, G=Roughness, B=Metallic. Useful for Unreal and Unity pipelines.

Seamless

All filters use BORDER_WRAP, so no seams are introduced.

9) From one image to a complete PBR set

  1. Prepare a clean seamless PNG texture (no shadows/highlights, 2K–4K recommended).
  2. Place it in in/.
  3. Run the tool:
    python3 pbr_batch.py -i ./in -o ./out --pack-orm --zip-results
  4. Check the output maps: Albedo, Height, Normal, Roughness, AO, Metallic, ORM.
  5. Tweak intensities if needed and rerun.
  6. Import maps into Blender, Unreal, Unity, etc.

10) Preview in 3D software

Blender

  • Albedo → Base Color
  • Roughness → Roughness
  • Metallic → Metallic
  • Normal → Normal Map → Normal
  • AO → Multiply with Albedo

Unreal Engine

  • Base Color ← Albedo
  • Normal ← Normal
  • Roughness ← Roughness
  • Metallic ← Metallic
  • AO ← AO or ORM Red channel

Unity

  • Albedo → Base Map
  • Normal → Normal Map
  • Roughness → Smoothness (invert if needed)
  • Metallic → Metallic

11) Quality checks

  • Tiling test: Offset the texture by 50% width/height. Seams should be invisible.
  • Scaling: Keep surface detail proportional to real-world scale.
  • Compression: Don’t use JPEG for Normal/Roughness — use PNG/TIFF to avoid artifacts.

Conclusion

pbr_batch_tool transforms a single seamless PNG into a full set of PBR maps: Albedo, Height, Normal, Roughness, AO, Metallic, and ORM. It processes folders recursively, preserves seamless tiling, and exports ready-to-use ZIP archives. Whether you’re working in Blender, Unreal, or Unity, this tool saves hours of manual work and ensures consistent, high-quality materials for your 3D projects.


New textures

Seamless 3d texture pbr 8k industrial concrete finish wallpaper with textured plaster stucco and weathered aged look
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k retro plaid argyle wallpaper with textured woven basket weave finish
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k distressed cracked paint stucco wallpaper with embossed plaster texture finish
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k chevron houndstooth wallpaper with textured woven flannel finish in muted colors
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k art nouveau scrollwork wallpaper with embossed silver foil metallic accents
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k classic toile floral wallpaper with textured woven silk sheen finish
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k tropical leaves paisley wallpaper with embossed satin finish and muted colors
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k baroque brocade wallpaper with raised gold leaf metallic accents finish
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k modern minimalist plaid wallpaper with textured woven linen weave finish
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k rustic brick wall wallpaper with distressed weathered finish and embossed details
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k art deco medallion wallpaper with textured plaster finish and metallic accents
PBR TEXTURES · 8192px · 0 Downloads
Seamless 3d texture pbr 8k tropical leaves quatrefoil wallpaper with embossed bronze sheen finish
PBR TEXTURES · 8192px · 0 Downloads