[Из песочницы] Gamma, ColorMapping and LinearWorkflow

Краткий обзор и практическое применение Гаммы и Color Mapping в связке 3D max, V-ray и Nuke.image

Часть первая. Gamma. НачалоЭта история началась с того что несовершенная технология отображения видеосигнала лучевой трубкой страдала сильными провалами средней части цветового спектра в тёмную сторону и дело тут совсем не в печеньках. Компенсировать этот недостаток программно было нельзя, а аппаратно очень дорого и поэтому решили вносить корректировку в сам видеоматериал на стадии производства контента. Прошли годы, было наработаны горы исключительно гаммаоткорректированных картинок и когда настала эра компьютеров никто не стал пересаживать индустрию на новые стандарты, а переняли существующие. С тех пор компьютер и мы видим изображение по разному. Если для нас всё «ок» то для компа картинка выглядит значительно светлей, просто перед тем как показать нам изображение сигнал проходит «естественную» обратную гамма коррекцию на стороне монитора. Современные мониторы могут выводить картинку линейно, но нас преследует «наследие старого времени» в виде кучи высветленных фильмов и телепередач.Всё-бы ничего, но почему-то компьютерная графика была построена на математических принципах и все манипуляции с цветом сходятся на банальных арифметических операциях. И представьте теперь, что вам надо средний серый цвет увеличить в двое. В линейном пространстве «средний серый» равен 0.5* итого получается 0.5×2=1.0 то есть получится чистый белый цвет, что вполне логично, а не в линейном пространстве «средний серый» равен где-то навскидку 0.72, умножаем на 2 и получается… ерунда получается, ребята.

Так вот Rendering это куча разных арифметических извратов и всякие мултиплееры, оверлееры и колорбёрны городят немного не то, что от них требуется если цветовое пространство не линейно. Поэтому те у кого глаза в состоянии отличить голубое от синего решили работать в «линейке», чтобы не создавать себе проблем на всех этапах обработки изображений.

Правило: Приводим входящий материал в линейное пространство. Работаем в линейном пространстве. Гамма-коррекция применяется только к финальной картинке (причем в большинстве случаев это происходит автоматически).

Пример перевода гаммы есть в описании к Блендеру:

ec5c189060d34d55d6c11a5c45f52bdf.jpg

Кстати, приводить Normal Bump в линейное пространство не стоит, так как такие карты уже находятся в «линейке», при подключении таких текстур надо исключать их из коррекции.

Часть вторая. Color mapping Кроме сложностей с гаммой мы имеем проблему технологическую, которая упирается в возможности отображения. У нас имеется 2 основных способа отображение картинок — на бумаге и на экране. Оба способа различаются принципиально тем что один отражает свет, а второй излучает, но тот и другой имеют очень ограниченный диапазон передачи интенсивности света, в сравнении с той которую мы можем увидеть, поэтому изображение надо «сжать» до нужного диапазона. Причём недостаточно просто сжать спектр, это надо сделать так, чтобы в местах слабой чувствительности сжимать много, а там где у нас много чувствительности сжимать надо… ну вы поняли. Сейчас мы сделаем для ясности шаг в сторону, где я подготовил объяснение такому поведению.В кустах, неподалёку Мы воспринимаем окружающий мир не линейно. Чтобы усилить ощущение чего либо в 2 раза нам недостаточно удвоить порцию… нам надо её утроить или учетверить, то есть если накрутить яркость источника света в 2 раза то по ощущениям мы скажем, что яркость увеличилась на 30%… вот такие мы «чёткие ребята». Все органы чувств работают в логарифмической пропорции. Обратный натуральный логарифм называют Экспонентой… которая и маячит в настройках Color Mapping. Логарифм — основная функция при преобразовании интенсивности, независимо от того изображение ли это, порция соли или радость от количества денег в банке.6d22b41e5a1fbc09438e701f0226bde0.pngПо этой причине мы хорошо различаем полутона в тёмных участках и более равнодушны к перепадам в ярких. Именно поэтому при сжатии мы пренебрегаем высокими значениями цвета.Представьте что в видимом нами мире разница в яркости может заходить далеко за миллион, а монитор в состоянии показать разницу примерно в 10 000. ColorMapping «ужимает» широкий диапазон яркости в тот маленький участок который может отобразить монитор или картинка напечатанная на листе бумаге, он делает это вместо наших глаз, а мозг интерпретирует картинку как готовое изображение. Обратите внимание на график Двоичного Логарифма, из него становится ясно сжатию подвергаются в основном светлые участки в то время как «тени» остаются без изменения, так мы избавляемся от неприятных «засветов» которыми грешат работы начинающих визуализаторов.Логарифм и гамма это практически одно и тоже, но у них есть особенные различия в построение: для гаммы нужно иметь две крайние точки — ноль и единицу соответствующие черному и белому цвету, между этими точками строится кривая с силой изгиба равной гамме. А вот для экспоненты достаточно одной начальной точки и кривая может строится до бесконечности. Поэтому в линейном пространстве с высоким динамическим диапазоном (HDR) цвета, где нет ограничения на яркость применяется экспонента, а уже в в готовых применяют гамму. Есть конечно программы где можно применить гамму и к HDR изображению, но подобный изврат может привести к непредсказуемым значениям изначально стоящим выше единице.ColorMapping и гамма-коррекция две похожие вещи, но занимается разными задачами. Гамма предназначена для компенсации «старого наследия», а ColorMapping сжимает «линейку».

То есть, в работе мы учитываем два отдельных преобразования цвета и не надо их путать между собой.

Часть Третья. Практическая работа Есть два основных пути изготовления картинок. Один путь подразумевает уже готовый файл на выходе из программы: с гаммой, обрезанной HDR, c минемальным количеством бит на канал, со всем тем что подразумевает отсутствие дальнейших правок. Второй готовит «сырой полуфабрикат» который будит «варится» до готовности в программе постобработки. Если мы готовим файл для поста то нам нужно сохранить линейное пространство + высокий динамический диапазон цветов. Мы рассмотрим на практике оба метода.Путь номер 2. Дольше — значит умеючи! В последней версии 3D Max из настроек Гаммы убрали Input и Output, поэтому надо установить общее значение гаммы — 2,2. 3D Мах сам будет приводить входящие текстуры в линейное пространство.Настройки ColorMapping в 3D Max делаем такими: Type — Linear multiply. — Мы же работаем в линейкеDark — 1.Bright — 1. — эти значения оставим по умолчанию если понадобится мы поменяем их на посте.Гамма — 2,2. — Дело в том что эта гамма не будет применяться к финальному изображению и по факту останется — 1… потому что мы установим галочку в: Don’t affect colors — ставим галку. Делаем мы это для того чтобы остаться в линейном пространстве, но зная то что Враевский Sampler вечно не докладывает в тёмных местах, мы применяем гамму только к нему. Таким образом в темных участках у нас детали не пропадут и мы останемся в «линейке«Clamp — Отключить, так как нам понадобится весь диапазон яркости.

Сохранить такие изображения надо во Float point форматах (32 бит), таких как openEXR. Теперь на выходе у нас будет относительно точная модель представление цвета, почти как в реальности.

Готовим полуфабрикат Признаюсь, мне нравится пост своей творческой гибкостью. Когда вся основная, грубая работа сделана и осталось «покрутить» кнопки для вкуса.Опустим детали свойственные для конкретных проектов и сразу перейдём к ColorMapping.Итак у нас «линейная» картинка с выжженными светлыми участками. Вспоминая мой рассказ о особенностях восприятия мы повторим похожий фокус. Причем механика работы будет схожа с типом Reinhard в ColorMapping V-ray.Нам понадобится 2 ноды: Grade и Log2Lin.Grade будет выполнять роль множителя всей картинки или значения ISO камеры если вам так удобней.Log2Lin будет сжимать картинку, но для начала надо его настроить: Operation — lin2log.Black — 0White — 255Gamma — 1Mix — 0.95

«Сжимая» яркость мы делаем картинку темней поэтому сразу можете поставить значение Gain равное 5 в настройках ноды Grade. В принципе на этом всё.Мiх ноды Log2Lin будет осуществлять туже функцию что Burn value в ColorMapping только в другую сторону, то есть если Burn value равно 0.3 то Mix установите около 0.7

Если вы хотите подправить Гамму, сделать тёмные места светлей то надо повысить Gain в ноде Grade и повысить Mix в Log2Lin

Путь номер 1. Без танцев Если вы избегаете Поста, то можно Пост сделать в ColorMapping. Для этого лучше выбрать тип Rinhard, так как он занимается усреднением между линейкой и экспонентой через параметр Burn value. Если у вас «выжженные» цвета то достаточно понизить значение Burn value. Яркость картинки повышаете через параметр ISO и shutter speed в VrayPhysicalCam.Gamma — 1Clamp — 1Don’t affect colors — убрать галку.

Так как теперь Sampler будет раскидывать семплы исходя из видимой картинки то надо понизить порог шума в DMC Sampler c 0,01 для «линейки» примерно до 0,003.

Некоторые ребята вместо того чтобы понижать уровень шума просто повышают гамму на 2,2, а в настройках Гаммы программы ставят единицу в поле Оутпут. Я считаю это идеологически неверно хотя это тоже работает._______________________________________________________________________________* Здесь и далее речь идёт о значениях цвета в Float Point где 0=черному цвету, а 1=белому.

© Habrahabr.ru