Generate PBR Maps from Seamless PNG Textures with pbr_batch_tool

Generate PBR Maps from Seamless PNG Textures with pbr_batch_tool article cover for PBR texture workflow
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:

Advertisement
  • 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?

Advertisement

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.


FAQ

What is covered in this guide?

This guide explains Generate PBR Maps from Seamless PNG Textures with pbr_batch_tool with practical notes for seamless PBR materials, texture setup, and production use.

Can I use these texture techniques in Blender, Unreal Engine, and Unity?

Yes. The workflow focuses on standard PBR maps and tileable materials that can be used in Blender, Unreal Engine, Unity, archviz, games, and VFX pipelines.

Where can I find textures for this workflow?

Use the AITextured texture library and the related texture links on this page to find seamless PBR materials and preview them before download.

Advertisement