Nodes/ComfyUI-TextureAlchemy/Normal Processor (Lotus)
ComfyUI Node

Normal Processor (Lotus)

Why Lotus normals look wrong, and the one-click fix

By amtarr·Created 9 months ago·Updated 4 months ago· 58
Normal Processor (Lotus)
  • normal
  • normal
invert_redfalse
invert_greentrue
invert_bluefalse
strength1.00

The most common first reaction to a Lotus normal map is "this looks like garbage," and the most common cause isn't the model - it's the green channel. Lotus emits normals in one handedness (which direction "up" points in the Y axis) and your renderer expects the other, and the result is lighting that looks inverted, like the surface is lit from underneath. Normal Processor (Lotus) is the node that fixes that with one checkbox that's already ticked for you: invert_green defaults to True, because in the author's testing that's the direction Lotus output needs to head toward OpenGL format.

It's the Lotus-specific sibling of the pack's general normal tools, and it's essentially a 30-second cleanup node: feed it the raw LotusSampler → VAEDecode output, decide your channel flips and strength, get a normal map that behaves.

How it works

A normal map's three channels encode surface direction: red is the X axis (left/right), green is the Y axis (up/down in most engines), blue is the Z axis (toward you). Format conventions flip the Y axis - OpenGL points it up, DirectX points it down. Lotus outputs in one of those, and if your target engine expects the other, the fix is literally green = 1.0 - green. That's what this node's invert_green toggle does, and why it's on by default.

You get the other two axes too: invert_red (X) and invert_blue (Z) - rarely needed, but they exist for the "I've flipped green and it's still wrong" case, which usually means you also need red or the source itself is odd. The strength slider (0–2) blends toward a flat normal, flattening (below 1) or exaggerating (above 1) the relief without touching the format flips - useful when Lotus's normals come out too strong or too weak for your taste.

The single output is normal, ready to feed a PBR combiner or straight to a shader preview.

The inputs that matter

  • invert_green - leave it on for OpenGL targets (Unity, Blender). Turn it off for DirectX targets (Unreal, Maya). This is the button.
  • strength - 1.0 is faithful; lower to flatten, higher to exaggerate.
  • invert_red / invert_blue - only touch these if green-flipping alone doesn't fix the lighting.

Installing it

Part of ComfyUI-TextureAlchemy - one install covers the pack. ComfyUI Manager → search "TextureAlchemy" → install → restart, or:

cd ComfyUI/custom_nodes
git clone https://github.com/amtarr/ComfyUI-TextureAlchemy

Restart and find it in the PBR/Normals category (note: this one doesn't sit under the "Texture Alchemist" umbrella in the node list). The upstream Lotus model comes from Kijai's ComfyUI-Lotus; this node needs no extra install or downloads itself.

Common issues

  • "I flipped green and the lighting is still inverted." Then it wasn't (only) the Y axis. Toggle invert_red and check again - if red-flip fixes it, your source or target convention differs on X too.
  • "Which way should it be?" Match your engine, not your eyeballs. Unity/Blender want OpenGL (green inverted relative to Lotus's default); Unreal/Maya want DirectX. If you're not sure, run the pack's Normal Format Validator on the result.
  • "Normals look muddy after processing." You may have hit strength below 1, which flattens by design. Also remember Lotus's raw output can be soft - a strength of 1.1–1.3 is a common sweet spot.
  • "I don't have Lotus installed." Missing-node error at load; grab ComfyUI-Lotus and a checkpoint first.

One node, one job, one default that already does the right thing for the common case. That's about all you could ask of a format-fix utility.

CategoryPBR/Normals

Inputs (5)

NameTypeDefaultDescription
normalIMAGE
invert_redBOOLEANfalseInvert red channel (X axis)
invert_greenBOOLEANtrueInvert green channel (Y axis) - OpenGL vs DirectX
invert_blueBOOLEANfalseInvert blue channel (Z axis)
strengthFLOAT1.000–2Normal map strength (1.0 = original)

Outputs (1)

NameTypeDescription
normalIMAGE