Tone mapping

Tone Mapping - техніка, яка використовується для перетворення зображення з розширеного динамічного діапазону (HDR), який не можна уявити на екрані комп'ютерного монітора, в більш обмежений діапазон [0; 1].

Якщо просто обрізати колір по цих межах, то дуже мала ймовірність, що буде отримана осудна картинка, тому потрібно вибрати певний діапазон для перетворення. Це можна зробити, розрахувавши середню яскравість картинки, гистограмму яскравості або взявши для користувача введення і т.п. Також в комп'ютерній графіці враховують яскравість попередніх кадрів і яскравість, до якої звик «віртуальний очей» гравця.

Розглянемо більш докладно, яким чином проводиться Tone Mapping.

1) Перетворення кольору пікселя (RGB) в значення яскравості (luminance).
У колірній моделі XYZ, Y компонента є значенням яскравості, таким чином,
Lw = Y = m21 * R + m22 * G + m23 * B,
де m22, m22, m23 - рядок 3х3 матриці перетворення колірного простору RGB -> XYZ, специфічна для конкретного пристрою відображення. Для sRGB колірного простору, яким відповідають більшість моніторів «домашнього» використання,
Lw = Y = 0.212671 * R + 0.71560 * G + 0.072169 * B,
також часто застосовується
Lw = 0.27 * R + 0.67 * G + 0.06 B.

2) Розрахунок середнього значення яскравості (Laverage).
N - кількість точок в зображенні
Lw (x, y) - значення «світової» HDR яскравості в точки x, y

a) Логарифмічно усереднене.
Laverage = exp (1 / N * sum 1. N (ln (epsilon + Lw (x, y)))
epsilon - невелике значення, щоб уникнути сингулярності в точці ln (0)
б) Усереднена.
Laverage = sum 1. N (Lw (x, y)) / N,

3) Перетворення HDR в динамічний діапазон монітора [0..1] - Ld (x, y).
L (x. Y) = (a / Laverage) * Lw (x, y),
рескейл Lw (x, y) щодо середнього значення яскравості,
a - коефіцієнт дозволяє управляти характером стиснення HDR діапазону, зазвичай - 0.18

RGB (x, y) = nRGB (x, y) * Lw (x, y) - значення RGB пікселя
nRGB (x, y) = RGB (x, y) / Lw (x, y) - нормалізоване значення RGB
dRGB (x, y) - значення RGB приведена до динамічному діапазону [0. 1]

Функції перетворення:
а) Ld (x, y) = L (x, y) / (1 + L (x, y))
тоді:
dRGB (x, y) = nRGB (x, y) * Ld (x, y) = (nRGB (x, y) * Lw (x, y)) * (a / Laverage) / (1 + L (x, y)) =
= RGB (x, y) * (a / Laverage) * (1 / (1 + L (x, y))

б) Ld (x, y) = L (x, y) * (1 + L (x, y) / Lwhite ^ 2) / (1 + L (x, y))
Lwhite - максимальне значення яскравості, яке відобразиться в білий колір, верхню межу динамічного діапазону монітора.
тоді:
dRGB (x, y) = (nRGB (x, y) * Lw (x, y)) * (a / Laverage) * ((1 + L (x, y) / Lwhite ^ 2) / (1 + L ( x, y)) =
RGB (x, y) * (a / Laverage) * ((1 + L (x, y) / Lwhite ^ 2) / (1 + L (x, y))

Приклад tone mapping шейдера можна знайти в DirectX SDK в прикладі HDR Lighting і в NVidia SDK.

Що таке Tone Mapping?

Схожі статті