Files
2025-12-02 16:54:15 -08:00

1385 lines
41 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
1. Copy `ComfyUI_PBR_MaterialProcessor` folder to `ComfyUI/custom_nodes/`
2. Restart ComfyUI
3. 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 ]([url](https://github.com/kijai/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.2` provides strong contrast; adjust 1.8-2.6 if needed
- Default `albedo_source="lighting"` provides cleaner albedo; try "appearance" for alternative look
- `gamma_albedo` affects 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 with
- `albedo`, `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 pipeline
- `ao_strength_albedo` (1.0) - Darken albedo with AO
- `ao_strength_roughness` (0.0) - Add AO to roughness (weathering)
- `roughness_strength` (1.0) - Brightness multiplier
- `metallic_strength` (1.0) - Brightness multiplier
- `normal_strength` (1.0) - Flatten (0.0) or exaggerate (2.0)
- `invert_normal_green` - OpenGL ↔ DirectX
- `invert_transparency` - Flip alpha
- `albedo_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.2` for realistic darkening
- `ao_strength_roughness=0.2-0.5` for weathered look
- `albedo_saturation=1.2-1.5` for 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 save
- `base_name` - File prefix (e.g., "bricks")
- `output_path` - Folder in ComfyUI/output (default: "pbr_materials")
- `file_format` - png, jpg, exr, tiff
- `enumeration_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 passthrough
- `preview_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 material
- `overlay_pipe` - Overlay material
- `blend_mode` - mix, multiply, overlay, add, screen
- `blend_strength` (0.0-1.0) - Blend amount
- `mask` (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 output
- `invert_red`, `invert_green`, `invert_blue` - Per-channel inversion
- `strength` (0.0-2.0) - Normal intensity
**Outputs:**
- `normal` - Processed normal map
**Tips:**
- `invert_green=True` for OpenGL format
- Adjust `strength` to flatten or exaggerate bumps
#### 11. **Normal Map Combiner**
Combine two normal maps using proper math.
**Inputs:**
- `base_normal` - Primary normal
- `detail_normal` - Detail to add
- `blend_mode` - reoriented (best), whiteout, linear
- `detail_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 map
- `method` - integration (accurate), blue_channel (fast), hybrid (balanced)
- `strength` (1.0) - Depth intensity
- `iterations` (50) - Integration accuracy
- `blur_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 map
- `strength` (1.0) - Normal map intensity
- `method` - 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 map
- `conversion` - 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, custom
- `interpolation` - linear, ease_in, ease_out, constant
- `color_stops` - JSON data (managed by visual widget)
**Outputs:**
- `image` - Recolored output
**Presets:**
- `heat` - Black → Red → Orange → Yellow (data visualization)
- `rainbow` - Full spectrum
- `gold_metal` - Dark bronze → Gold → Bright
- `rust`, `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 values
- `blend_mode` - linear or smooth
#### 17. **HSV Adjuster** ⭐ NEW
Adjust hue, saturation, and value (better than RGB adjustments).
**Inputs:**
- `image` - Input image
- `hue_shift` (-0.5 to 0.5) - Rotate color wheel
- `saturation` (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 map
- `input_type` - normal or height
- `strength` (1.0) - Detection sensitivity
- `blur_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 map
- `detail` - Detail map
- `map_type` - normal (RNM blend), roughness (multiply), generic (overlay)
- `strength` (1.0) - Detail intensity
- `mask` (optional) - Blend mask
**Outputs:**
- `blended` - Combined map
**Tips:**
- Use `map_type=normal` for proper normal blending
- Use `map_type=roughness` for surface detail
- Mask controls where detail appears
#### 20. **Wear & Edge Damage Generator** ⭐ NEW
Procedural wear and weathering effects.
**Inputs:**
- `albedo` - Base albedo
- `wear_strength` (0.5) - Overall wear
- `edge_wear` (0.7) - Damage on edges (needs curvature)
- `dirt_strength` (0.3) - Dirt in crevices (needs AO)
- `curvature` (optional) - For edge detection
- `ao` (optional) - For cavity dirt
**Outputs:**
- `worn_albedo` - Weathered albedo
- `wear_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 map
- `input_range_min`, `input_range_max` - Value range to select
- `invert` - Flip mask
- `smoothness` (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 texture
- `offset_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 angle
- `wrap_mode` - repeat (tile), clamp (extend), mirror (reflect)
- `edge_mask_width` (0.1) - Edge mask width for affected areas
**Outputs:**
- `image` - Offset/rotated texture
- `edge_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:**
- `repeat` mode uses `torch.roll()` for offset (perfect circular wrapping)
- `repeat` mode 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 `repeat` mode for seamless textures (maintains tiling even with rotation!)
- `offset_x/y = 0.5` shifts 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 texture
- `tile_x` (1-8) - Horizontal tile count
- `tile_y` (1-8) - Vertical tile count
- `scale_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/shadows
- `radius` (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 brightness
- `method` (overlay) - Blend method: overlay, soft_light, or linear_light
**Outputs:**
- `image` - Equalized texture with normalized lighting
- `average_color` - Extracted average color (for debugging/visualization)
**How It Works:**
Based on the professional [Photoshop technique](https://tolas.wordpress.com/2009/05/26/tutorial-how-to-equalize-textures-in-photoshop/):
1. Extracts average color from texture
2. Applies High Pass filter to isolate details
3. Inverts high pass and blends using selected method
4. 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_color` for albedo/diffuse maps
- Disable `preserve_color` for 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_color` output 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](https://tolas.wordpress.com/2009/05/26/tutorial-how-to-equalize-textures-in-photoshop/)
#### 26. **Seamless Tiling Maker**
Make textures tile seamlessly with edge mask for inpainting.
**Inputs:**
- `image` - Input texture
- `method` - mirror (fast), blend_edges (best), offset (simple)
- `blend_width` (0.1) - Edge blend width and mask feathering
**Outputs:**
- `image` - Seamless texture
- `edge_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_width` parameter
- 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 custom
- `custom_size` (1024) - Custom square size (64-8192, multiples of 64)
- `crop_position` - 9 positions for crop alignment
- `scaling_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 texture
- `target_megapixels` (0.25-16.0 MP) - Target size in megapixels
- `multiple_of` - 4, 8, 16, 32, 64, 128, 256 (ensures dimensions are multiples)
- `resize_mode` - fit_within, fit_exact, no_upscale
- `scaling_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 texture
- `scale_factor` (0.125-8.0x) - Size multiplier
- `method` - nearest (pixel art), bilinear (fast), bicubic (quality), lanczos (best)
**Outputs:**
- `image` - Scaled texture
**Tips:**
- Use `nearest` for pixel art preservation
- Use `bicubic` or `lanczos` for 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 texture
- `blend_sharpness` (1.0) - Transition sharpness
- `scale` (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 image
- `method` - 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 R
- `green_channel` (optional) - For G
- `blue_channel` (optional) - For B
- `preset` - 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 image
- `output_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 output
- `invert` - Flip values
- `bit_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
1. **Washed out maps?** Adjust `gamma_metal_rough` (try 1.2-1.6)
2. **Better AO?** Use AO Approximator with height + normal, 24-32 samples
3. **Sharper normals?** Use `method=scharr` in Height to Normal converter
4. **Cross-platform normals?** Use Normal Format Converter
### Material Enhancement
5. **Realistic wear:** Curvature Generator → Wear Generator (edge_wear=0.7)
6. **Weathering:** Set `ao_strength_roughness=0.3` in Pipeline Adjuster
7. **Add detail:** Detail Map Blender with RNM mode for normals
8. **Seamless textures:** Seamless Tiling Maker with blend_edges method
### Color & Appearance
9. **Color variations:** HSV Adjuster (hue_shift for different colors)
10. **Vibrant materials:** Increase `albedo_saturation` (1.2-1.5)
11. **Stylized look:** Color Ramp with custom gradients or presets
12. **Heat maps:** Color Ramp heat preset on AO or height
### Workflow Optimization
13. **Clean workflow:** Use Pipeline system (fewer connections)
14. **Debug easily:** PBR Pipe Preview at any stage
15. **Batch materials:** PBR Saver enumerate mode
16. **Save VRAM:** Channel Packer for ORM textures
### Advanced Techniques
17. **Layer materials:** PBR Material Mixer with masks
18. **Procedural damage:** Gradient Map → Color Ramp → Wear Generator
19. **Detail layers:** Base → Detail Map Blender (x3) → fine detail
20. **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:
```python
{
'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:**
- [ComfyUI_Marigold- kijai](https://github.com/kijai/ComfyUI-Marigold)
- [ComfyUI_Lotus -kijai](https://github.com/kijai/ComfyUI-Lotus)