The FidelityFX Luminance Preserving Mapper (LPM) is a tone mapping and gamut mapping solution for high dynamic range (HDR) and wide gamut content. FidelityFX LPM tone maps the luminance (luma) of the red-green-blue (RGB) pixel instead of the color itself, but ensures sure that the tonemap(luma(RGB))
would be very similar to the luma(tonemap(RGB))
, that is to say it preserves the luminance information of the pixel.
FidelityFX LPM is split into two parts: a setup call and filter call.
The setup call writes pertinent data to a fixed size control block with regards to what the tone and gamut mapping calculations need, and the filter call reads from the control block, calculates, and outputs a tone and gamut mapped color value or pair of values for the FP16 version.
ffx_lpm.h
:
- A common header file for CPU-side setup of the mapper and GPU-side setup and tone and gamut map calculation functions.
LpmSetup()
is used to setup all the data required by mapper in a control block:- What is the content gamut.
- What is the display gamut.
- Max brightness value of content in RGB.
- Exposure steps above SDR/LDR 1.0
LPMFilter()
is used to do the calculations for mapper by reading data from the control block.- For detailed intructions please read the comments in
ffx_lpm.h
ffx_lpm.cpp
:
- CPU-side setup code for FidelityFX LPM.
- Select the right
LPM_config_*_*
andLPM_color_*_*
configurations based on content gamut and display mode selected.
ffx_lpm_filter.hlsl
:
- GPU-side call to do the tone and gamut mapping.
- Select right configurations of
LPM_config_*_*
based on content gamut and display mode selected.