Добрый день, дорогие читатели! После затянувшегося перерыва (кстати, поздравляем с прошедшими праздниками!) мы подготовили для вас интересную статью о гамме и линейном цветовом пространстве. Для нас самих подготовка этого материала оказалась очень поучительна, и мы узнали некоторые факты, о наличии которых в принципе догадывались, но теперь нашли им научное объяснение. Статья довольно сложная и рассчитана на подготовленного читателя. Приятного чтения!

header

Зачем использовать Linear Workflow (линейное цветовое пространство)?

Многие художники по 3D-визуализации находят, что это понятие слишком запутанное. Поэтому им проще думать, что оно не имеет особого значения, но поверьте мне, это не так.

На протяжении всего процесса, от настройки визуализатора до пост-обработки, расчет освещения и цвета будет правильным, если использовать Linear Workflow. А это необходимо, если вы стремитесь достичь фотореалистичности своих визуализаций.

Linear Workflow — это термин, который рассказывает о том, как работает гамма. Чтобы понять этот термин, вы должны знать: что такое гамма, почему она существует и как ее контролировать? Я еще вернусь к этому. Давайте в первую очередь рассмотрим несколько примеров.

Livingroom_from-wrong-to-correct

Вот пример изображения визуализированного без гамма-коррекции. Обратите внимание на то, как свет не отскакивает и не наполняет комнату, несмотря на то, что сцена отрендерена в VRay с включенным GI.

Livingroom_from-wrong-to-correct_02

Можно настроить гамму в пост-обработке, после рендеринга. Так, чтобы свет заполнял правую часть. Проблема в том, что это приведет к блеклым теням, а просачивающийся цвет также будет рассчитываться не верно. К цветным шарам на полу применены чистые шейдеры 3ds Max’а, так что цвета будут проявляться правильно. НО, в текстурах на полу и картине на стене цвета буду неверными. Насыщенность и контрастность будут плохими, как ни исправляй.

Livingroom_from-wrong-to-correct_03

При правильной настройке (Linear Workflow) как цвета, так и света, в конечном итоге все будет правильно.

Также существуют некоторые другие преимущества в использовании Linear Workflow, например 32 бита на канал. Обычное изображение (такое как JPG) имеет только 8 бит на канал (R, G и B каналы). Это хорошо для окончательной картинки, но оно не содержит достаточно информации, чтобы быть очень полезным при пост-обработке. После просмотра видео обратите внимание на то, какую информацию содержит 32-битное изображение в слишком ярких областях. Вы видите, как отражения на полу заменяются новыми «информационными» пикселями. Однако 8-битное изображение «не знает», что скрывается под белыми пикселями, и, следовательно, появляется серость при снижении экспозиции. Кроме того, если вы при пост-обработке сделаете DOF (Глубину резкости) или glare/bloom, то заметите как 32-битное изображение повысит качество этих эффектов.

Теперь, прежде чем мы перейдем к термину гамма, необходимо знать некоторые факты о человеческом восприятии света. У нас есть органы чувств, не реагирующие линейным способом. Другими словами, если вы держите полкило в руке, и добавите еще полкило, то сможете легко определить двойное количество веса. Но, если вы держите камень весом 50 килограмм, и добавите еще полкило, то вы едва сможете почувствовать разницу.

Такая же картина появляется в звуках и изображениях.

lights

Как вы видите, мы можем легко отличить 50 Ваттную лампочку от 51 Ваттной лампочки. Но мы не можем отличить ту же разницу между 150 Ваттной лампочкой и 151 Ваттной лампочкой, несмотря на одинаковое увеличение мощности.

Ниже расположена кривая, иллюстрирующая то, как люди реагируют на интенсивность света.

humanperceptionCurve

Очень хорошо, что мы не можем отличить разницу высоких световых значений, т.к. кодирование изображения, с той же плотностью данных по всему спектру, было бы пустой тратой битовых данных (Кодирование, например для того, чтобы сохранить изображение в формате JPEG). Другими словами, нам не нужно в ярких областях делать ту же плотность данных, как мы делаем в темных областях. Практически, если бы вы имели линейно-кодируемое изображение, вам потребовалось бы 14 бит на канал для того, чтобы добиться такого же качества, как в типичном JPEG-изображении, которое имеет лишь 8 бит на канал. Кроме того, вы также получили бы больше информации в ярких областях, чем в состоянии отличить человеческий глаз, а это бесполезные биты.

Да, это означает, что JPEG кодируется нелинейно. В самом деле, JPEG и в основном все 8-битные изображения кодируется по принципу той же кривой, что и кривая, иллюстрирующая человеческое восприятие света. Эта кривая является той, что называется «Гамма 2.2».

tristimulisPicker

Вы когда-нибудь замечали, что значения палитры цвета в 3ds Max находятся в диапазоне от 0 до 255? Это называется значение трехцветного сигнала.

Вот как кодируется 8-битное изображение:

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

Теперь, после преобразования, мы видим, что на самом деле происходит с изображением «внутри компьютера». Все изображение высветляется. Например, так:

gamma_encoding

Перед тем, как запутаться и спрашивать: «Почему не все 8-битные изображения выглядят в итоге отбеленными?», — вы должны знать, что происходит после этого преобразования.

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

Обратите внимание, как медленно движется значение яркости по мере увеличения напряжения, прежде чем оно вдруг получает достаточно вольт, чтобы подскочить вверх. Как вы видите, кривая выглядит как противоположность кривой, которая иллюстрирует человеческое восприятие света, которое используется для кодирования изображений.

С кодировкой гаммы и с учетом закона мощности ЭЛТ, общий результат будет выглядеть следующим образом:

GammaCurves

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

Итак, какое отношение это все имеет к вашей визуализации?

Ну, это очень просто. При выполнении фотореалистичных визуализаций в 3ds Max, очень важно, чтобы все данные изображения рассматривались как линейное освещение. Потому что его легче вычислить, и нет такого понятия, как нелинейное освещение в реальном мире. Это означает, что, когда ваши визуализации имеют дело с цветом, светом и текстурой, все должно быть использовано или преобразовано в линейное пространство. Оно называется линейным, потому что кривая гаммы больше не является кривой, а линейной, которая называется «Гамма 1.0».

linear

Позвольте мне объяснить далее. Что произойдет, если расчеты производятся без учета линейного цветового пространства, а также, если соотношение между значением трехцветного сигнала и фактической яркостью на выходе не соответствуют друг другу.

GammaRatio

Как показано выше, половина от максимального значения трехцветного сигнала (50% от 255 ≈ 128) не соответствует 50% яркости на выходе. Только 22%. Это тот случай, когда вся математика в конечном итоге не верна, при расчете света в нелинейном пространстве.

Если расчеты проводить с учетом линейного пространства, отношение должно соответствовать, как показано ниже:

LinearRatio

Итак, теперь вы, вероятно, лучше понимаете то, как работает гамма, пора взглянуть на то, как весь этот сумасшедший материал должен быть обработан на протяжении всего рабочего процесса.

Как показано на экране, прямое линейное цветовое пространство приведет к блеклым теням. Таким образом, фишка состоит в том, чтобы обработать все в линейном пространстве «внутри компьютера», параллельно контролируя свою визуализацию и внося корректировки с помощью гаммы-2.2. Другими словами, все рассчитано с гаммой 1, но вы можете увидеть его в гамме 2.2.

Давайте рассмотрим, как работать с этим в 3ds Max. Прежде всего, Вам необходимо включить Gamma/LUT Correction.

maxGammDialog

Customize/Preferences/Gamma and  LUT – в первую очередь, смотрим сюда.

Проверьте оба поля под «Materials and Colors». Вы заметите, что редактор материала и палитра цвета сейчас отображаются размытыми (иногда редактор материалов необходимо обновлять), они будут выглядеть немного странно. Но не волнуйтесь, вы привыкнете к ним. Это делается для того, чтобы убедиться, что цвета, которые вы выбираете корректны.

Параметр гаммы слева (2,2) – это гамма монитора. Он будет гаммой окна проекций, визуализатора, а также отображать гамму на вашем мониторе (это не повлияет на то, что происходит «внутри компьютера»).

Input gamma(Входная гамма): указывает Максу, что он имеет дело с текстурами, исправленными с гаммой 2,2. Все ваши текстуры (в большинстве случаев) корректируются с гаммой 2,2, исключение составляют HDRI текстуры. Это будет объяснено позже.

Output gamma(Выходная гамма): указывает на то как 3ds Max будет сохранять визуализацию. Вы должны поставить значение 1, если хотите сохранить линейные данные нетронутыми, чтобы использовать их в вашей программе для композинга. Если же вам не нужно сохранять линейное цветовое пространство после визуализации, скажем, когда вы сохраняете JPEG изображение, вы должны поставить значение выходной гаммы на 2.2.

Нажмите на изображение ниже, чтобы увидеть подробное описание того, как это работает. На первый взгляд, это выглядит немного хаотично, но проанализировав в нумерованном порядке то, что происходит — во всем можно разобраться.

gamma-high

Если вы используете фрейм-буфер Макса, то системная гамма настроит для вас  изображение, чтобы отслеживать то, как это будет выглядеть в итоге. Это не означает, что изображение будет сохранено таким образом. Если же вы используете фрейм-буфер Vray (VFB), вы должны проверить кнопку sRGB, чтобы увидеть, каким изображение будет в конечном итоге.

Примечание: Если вы рендерите при помощи MentalRay, вам нужно указать в настройках 32bit. По умолчанию рендеринг с MentalRay установлен на 16bit.

Теперь, сделайте свою  сцену и опробуйте этот метод. Не забудте сохранить изображения с 32 битами на канал. Я рекомендую для этого использовать EXR формат. Обратите внимание, что Photoshop не очень хорошо справляется с этой задачей, но большинство программного обеспечения хорошо делает это. В данном случае я буду использовать After Effects.

AE32

Обязательно задайте своему проекту 32 BPC, чтобы After Effects получил всю информацию из изображений.

При загрузке 32bit или любого другого EXR изображения в After Effects, After Effects будет верить, что это изображение в линейном цветовом пространстве, и, следовательно, будет автоматически обрабатывать изображение в случае чего. Если вы сделали все правильно, то в AE  откроется отличное изображение. Даже думая, что изображение еще не откорректировано по гамме, АЕ будет убежден, что показывает вам то, как это будет в конечном итоге по окончанию работы. При экспорте изображения в фильм и не только, АЕ придаст ему правильную гамма-коррекцию при сохранении. До тех пор, пока не будет установлено что-то еще.

Если вы используете различные проходы (например, проход отражения), теперь вы должны использовать режим смешивания: Add. Пока проект находится в линейном рабочем пространстве, расчеты будут верны. Режим смешивания  Screen  — это «фальшивка», которая будет имитировать правильные расчеты для нелинейных изображений.

На этом все, пока вы не используете VRay. Существует еще проблема с этой настройкой при использовании VRay. VRay очень адаптивный при визуализации, а это значит, что в темных областях, VRay не использует очень высокие значения образцов. Эта система называется выборка Vray DMC (детерминированный Монте-Карло). Проблема с настройкой, состоит в том, что, когда VRay попытается выяснить  яркость области, он не получает правильные значения. Это потому, что V-Ray не находит гамму исправленного изображения «внутри компьютера» при его определении.

bad-samples

Вот пример, который показывает результат, когда VRay не получает нужных значений при поиске. Обратите внимание, как много шума в некоторых областях, кажется даже, что они настолько яркие, что должны иметь лучшую выборку.

Samples_source-(00000)

А все потому, что VRay рассматривает это, определяя то, насколько яркий пиксель. Для того, чтобы это исправить, необходимо скорректировать некоторые параметры.

Во-первых, вы должны указать VRay, что он имеет дело с линейным рабочим пространством. В VRay эти настройки гаммы немного устаревшие, так что это должно быть сделано путем установки значения гаммы на 2,2.

И отметьте галочку «Don’t affect colors (adaptation only)».

vRayGamma

Обратите внимание, что я не отметил поле «Linear workflow». Это старый метод, не запоминайте это.
Теперь Vray DMC сэмплер получает правильные значения для поиска.

Здесь Вы можете увидеть результаты до и после:

Samples_bad-(00000)-(1)

Вот и все! Вопросы Гаммы и линейного рабочего пространство всегда подвергаются большой дискуссии. Если я ошибаюсь, поправьте меня, я готов к этому в любой момент. Это просто информация, мне удалось найти ее, изучая, и проводя исследования самостоятельно.

Я надеюсь, что эта информация помогла вам, и спасибо, что заглянули.

Автор: Johan B.
Источник: cgarena.com
Перевод: RAIT.kz — статьи о компьютерной графике