TextureAlchemy
Transform Images into complete material sets ready for game engines, 3D software, and rendering pipelines.*
Complete workflow suite for ComfyUI. Extract, process, and enhance physically-based rendering textures with AI-powered alchemy.
🎯 What It Does
Creates complete PBR material sets from images using AI (Marigold/Lotus) with professional post-processing tools:
Material Maps:
- Albedo - Base color/diffuse
- Normal - Surface normals (OpenGL/DirectX compatible)
- Roughness - Surface roughness
- Metallic - Metalness/reflectivity
- AO - Ambient occlusion
- Height - Displacement/parallax
- Curvature - Edge detection for wear/weathering
Professional Tools:
- Seamless tiling, texture scaling, triplanar projection
- Channel packing (save VRAM), normal/height conversion
- Material mixing, wear generation, detail blending
- HSV color adjustment, gradient mapping
- Interactive color ramp with visual UI
📦 Installation
- Copy
ComfyUI_PBR_MaterialProcessorfolder toComfyUI/custom_nodes/ - Restart ComfyUI
- Find all nodes in Texture Alchemist category in ComfyUI's node library
No additional requirements needed - uses ComfyUI's built-in libraries (PyTorch, PIL, NumPy).
📚 Node Categories
All nodes are in the "Texture Alchemist" category in ComfyUI!
To find nodes: Right-click in ComfyUI → Add Node → Texture Alchemist → Choose subcategory
⚗️ Texture Alchemist/Core (2 nodes)
Extract and adjust PBR materials from AI outputs
⚗️ Texture Alchemist/Pipeline (6 nodes)
Bundle maps, adjust in batch, mix materials, save sets
⚗️ Texture Alchemist/Normal (4 nodes)
Process, combine, convert normal maps
⚗️ Texture Alchemist/Color (4 nodes)
Recolor, adjust HSV, color ramps
⚗️ Texture Alchemist/Effects (4 nodes)
Wear generation, curvature, detail blending
⚗️ Texture Alchemist/Texture (8 nodes)
Tiling, scaling, projection, optimization
⚗️ Texture Alchemist/Channel (8 nodes)
Pack/unpack RGB channels, grayscale conversion
⚗️ Texture Alchemist/Maps (3 nodes)
Height processing, AO generation
⚗️ Texture Alchemist/Materials (User nodes)
Your custom PBR extractors
🔌 The Nodes (Detailed Reference)
Core Processing
1. PBR Extractor (Marigold)
Extracts PBR maps from Marigold AI outputs into a PBR_PIPE. Needs the Marigold model loader from ComfyUI-Marigold
Inputs:
marigold_appearance- Marigold output (appearance model)marigold_lighting- Marigold output (lighting model)albedo_source- "appearance" or "lighting"gamma_albedo- Gamma for albedo (0.45)gamma_metal_rough- Gamma for metallic and roughness (2.2)gamma_lighting_ao- Gamma for lighting and AO (0.45)
Outputs:
pbr_pipe- Complete PBR pipeline with albedo, roughness, metallic, lighting
Tips:
- Default
gamma_metal_rough=2.2provides strong contrast; adjust 1.8-2.6 if needed - Default
albedo_source="lighting"provides cleaner albedo; try "appearance" for alternative look gamma_albedoaffects albedo regardless of source (appearance or lighting)
2. PBR Adjuster
Simple brightness/contrast/invert adjustments for individual maps.
Inputs:
- Individual maps (albedo, ao, roughness, metallic)
- Per-map: brightness (0-3x), contrast (0-3x), invert (bool)
Outputs:
- Adjusted versions of input maps
Use Cases:
- Quick map adjustments before combining
- Fine-tune individual channels
3. AO Approximator
Generate ambient occlusion from height + normal maps.
Inputs:
height- Height/displacement map (required)normal- Normal map (optional, improves quality)radius- Sample radius in pixels (8-16 typical)strength- AO intensity (1.0)samples- Quality vs speed (16-32)contrast- Contrast boost (1.0)
Outputs:
ao- Generated ambient occlusion map
Tips:
- More samples = better quality but slower
- Larger radius = broader, softer AO
- Use both height + normal for best results
Pipeline System
4. PBR Combiner
Bundle individual maps into a single PBR_PIPE connection.
Inputs (all optional):
pbr_pipe- Existing pipe to merge withalbedo,normal,ao,height,roughness,metallic,transparency,emission⭐
Outputs:
pbr_pipe- All maps in one bundle
Use Cases:
- Create pipe from individual maps
- Add normal/height to extractor output
- Override specific maps in existing pipe
- Add emission maps for glowing/emissive materials (lights, lava, screens, etc.)
5. PBR Pipeline Adjuster
Advanced batch adjustments with AO integration.
Inputs:
pbr_pipe- PBR pipelineao_strength_albedo(1.0) - Darken albedo with AOao_strength_roughness(0.0) - Add AO to roughness (weathering)roughness_strength(1.0) - Brightness multipliermetallic_strength(1.0) - Brightness multipliernormal_strength(1.0) - Flatten (0.0) or exaggerate (2.0)invert_normal_green- OpenGL ↔ DirectXinvert_transparency- Flip alphaalbedo_dimmer(0.0-1.0) - Darken (1.0 = black)albedo_saturation(1.0) - Color intensity
Outputs:
pbr_pipe- Adjusted pipeline
Tips:
ao_strength_albedo=1.0-1.2for realistic darkeningao_strength_roughness=0.2-0.5for weathered lookalbedo_saturation=1.2-1.5for vibrant colors
6. PBR Splitter
Extract individual maps from PBR_PIPE.
Outputs:
- All map types as separate outputs: albedo, normal, ao, height, roughness, metallic, transparency, emission ⭐
7. PBR Saver 💾
Save complete material sets with auto-naming and enumeration.
Inputs:
pbr_pipe- Pipeline to savebase_name- File prefix (e.g., "bricks")output_path- Folder in ComfyUI/output (default: "pbr_materials")file_format- png, jpg, exr, tiffenumeration_mode- "enumerate" or "overwrite"starting_number- Starting index (1)
Outputs:
images- Batch of all saved maps (for preview)
Example Output:
ComfyUI/output/pbr_materials/
bricks_albedo_001.png
bricks_normal_001.png
bricks_ao_001.png
bricks_roughness_001.png
bricks_metallic_001.png
Tips:
- Auto-detects portable vs standard ComfyUI install
- Connect output to Preview Image to see all maps
- Use EXR for 32-bit precision
8. PBR Pipe Preview
Passthrough node that outputs all maps as a batch for preview.
Inputs:
pbr_pipe- Pipeline to preview
Outputs:
pbr_pipe- Unchanged passthroughpreview_batch- All maps in one batch
Use Cases:
- Debug pipeline at any stage
- Preview without saving
- Quick visual check
9. PBR Material Mixer
Blend two complete PBR materials together.
Inputs:
base_pipe- Base materialoverlay_pipe- Overlay materialblend_mode- mix, multiply, overlay, add, screenblend_strength(0.0-1.0) - Blend amountmask(optional) - Blend mask
Outputs:
pbr_pipe- Mixed material
Use Cases:
- Layer materials (brick + moss)
- Create material variations
- Mask-based blending
Normal & Height Processing
10. Normal Processor (Lotus)
Process Lotus normal maps with channel control.
Inputs:
normal- Lotus outputinvert_red,invert_green,invert_blue- Per-channel inversionstrength(0.0-2.0) - Normal intensity
Outputs:
normal- Processed normal map
Tips:
invert_green=Truefor OpenGL format- Adjust
strengthto flatten or exaggerate bumps
11. Normal Map Combiner
Combine two normal maps using proper math.
Inputs:
base_normal- Primary normaldetail_normal- Detail to addblend_mode- reoriented (best), whiteout, lineardetail_strength(0.0-2.0) - Detail intensity
Outputs:
combined_normal- Blended normal
Use Cases:
- Add micro-detail to base normals
- Layer multiple detail passes
- Combine procedural + photo normals
12. Normal to Depth Converter
Convert normal maps to height/depth maps.
Inputs:
normal- Normal mapmethod- integration (accurate), blue_channel (fast), hybrid (balanced)strength(1.0) - Depth intensityiterations(50) - Integration accuracyblur_radius(1.0) - Smoothing
Outputs:
depth- Generated depth/height map
Tips:
- Use "hybrid" for best speed/quality balance
- More iterations = more accurate but slower
13. Height to Normal Converter ⭐ NEW
Generate normal maps from height/depth maps.
Inputs:
height- Height/displacement mapstrength(1.0) - Normal map intensitymethod- sobel (balanced), scharr (detailed), prewitt (smooth)
Outputs:
normal- Generated normal map
Use Cases:
- Create normals from Lotus depth output
- Generate normals from procedural height
- Convert displacement to normal
14. Normal Format Converter (DX↔GL) ⭐ NEW
Convert between DirectX and OpenGL normal map formats.
Inputs:
normal- Normal mapconversion- DirectX_to_OpenGL, OpenGL_to_DirectX, auto_detect
Outputs:
normal- Converted normal map
Tips:
- Flips green (Y) channel
- Use when normals look inverted
- Most game engines use OpenGL
15. Normal Format Validator (OGL vs DX) ⭐ NEW
Automatically detects and validates normal map format (OpenGL vs DirectX).
Inputs:
normal_map- Normal map to analyze
Outputs:
visualization- 4-panel visual analysis- Panel 1: Original normal map
- Panel 2: Green channel isolated
- Panel 3: Threshold map (white=up, black=down)
- Panel 4: Format indicator (green=OGL, red=DX)
detected_format- String result with confidence
Detection Method:
- Analyzes green channel distribution
- OpenGL: More pixels > 0.5 (Y points UP)
- DirectX: More pixels < 0.5 (Y points DOWN)
- Confidence based on bias strength
Console Output:
📊 GREEN CHANNEL ANALYSIS:
Pixels > 0.5: 73.2% (up-facing)
Pixels < 0.5: 26.8% (down-facing)
Bias: +0.464
🎯 DETECTION RESULT:
Format: OpenGL
Confidence: High
Confidence Levels:
- High (>20% bias) - Very clear format
- Medium (10-20%) - Likely correct
- Low (5-10%) - Uncertain
- Ambiguous (<5%) - Flat map or balanced normals
Use Cases:
- Verify normals from unknown sources
- Debug "why does my normal map look wrong?"
- QA for asset pipelines
- Educational tool
Tips:
- Check visualization if result is ambiguous
- Flat normal maps may return AMBIGUOUS
- Use with "Normal Format Converter" for fixing
Color & Effects
16. Color Ramp 🎨✨
Map grayscale to colors with visual gradient preview (like Blender!).
Features:
- 🌈 Real-time gradient preview in node
- 🎯 Interactive color stop markers (click to add, double-click to remove)
- 🎨 Click color swatches to open color picker
- ↔️ Drag markers to reposition
- 📋 8 built-in presets
Inputs:
image- Input (converts to grayscale)preset- grayscale, heat, rainbow, gold_metal, rust, copper, blue_metal, custominterpolation- linear, ease_in, ease_out, constantcolor_stops- JSON data (managed by visual widget)
Outputs:
image- Recolored output
Presets:
heat- Black → Red → Orange → Yellow (data visualization)rainbow- Full spectrumgold_metal- Dark bronze → Gold → Brightrust,copper,blue_metal- Metallic variations
Use Cases:
- Stylized albedo from AO/height
- Heat map visualizations
- Quick color variations
- Artistic effects
17. Simple Recolor
Quick two-color gradient.
Inputs:
dark_color,light_color- RGB valuesblend_mode- linear or smooth
17. HSV Adjuster ⭐ NEW
Adjust hue, saturation, and value (better than RGB adjustments).
Inputs:
image- Input imagehue_shift(-0.5 to 0.5) - Rotate color wheelsaturation(0.0-3.0) - Color intensity (0=grayscale, >1=vivid)value(0.0-3.0) - Brightness
Outputs:
image- Adjusted image
Use Cases:
- Color grade albedo
- Create material variations
- Adjust saturation without affecting brightness
- Preserve material properties better than RGB
18. Curvature Map Generator ⭐ NEW
Detect edges and crevices for wear/weathering masks.
Inputs:
input_map- Normal or height mapinput_type- normal or heightstrength(1.0) - Detection sensitivityblur_radius(1.0) - Smoothing
Outputs:
curvature- Edge detection mask
Use Cases:
- Create wear masks (edges = more wear)
- Procedural damage
- Detail masking
- AO enhancement
19. Detail Map Blender ⭐ NEW
Add micro-detail without washing out base maps.
Inputs:
base- Base mapdetail- Detail mapmap_type- normal (RNM blend), roughness (multiply), generic (overlay)strength(1.0) - Detail intensitymask(optional) - Blend mask
Outputs:
blended- Combined map
Tips:
- Use
map_type=normalfor proper normal blending - Use
map_type=roughnessfor surface detail - Mask controls where detail appears
20. Wear & Edge Damage Generator ⭐ NEW
Procedural wear and weathering effects.
Inputs:
albedo- Base albedowear_strength(0.5) - Overall wearedge_wear(0.7) - Damage on edges (needs curvature)dirt_strength(0.3) - Dirt in crevices (needs AO)curvature(optional) - For edge detectionao(optional) - For cavity dirt
Outputs:
worn_albedo- Weathered albedowear_mask- Mask showing wear areas
Use Cases:
- Realistic weathering
- Procedural damage
- Aged materials
- Dirt accumulation
21. Gradient Map (Mask) ⭐ NEW
Create selection masks from value ranges.
Inputs:
image- Input mapinput_range_min,input_range_max- Value range to selectinvert- Flip masksmoothness(0.0-0.5) - Edge softness
Outputs:
mask- Selection mask
Use Cases:
- Select height ranges
- Isolate value ranges
- Create soft selections
- Layer masking
Texture Utilities
22. Texture Offset ⭐ NEW
Offset, rotate, and wrap textures with seamless tiling support and edge mask.
Inputs:
image- Input textureoffset_x(-1.0 to 1.0) - Horizontal shift (fraction of width)offset_y(-1.0 to 1.0) - Vertical shift (fraction of height)rotation(-360° to 360°) - Rotation anglewrap_mode- repeat (tile), clamp (extend), mirror (reflect)edge_mask_width(0.1) - Edge mask width for affected areas
Outputs:
image- Offset/rotated textureedge_mask- White mask showing transformed/affected edges
Wrap Modes:
- repeat - True circular/seamless wrapping (perfect for tileable textures)
- clamp - Extends edge pixels (useful for bordered images)
- mirror - Reflects at edges (creates symmetrical patterns)
Technical Note:
repeatmode usestorch.roll()for offset (perfect circular wrapping)repeatmode with rotation tiles 3x3, rotates, then crops center (maintains seamless edges!)- Other modes use PyTorch's
grid_sample()with border/reflection padding
Use Cases:
- Adjust texture alignment for UV mapping
- Test tiling at different offsets
- Rotate textures without re-rendering
- Fix texture orientation issues
Tips:
- Use
repeatmode for seamless textures (maintains tiling even with rotation!) offset_x/y = 0.5shifts by half (useful for seam testing)- Combine with Seamless Tiling for perfect results
23. Texture Tiler ⭐ NEW
Create grid of repeated textures (2x2, 3x3, etc.) with two modes.
Inputs:
image- Input texturetile_x(1-8) - Horizontal tile counttile_y(1-8) - Vertical tile countscale_to_input(False) - Scale output back to input size
Outputs:
image- Tiled grid texture
Two Modes:
Mode 1: Scale to Input OFF (default)
- Output size = Input × (tile_x, tile_y)
- Example: 512×512 input, 3×3 tiles → 1536×1536 output
- Use for: Creating large texture sheets, high-res previews
Mode 2: Scale to Input ON
- Output size = Input size (each tile is smaller)
- Example: 512×512 input, 3×3 tiles → 512×512 output (tiles are 170×170)
- Use for: Previewing tiling density, testing scale variations
Use Cases:
- Preview how textures tile at different scales
- Create larger texture sheets (scale OFF)
- Test seamless tiling quality
- Visualize density/frequency (scale ON)
Tips:
- Scale OFF: Best for checking seams at full quality
- Scale ON: Best for seeing overall tiling pattern/density
- Use after Seamless Tiling Maker to preview results
- 2x2 is ideal for checking seams
- Larger grids (4x4+) useful with scale ON to see pattern repetition
Example Workflows:
MODE 1 (Large Preview):
Load Texture (512×512)
↓
Seamless Tiling Maker
↓
Texture Tiler (3x3, scale_to_input: OFF)
↓
Preview (1536×1536 - see all tiles at full size!)
MODE 2 (Density Preview):
Load Texture (512×512)
↓
Seamless Tiling Maker
↓
Texture Tiler (4x4, scale_to_input: ON)
↓
Preview (512×512 - see how dense the pattern looks!)
24. Texture Equalizer ⭐ NEW
Remove uneven lighting and shadows from textures using High Pass technique.
Inputs:
image- Texture with uneven lighting/shadowsradius(100) - High pass radius for detail preservation (50-150 typical)strength(1.0) - Effect intensity (0.0=off, 1.0=full, 2.0=exaggerated)preserve_color(True) - Keep original hue/saturation, only fix brightnessmethod(overlay) - Blend method: overlay, soft_light, or linear_light
Outputs:
image- Equalized texture with normalized lightingaverage_color- Extracted average color (for debugging/visualization)
How It Works: Based on the professional Photoshop technique:
- Extracts average color from texture
- Applies High Pass filter to isolate details
- Inverts high pass and blends using selected method
- Optionally preserves original color hue
Parameters Explained:
Radius (50-150):
- 50 - Gentle correction, preserves gradients
- 100 - Standard correction ⭐ (recommended)
- 150 - Aggressive flattening, removes all gradients
Strength (0.0-2.0):
- 0.0 - No effect (original)
- 0.5 - Subtle correction
- 1.0 - Full correction ⭐
- 2.0 - Exaggerated/stylized
Preserve Color:
- ON - Keeps original hue/saturation, fixes only brightness (recommended for albedo)
- OFF - Full equalization including color shifts (useful for height maps)
Method (Blend Mode):
- overlay - Photoshop standard method ⭐ (recommended)
- Balanced correction, works well for most textures
- Matches the classic Photoshop equalization tutorial
- soft_light - Gentle, subtle correction
- Less aggressive than overlay
- Good for textures with mild lighting issues
- linear_light - Strong, aggressive correction
- Maximum correction power
- Use for heavily shadowed textures
Use Cases:
- Remove shadows from photos taken in uneven lighting
- Clean up scanned textures
- Prepare textures for seamless tiling (remove lighting variations)
- Normalize albedo maps before PBR extraction
- Fix height maps with lighting baked in
- Remove vignetting from camera photos
Perfect For:
- Photos with directional lighting
- Textures with cast shadows
- Camera vignetting (darker edges)
- Uneven illumination from lighting setup
- Baked lighting in scans
Before/After Examples:
BEFORE: Photo with shadow on left side, bright on right
AFTER: Evenly lit, shadow removed, details preserved!
BEFORE: Scanned texture with dark edges (vignetting)
AFTER: Uniform brightness edge-to-edge
BEFORE: Height map with baked shadows
AFTER: Clean height data, no lighting artifacts
Pro Tips:
- Start with
radius: 100, strength: 1.0, preserve_color: ON - For subtle effects, reduce strength to 0.5-0.7
- For aggressive flattening, increase radius to 150+
- Always enable
preserve_colorfor albedo/diffuse maps - Disable
preserve_colorfor grayscale maps (height, roughness, etc.) - Apply BEFORE making texture seamless for best results
Troubleshooting:
- Output too dark/black:
- Try method="overlay" instead of linear_light ⭐
- Check console output for value ranges
- View
average_coloroutput to verify extraction - Try lower radius (30-70)
- Try lower strength (0.5-0.7)
- Output washed out:
- Increase radius or strength
- Try method="linear_light" for stronger correction
- Colors look wrong: Enable
preserve_color - Not enough effect:
- Increase radius to 150-200
- Try method="linear_light"
- Increase strength to 1.5-2.0
Workflow:
Load Photo (uneven lighting)
↓
Texture Equalizer
├─ radius: 100
├─ strength: 1.0
└─ preserve_color: ON
↓
Seamless Tiling Maker
↓
PBR Extractor
↓
Perfect material with no shadow artifacts!
Reference: Based on Tolas' Photoshop technique
26. Seamless Tiling Maker
Make textures tile seamlessly with edge mask for inpainting.
Inputs:
image- Input texturemethod- mirror (fast), blend_edges (best), offset (simple)blend_width(0.1) - Edge blend width and mask feathering
Outputs:
image- Seamless textureedge_mask- White mask showing edge/seam regions (for inpainting)
Methods:
mirror- Flip and average (fast, good for organic)blend_edges- Smooth edge transitions (best quality)offset- Shift by half (creates center cross seam)
Edge Mask:
- White (1.0) at edges/seams where inpainting would help
- Black (0.0) in center where texture is unchanged
- Gradient based on
blend_widthparameter - Perfect for: Inpainting cleanup, selective processing, edge detection
Use Cases:
- Game textures (seamless + inpaint mask)
- Repeating materials
- Inpainting cleanup (use mask to target seams)
- Tile-able patterns
27. Square Maker ⭐ NEW
Convert any image to a perfect square by cropping or scaling.
Inputs:
image- Input texture (any dimensions)method- crop (maintain aspect) or scale (stretch)square_size- shortest_edge, longest_edge, or customcustom_size(1024) - Custom square size (64-8192, multiples of 64)crop_position- 9 positions for crop alignmentscaling_method- bicubic, bilinear, lanczos, nearest
Outputs:
image- Perfect square image
Methods:
Crop (Recommended):
- Maintains aspect ratio
- Removes excess from edges
- No distortion
- Choose from 9 crop positions:
Top Left | Top Center | Top Right Middle Left | Center | Middle Right Bottom Left | Bottom Center | Bottom Right
Scale:
- Stretches to square
- No content loss
- May distort image
- Useful when all content must be preserved
Square Size Modes:
shortest_edge ⭐ Recommended for crop:
- Square size = shortest dimension
- Example: 1920×1080 → 1080×1080 (crops width)
- No quality loss, only crops excess
longest_edge:
- Square size = longest dimension
- Example: 1920×1080 → 1920×1920 (upscales height if crop, or uses 1920 if custom)
- May upscale one dimension
custom:
- Specify exact square size
- Scales to match, then crops if needed
- Perfect for specific requirements (512, 1024, 2048, etc.)
Use Cases:
- AI models requiring square inputs (Stable Diffusion, etc.)
- Game engines with square texture requirements
- Instagram/social media (square format)
- Cube maps and skyboxes
- Preparing textures for tiling
Examples:
Example 1: Landscape to Square (Crop Center)
Input: 1920×1080 (landscape photo)
Settings:
- method: crop
- square_size: shortest_edge
- crop_position: center
Output: 1080×1080 (center portion, no distortion)
Example 2: Portrait to Square (Crop Top Center)
Input: 1080×1920 (portrait photo, face at top)
Settings:
- method: crop
- square_size: shortest_edge
- crop_position: top_center
Output: 1080×1080 (top portion with face)
Example 3: Exact Size for AI Model
Input: 3000×2000 (any size)
Settings:
- method: crop
- square_size: custom
- custom_size: 1024
- crop_position: center
Output: 1024×1024 (perfect for SD)
Example 4: Stretch to Square
Input: 1920×1080
Settings:
- method: scale
- square_size: longest_edge
Output: 1920×1920 (stretched, all content preserved)
Pro Tips:
- Use crop + shortest_edge for no quality loss
- Use center position for most images
- Use top_center for portraits (keeps faces)
- Use bottom_center for landscapes (keeps ground)
- Combine with Smart Texture Resizer for GPU-optimized squares
- Use custom size for specific AI model requirements
Workflow Example:
Load Image (any size)
↓
Square Maker
├─ method: crop
├─ square_size: custom
├─ custom_size: 1024
└─ crop_position: center
↓
Smart Texture Resizer (optional)
├─ target_megapixels: 1.0
└─ multiple_of: 64
↓
Perfect 1024×1024 texture, GPU-optimized!
28. Smart Texture Resizer ⭐ NEW
Intelligently resize textures to optimal GPU-friendly resolutions.
Inputs:
image- Input texturetarget_megapixels(0.25-16.0 MP) - Target size in megapixelsmultiple_of- 4, 8, 16, 32, 64, 128, 256 (ensures dimensions are multiples)resize_mode- fit_within, fit_exact, no_upscalescaling_method- bicubic, bilinear, lanczos, nearest
Outputs:
image- Optimized texture
Resize Modes:
- fit_within - Stay under target MP, never exceed (safe for VRAM limits)
- fit_exact - Get as close to target MP as possible
- no_upscale - Only downscale, never increase size
Multiple Benefits:
- 32 - Standard GPU optimization (recommended for most textures)
- 64 - Extra GPU friendly, some game engines prefer this
- 16 - Good for smaller textures
- 8 - AI model compatibility (Stable Diffusion, etc.)
- 4 - Minimum GPU alignment
Why This Matters:
- GPUs process textures most efficiently at multiples of 32
- Game engines often require power-of-2 or specific multiples
- Reduces VRAM waste and improves performance
- AI models (SD, ControlNet) often need multiples of 8/64
Examples:
Input: 1920×1080 (2.07 MP, not GPU optimized)
Target: 2.0 MP, multiple_of: 32
Output: 1536×864 (1.33 MP, both divisible by 32!)
Input: 4096×4096 (16.7 MP, too large)
Target: 4.0 MP, multiple_of: 64
Output: 2048×2048 (4.2 MP, perfect square, divisible by 64!)
Input: 3000×2000 (6.0 MP, odd dimensions)
Target: 4.0 MP, multiple_of: 32, mode: fit_within
Output: 1920×1280 (2.46 MP, GPU optimized)
Use Cases:
- Optimize textures for game engines
- Prepare images for AI models (SD needs multiples of 8/64)
- Reduce VRAM usage while maintaining quality
- Ensure GPU-friendly dimensions automatically
29. Texture Scaler
Manual texture resolution scaling.
Inputs:
image- Input texturescale_factor(0.125-8.0x) - Size multipliermethod- nearest (pixel art), bilinear (fast), bicubic (quality), lanczos (best)
Outputs:
image- Scaled texture
Tips:
- Use
nearestfor pixel art preservation - Use
bicubicorlanczosfor photographic textures - Scale up to 8x or down to 0.125x
- For GPU optimization, use Smart Texture Resizer instead
30. Triplanar Projection ⭐ NEW
Remove UV seams with XYZ projection blending.
Inputs:
image- Input textureblend_sharpness(1.0) - Transition sharpnessscale(1.0) - Texture tiling
Outputs:
image- Projected texture
Use Cases:
- Remove UV seams
- Organic surfaces
- Procedural textures
- Seamless projections
Channel Tools
31. Grayscale to Color ⭐ NEW
Convert grayscale images to RGB by repeating the channel.
Inputs:
grayscale- Single-channel grayscale image
Outputs:
color- RGB image (grayscale repeated across R, G, B)
Use Cases:
- Convert height/AO maps to RGB for display
- Prepare grayscale for nodes requiring RGB input
- Visualization purposes
32. Color to Grayscale ⭐ NEW
Convert RGB images to grayscale using various methods.
Inputs:
color- RGB imagemethod- luminance (perceptual), average, lightness, red_only, green_only, blue_only
Outputs:
grayscale- Grayscale image (as RGB for display)
Methods:
- luminance - Perceptual (Rec. 709: 0.2126R + 0.7152G + 0.0722B) - Best for photos
- average - Simple average (R+G+B)/3 - Fast
- lightness - (max+min)/2 - Preserves brightness range
- red/green/blue_only - Extract single channel
Use Cases:
- Convert albedo to grayscale for masks
- Create height maps from photos
- Channel extraction
33. Channel Packer (RGB)
Pack 3 grayscale maps into RGB channels (saves VRAM).
Inputs:
red_channel- Grayscale map for Rgreen_channel(optional) - For Gblue_channel(optional) - For Bpreset- custom, orm_unity, orm_unreal, rma
Outputs:
packed- RGB packed image
Common Packing:
- ORM (Unity): AO(R) + Roughness(G) + Metallic(B)
- RMA: Roughness(R) + Metallic(G) + AO(B)
Use Cases:
- Reduce texture count for games
- Save VRAM
- Standard game engine formats
34. Channel Unpacker (RGB)
Extract RGB channels back to grayscale maps.
Inputs:
packed- RGB packed imageoutput_channels- all, r_only, g_only, b_only, rg, rb, gb
Outputs:
red,green,blue- Extracted channels (as RGB for display)
Use Cases:
- Extract from packed textures
- Separate channels for editing
- Convert ORM back to individual maps
35. Channel Packer (ORMA) ⭐ NEW
Advanced ORM packing with alpha channel support.
Inputs:
occlusion- AO map (R channel)roughness- Roughness map (G channel)metallic- Metallic map (B channel)alpha(optional) - Transparency/mask (A channel, defaults to 1.0 if not provided)
Outputs:
orma_packed- RGBA packed image
Format:
- R - Occlusion (AO)
- G - Roughness
- B - Metallic
- A - Alpha (transparency/mask)
Use Cases:
- Game engines with transparency support
- Vegetation/foliage materials (alpha for cutout)
- Decals with transparency
- Advanced material packing with masks
Advantage over ORM:
- Supports transparency/opacity maps
- Perfect for masked materials
- 4 maps in 1 texture!
36. Channel Packer (RMA) ⭐ NEW
Pack RMA format (alternative to ORM).
Inputs:
roughness- Roughness map (R channel)metallic- Metallic map (G channel)ao- Ambient Occlusion map (B channel)
Outputs:
rma_packed- RGB packed image
Format:
- R - Roughness
- G - Metallic
- B - AO (Ambient Occlusion)
Use Cases:
- Some game engines prefer RMA over ORM
- Alternative channel layout
- Consistency with certain workflows
RMA vs ORM:
- RMA: Roughness, Metallic, AO
- ORM: AO, Roughness, Metallic
- Same maps, different channel order
37. Channel Packer (RMAA) ⭐ NEW
Advanced RMA packing with alpha channel support.
Inputs:
roughness- Roughness map (R channel)metallic- Metallic map (G channel)ao- AO map (B channel)alpha(optional) - Transparency/mask (A channel, defaults to 1.0 if not provided)
Outputs:
rmaa_packed- RGBA packed image
Format:
- R - Roughness
- G - Metallic
- B - AO (Ambient Occlusion)
- A - Alpha (transparency/mask)
Use Cases:
- RMA format with transparency support
- Vegetation/foliage materials (alpha for cutout)
- Decals with transparency
- Alternative to ORMA with different channel order
RMAA vs ORMA:
- RMAA: Roughness, Metallic, AO, Alpha
- ORMA: AO, Roughness, Metallic, Alpha
- Both support 4 channels, different channel order preference
38. Channel Unpacker (RMA) ⭐ NEW
Unpack RMA format back to individual maps.
Inputs:
rma_packed- RGB packed RMA image
Outputs:
roughness- Extracted roughness (as RGB for display)metallic- Extracted metallic (as RGB for display)ao- Extracted AO (as RGB for display)
Use Cases:
- Extract from RMA packed textures
- Edit individual RMA channels
- Convert RMA to separate maps for processing
Additional Processing
39. Height Processor (Lotus)
Process Lotus depth output.
Inputs:
lotus_depth- Lotus outputinvert- Flip valuesbit_depth- 8, 16, or 32-bit
Outputs:
height- Processed height map
💡 Emission Maps
NEW in v2.1! Full emission map support throughout the PBR pipeline.
What are Emission Maps?
- Self-illuminated/glowing parts of materials
- Used for lights, screens, lava, neon signs, glowing eyes, etc.
- Not affected by scene lighting
Usage:
Load Emission Texture
↓
PBR Combiner
├─ albedo: (your albedo)
├─ normal: (your normal)
├─ roughness: (your roughness)
├─ metallic: (your metallic)
└─ emission: (glowing parts) ⭐
↓
PBR Pipe → Game Engine
Common Uses:
- Screens/Monitors - Emissive UI elements
- Lights - Light fixtures, bulbs, LEDs
- Lava/Fire - Glowing hot materials
- Neon Signs - Bright glowing text
- Sci-Fi - Glowing panels, energy effects
- Magic Effects - Glowing runes, spells
Workflow Example:
Albedo → Brightness/Contrast → Mask bright areas → Emission map
↓
PBR Combiner (emission input)
🎮 Example Workflows
⚡ Quick Start (Fastest)
Load Image
↓
├─> Marigold (appearance) ─┐
└─> Marigold (lighting) ────┼─> PBR Extractor ──> PBR Saver ──> Preview Image
│ (pbr_pipe) (images) (view all)
└─ Done in 3 nodes!
🎯 Complete Workflow (Recommended)
Load Image
↓
├─> Marigold (appearance) ─┐
├─> Marigold (lighting) ────┼─> PBR Extractor ──> pbr_pipe ─┐
├─> Lotus (normal) ─────────┤ │
└─> Lotus (height) ─────────┘ ↓
PBR Combiner (merge)
├─ pbr_pipe
├─ normal (Lotus)
└─ height (Lotus)
↓
Height to Normal ──┐
(generate backup) │
↓ ↓
PBR Pipeline Adjuster
├─ ao_strength_albedo: 1.0
├─ roughness_strength: 1.2
├─ albedo_saturation: 1.1
└─ normal_strength: 1.0
↓
PBR Pipe Preview ──> Preview
(check before save)
↓
PBR Saver
├─ base_name: "material_name"
└─ format: png
↓
Preview Image
(final review)
🎨 Advanced: Material Mixing
Material A (pbr_pipe) ─┐
├─> PBR Material Mixer ──> mixed_pipe
Material B (pbr_pipe) ─┤ ├─ blend_mode: overlay
Mask (optional) ───────┘ ├─ strength: 0.5
└─ mask: (optional)
🛠️ Advanced: Weathering & Wear
PBR Pipe ──> Curvature Generator ──┐
(from normal/height) │
├─> Wear Generator ──> worn_pipe
AO Map ───────────────────────────┘ ├─ edge_wear: 0.7
├─ dirt_strength: 0.3
└─ wear_strength: 0.5
📦 Advanced: Channel Packing
Roughness ──┐
├─> Channel Packer ──> ORM_packed.png
Metallic ───┤ (preset: orm_unity)
AO ─────────┘ R=AO, G=Roughness, B=Metallic
🎨 Advanced: Stylized Materials
Height Map ──> Gradient Map ──> Color Ramp ──> Stylized Albedo
├─ min: 0.2 (heat preset)
└─ max: 0.8
💡 Pro Tips
Extraction & Quality
- Washed out maps? Adjust
gamma_metal_rough(try 1.2-1.6) - Better AO? Use AO Approximator with height + normal, 24-32 samples
- Sharper normals? Use
method=scharrin Height to Normal converter - Cross-platform normals? Use Normal Format Converter
Material Enhancement
- Realistic wear: Curvature Generator → Wear Generator (edge_wear=0.7)
- Weathering: Set
ao_strength_roughness=0.3in Pipeline Adjuster - Add detail: Detail Map Blender with RNM mode for normals
- Seamless textures: Seamless Tiling Maker with blend_edges method
Color & Appearance
- Color variations: HSV Adjuster (hue_shift for different colors)
- Vibrant materials: Increase
albedo_saturation(1.2-1.5) - Stylized look: Color Ramp with custom gradients or presets
- Heat maps: Color Ramp heat preset on AO or height
Workflow Optimization
- Clean workflow: Use Pipeline system (fewer connections)
- Debug easily: PBR Pipe Preview at any stage
- Batch materials: PBR Saver enumerate mode
- Save VRAM: Channel Packer for ORM textures
Advanced Techniques
- Layer materials: PBR Material Mixer with masks
- Procedural damage: Gradient Map → Color Ramp → Wear Generator
- Detail layers: Base → Detail Map Blender (x3) → fine detail
- Smart masks: Curvature + Gradient Map for precise selections
🎯 Common Use Cases
Game Development
- Optimize textures: Channel Packer (ORM format)
- Tile-able materials: Seamless Tiling Maker
- LOD textures: Texture Scaler for multiple resolutions
- Batch export: PBR Saver with enumerate mode
Architectural Visualization
- Weathered materials: Wear Generator + Curvature
- Detail enhancement: Detail Map Blender
- Material variations: HSV Adjuster + Material Mixer
- High precision: Save as EXR (32-bit)
3D Printing
- Height maps: Normal to Depth Converter
- Clean normals: Normal Format Converter
- Seamless patterns: Seamless Tiling Maker + Triplanar Projection
VFX & Film
- Material layering: Material Mixer with masks
- Procedural aging: Wear Generator + Gradient Maps
- Color grading: HSV Adjuster + Color Ramp
- High-res export: Texture Scaler + EXR format
🔧 Technical Details
PBR_PIPE Format
Internal dictionary structure:
{
'albedo': IMAGE tensor,
'normal': IMAGE tensor,
'ao': IMAGE tensor,
'height': IMAGE tensor,
'roughness': IMAGE tensor,
'metallic': IMAGE tensor,
'lighting': IMAGE tensor,
'transparency': IMAGE tensor
}
Image Formats
- PNG: 8-bit, standard
- JPG: 8-bit, compressed
- EXR: 16/32-bit, lossless
- TIFF: 16-bit, compatible
Performance Notes
- Color Ramp: Fully GPU-accelerated (100x faster than v1.0)
- Channel Packing: Instant, no quality loss
- Integration methods: CPU-intensive (Normal to Depth hybrid mode recommended)
- Wear Generator: GPU-accelerated, scales with resolution
✅ Requirements
Included with ComfyUI:
- PyTorch (GPU acceleration)
- PIL (image I/O)
- NumPy (array processing)
- imageio (format support)
Optional for source inputs: