PBR Extractor (FrankenMap)
Pulling three maps out of one RGB
- frankenmap
- grayscale
- height
- roughness
- original_image
- pbr_pipe
Some shader setups don't bother with four separate textures - they cram several grayscale maps into one RGB image and let the shader read them out of individual channels. Those are the "FrankenMaps," and this node is the un-stitcher: it takes one RGB image and splits it into the maps it was built from, with the gamma, contrast, and invert controls you need to make each channel actually usable.
The channel layout is fixed and the naming is what gives the format its name. Red = grayscale/albedo, Green = height, Blue = roughness. It's a specific convention, not a standard - you'll see variations of this "packed grayscale" trick in different engines and shaders - so the first thing to do with any FrankenMap is confirm the channel order. The source even prints the value ranges of each channel to the console on every run, which makes verifying that trivial: if the green channel looks like a height map but your engine says green is something else, now you know.
Each channel gets its own set of shaping controls, which is the real value here:
albedo_gammaandalbedo_brightnessfor the grayscale (red)height_gamma,height_contrast, andinvert_heightfor height (green)roughness_gamma,roughness_brightness, andinvert_roughnessfor roughness (blue)
That's thoughtful because height and roughness almost always need sign fixes or a tonal push after extraction. invert_height flips bumps to indents and back; invert_roughness swaps rough/smooth. If your extracted height looks inverted, that one toggle is the fix.
The outputs: grayscale, height, roughness (all as RGB-for-display), plus original_image (a passthrough) and - the interesting one - a pbr_pipe. That pipe is the pack's bundle format, so you can feed this extractor straight into the pack's PBR Saver or Pipeline Adjuster and treat the FrankenMap as a complete material source without wiring individual maps. That's the "extractors feed the pipeline" philosophy of the pack in one output.
When would you actually use this? You've got a shader's packed texture from an old game, or a FrankenMap your own tooling produced, and you want to work on the maps individually - clean up the height, rebalance the roughness, then either save them separately or push the pipe through the pack's processing. If you don't have a FrankenMap and just want to unpack a normal ORM or RMA texture, use the dedicated channel unpackers instead; those are named per-map and don't have a fixed grayscale-in-red assumption.
Install: Manager → search "Texture Alchemy", or:
cd ComfyUI/custom_nodes
git clone https://github.com/amtarr/ComfyUI-TextureAlchemy
Restart, then Texture Alchemist/Extractors → PBR Extractor (FrankenMap). No dependencies, no models. The usual pack gotchas apply: the README's manual-copy step references the old folder name, and a blocked Git-URL install is the security level, not a broken repo - clone by hand.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| frankenmap | IMAGE | — | |
| albedo_gamma | FLOAT | 1.000.1–3 | Gamma correction for grayscale (from red channel) |
| height_gamma | FLOAT | 1.000.1–3 | Gamma correction for height (from green channel) |
| roughness_gamma | FLOAT | 1.000.1–3 | Gamma correction for roughness (from blue channel) |
| albedo_brightness | FLOAT | 1.000–3 | Grayscale brightness multiplier |
| height_contrast | FLOAT | 1.000–3 | Height contrast multiplier |
| roughness_brightness | FLOAT | 1.000–3 | Roughness brightness multiplier |
| invert_height | BOOLEAN | false | Invert height values (bumps become indents) |
| invert_roughness | BOOLEAN | false | Invert roughness values (rough becomes smooth) |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| grayscale | IMAGE | — |
| height | IMAGE | — |
| roughness | IMAGE | — |
| original_image | IMAGE | — |
| pbr_pipe | PBR_PIPE | — |