Войти
ПрограммированиеТерминыГрафика

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?

#эффекты, #HDR, #post-process

28 марта 2007 (Обновление: 8 окт. 2013)