Работа с цветом

Общее описание

Сущность гамма-коррекции заключается в упаковке яркости канала изображения в 8 битах информации.

Стандартные (не HDR) изображения всегда сохраняются в нелинейном пространстве, где тёмные компоненты кодируются большим числом битов чем светлые. Это означает, что значению 0.5 от реальной интенсивности света (физической величины, называемой освещённость) будет соответствовать большее значение, содержащееся в каналах RGB (в самом простом случае \(0.5^{1/2.2} = 0.73)\).

В противном случае 8 бит информации не достаточно для кодирования интенсивности света, что приведёт к тому, что тёмные тона будут отображаться некорректно (например, тёмный градиент будет иметь ступенчатый характер переходов между соседними цветами).

Таким образом, веб-браузеры, как и многие другие программы для просмотра и обработки изображений, работают в нелинейном цветовом пространстве. Однако трёхмерные движки и рендереры работают в линейном пространстве, поскольку только оно может адекватно представлять поведение света в реальном мире. Например, освещённость от двух одинаковых ламп будет ровно в два раза превышать освещённость только от одной.

Безусловно, в таком случае 8 бит информации не будет достаточно, что наглядно иллюстрирует таблица, в которой приведены примерные значения величин освещённости от реальных источников.

Описание Освещённость, лк
Летом в полдень 17 000
Зимой в полдень 5 000
В пасмурный день 1 000
В светлой комнате 100
Ночью в полнолуние 0.2
В безлунную ночь 0.001

Blender при настройке сцены Color Management > Display Device > sRGB работает в линейном пространстве. Значения цветов материалов и настройки источников света соответствует физическим величинам. При работе с текстурами, за исключением карт нормалей необходимо выставить настройку изображения Image > Input Color Space > sRGB. В этом случае при рендеринге будет производится автоматическая распаковка изображения: sRGB->Linear.

Человеческое зрение и мониторы

Человеческое восприятие света нелинейно (человек лучше различает градации тусклого света чем яркого), однако свет, поступающий в глаз, по-прежнему должен подчиняться физическим законам (см. пример с лампочками).

Мониторы с электронно-лучевыми трубками (ЭЛТ) имеют нелинейную характеристику яркости от приложенного к их входу электрического напряжения, которое, в свою очередь, определяется значением канала цветности в видеопамяти. Подобную же характеристику копируют жидкокристаллические мониторы. Тем не менее свет, излучаемый такими мониторами, по-прежнему должен подчиняться физическим законам. Например, в идеальном случае при добавлении второго источника света на сцену в виртуальном мире, яркость пикселей на экране монитора должна увеличиваться в два раза.

Таким образом, особенности восприятия человеческого глаза являются причиной, по которой стало возможным осуществлять упаковку каналов цветности, в то время как технические характеристики мониторов имеют вторичное значение по отношению к гамма-коррекции.

Гамма

Используется в следующей упрощенной формуле:

Vout = Vinγ

γ < 1 - упаковывающая гамма, γ > 1 - распаковывающая гамма. В наиболее простом случае используются значения 1/2.2 и 2.2 соответственно. Далее вместо термина «гамма-коррекция» будут использованы термины «упаковка» (Linear -> sRGB) и «распаковка» (sRGB -> Linear).

_images/gamma.png

Коррекция в нодовых материалах

Ноды для окраски

При использовании текстур и вертексных цветов для окраски (не в качестве масок), необходима распаковка (sRGB -> Linear). Выход Vertex Color ноды Geometry и нода текстуры реализуют распаковку автоматически.

Отметим, что альфа-канал ноды текстуры коррекции не подвергается, его значения находятся в линейном пространстве.

Ноды для масок

Текстуры и вертексные цвета могут использоваться в качестве масок, т.е. для смешения цветов или других математических операций. В таком случае необходима упаковка (Linear -> sRGB).

Следует обратить внимание, что выход Vertex Color ноды Geometry и нода текстуры реализуют распаковку автоматически. Это приводит к необходимости дополнительного преобразования обратно в нелинейное пространство, для чего используется специальная нода LINEAR_TO_SRGB или нода GAMMA со значением γ = 1/2.2.

Примечание

Нода LINEAR_TO_SRGB считается устаревшей, следует использовать ноду GAMMA.

Карты нормалей

При использовании карт нормалей никакие преобразования не производятся.

Сводная таблица коррекции в нодовых материалах

Случай использования Коррекция
Текстура для окраски реализуется автоматически в ноде текстуры (альфа-канал коррекции не подвергается)
Текстура для маски GAMMA со значением γ = 0.45
Вертексный цвет для окраски реализуется автоматически
Вертексный цвет для маски GAMMA со значением γ = 0.45
Карта нормалей не требуется

Альфа-композитинг

Общие сведения

Физически корректный альфа-композитинг осуществляется по формуле [источник]:

\(C_o = C_a \alpha_a + C_b \alpha_b (1 - \alpha_a)\).

Формула отличается от классической операции смешивания (mix, выпуклая комбинация) наличием множителя \(\alpha_b\) во втором слагаемом. Таким образом, для осуществления альфа-композитинга должно быть известно не только значение \(\alpha_a\) пикселя-источника, но и значение \(\alpha_b\) пикселя, поверх которого осуществляется рендеринг.

В случае предварительного умножения значений \(\alpha\) на цветовые каналы (т.н. premultiplied alpha) формула принимает вид:

\(C_o = C_a + C_b (1 - \alpha_a)\).

Последняя формула используется также для расчёта результирующего значения \(\alpha_o\):

\(\alpha_o = \alpha_a + \alpha_b (1 - \alpha_a)\).

Предварительное умножение цветовых каналов на значения \(\alpha\) позволяет сэкономить две операции умножения. Еще более существенным является тот факт, что полученная формула может использоваться многократно, без необходимости деления цвета \(C_o\) на значение \(\alpha_o\) на каждой последующей итерации.

Реализация

Функция смешивания в движке Blend4Web имеет вид:

gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);

Инициализация контекста WebGL производится с параметром premultipliedAlpha = true (что является значением по умолчанию). Кроме того, на выходе шейдеров производится умножение всех каналов цветности на значение \(\alpha\).

Коррекция цвета

_images/effects_color_correction.png

Активация

Активировать панель Color Correction во вкладке Render.

Дополнительные настройки

Brightness
Яркость. Значение по умолчанию 0.0.
Contrast
Яркость. Значение по умолчанию 0.0.
Exposure
Экспозиция. Значение по умолчанию 1.0.
Saturation
Экспозиция. Значение по умолчанию 1.0.