Nodes/LumaFlux/LumaFlux HDR Preview (tone map)
ComfyUI Node

LumaFlux HDR Preview (tone map)

How to Actually Look at a PQ Image Without an HDR Monitor

By shreshthsaini·Created 3 months ago·Updated 8 days ago· 2
LumaFlux HDR Preview (tone map)
  • hdr_pq
  • preview
white_nits203
methodreinhard

Type "SDR to HDR" into the corpus and you get a recurring argument: is HDR a bit depth, a color space, or a monitor you own? It's none of those alone, though the bit depth and the monitor both matter - and the practical consequence is that the PQ output of a LumaFlux conversion looks terrible on the screen you're sitting in front of. Not broken. Just wrong, because PQ code values aren't display values.

This node is the escape hatch. It takes hdr_pq and returns a picture an ordinary SDR monitor will show you honestly.

What it's doing

The math is the standard display pipeline, done properly. The node decodes PQ to absolute luminance in nits, converts BT.2020 primaries to BT.709, divides through so that a chosen luminance lands on SDR white, compresses whatever sits above that white point, and re-encodes with the BT.1886 inverse EOTF. Two things follow and both are worth knowing before you judge a result.

First, the output is a viewing aid, not the HDR image. Everything above your white point is squeezed or discarded - that's the whole point. Second, the compression method changes what you see. reinhard (the default) applies extended Reinhard on luminance, which rolls highlights off smoothly, so a 1000-nit specular highlight lands as something bright rather than a white blob. clip just cuts the signal at the white point, blowing every highlight to flat white. Reach for clip when you want to see exactly what's clipping, and reinhard for everything else.

The inputs

hdr_pq comes from the LumaFlux SDR to HDR node's first output. The node doesn't need the Loader or 24 GB of VRAM resident - it's pure color math on a tensor, so you can also tone-map a frame you loaded from a saved 16-bit PNG.

white_nits is the only knob that changes meaningfully, and its direction is counter-intuitive if you don't read the tooltip: it's the luminance you want displayed as SDR white, so lowering it brightens the preview while raising it darkens it. The default 203 nits is the BT.2408 reference grey point; that's the number broadcast HDR is graded against, so start there. Drop it to ~100 if you're on a dim display and can't see shadow detail; push it toward 300–400 if the picture looks blown out.

method is reinhard or clip, as above.

One output, preview - an ordinary SDR image, so Preview Image or Save Image both do the sane thing with it. That's the difference between this node and the preview output on the converter: this one lets you move the white point, the converter's built-in preview is fixed at 203-nit Reinhard.

Install

The whole pack installs the same way; the repository root is the node pack:

cd ComfyUI/custom_nodes
git clone https://github.com/shreshthsaini/LumaFlux
pip install -r LumaFlux/requirements.txt

Restart ComfyUI, or search "LumaFlux" in ComfyUI Manager and let it do that for you. Nothing model-related is required for this node specifically - no adapter download, no gated FLUX.1-dev login, no SigLIP - it just needs the pack importable so it can reach the lumaflux color-science functions. If you get an ImportError mentioning the lumaflux package, you copied only the comfyui/ folder instead of cloning the whole repo.

Where people get burned

Judging the conversion from the preview is the classic mistake. A 203-nit Reinhard view of a 1000-nit master is a compressed, clipped, gamut-squeezed rendition of it. If the HDR version looked flat in the preview, that may be exactly what you'd expect. Change the method to clip if you want to see which regions are actually at or above SDR white.

An HDR monitor doesn't make this node pointless. Even on an HDR display, ComfyUI's own image preview goes through an 8-bit SDR path, so PQ output shows up dark and flat in the canvas regardless of your hardware. Use this node to see what you made; use the 16-bit PNG and an HDR-aware viewer to check what you actually made.

The preview is 8-bit-ish by the time you look at it. Banding you spot in the preview is usually the preview, not the master. Grade from the saved frames, not the tone map.

Don't chain it before a save. Preview → Save is fine. Preview → Save HDR PNG will save the tone-mapped SDR image with a PQ tag on it, which is a lie in a file. Keep the two branches separate: hdr_pq to the HDR save nodes, preview to Preview Image.

CategoryLumaFlux

Inputs (3)

NameTypeDefaultDescription
hdr_pqIMAGEPQ / BT.2020 output of LumaFlux SDR to HDR.
white_nitsFLOAT20350–1000Luminance shown as SDR white. 203 nits is the BT.2408 reference; lower brightens the preview.
methodCOMBOreinhard2 options: reinhard, clip

Outputs (1)

NameTypeDescription
previewIMAGE