9348
0
06/10/2021

Изначально целью этого руководства было понять, что делает флажок sRGB в Corona Color Picker. Мы постараемся объяснить, почему одни и те же значения иногда могут представлять разные цвета, а также предоставим дополнительную общую информацию.

Вы также можете найти "слишком длинную; не читал" версию этого руководства в самом низу этой страницы.

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

Вопрос 1: Почему серый цвет 127 иногда темнее, а иногда светлее? Почему зеленый цвет 0 240 0 иногда более зеленый?


A1: Поскольку существуют различные цветовые пространства, такие термины, как "красный 240 120 50" могут означать различные фактические цвета в этих различных цветовых пространствах - Adobe RGB, Wide RGB, XYZ, CIERGB, sRGB, .... Причина, по которой мы обычно можем обойтись простым использованием чисел без указания цветового пространства, заключается в том, что цветовое пространство sRGB широко распространено и было установлено по умолчанию для веб-графики.

Q2: Почему бы тогда не использовать всегда цветовое пространство sRGB?


A2: Потому что цветовое пространство sRGB является "узким" и может выражать только относительно небольшое подмножество всех цветов, без отрицательных значений. Оно также нелинейно - в нем присутствует гамма-кривая - поэтому вы не можете сложить два цвета sRGB при рендеринге (т.е. от двух источников света в сцене) и ожидать правильного результата. Для этого вам нужно линейное пространство - вот что такое линейный рабочий процесс.

Q3: Зачем вообще усложнять ситуацию с гаммой?


A3: Потому что человеческое зрение очень нелинейно - примерно логарифмическое. Применяя гамму, sRGB становится примерно однородным по восприятию - добавление 1 к темному или яркому цвету приводит к примерно одинаковому увеличению яркости. Линейный градиент от 0 до 255 в sRGB выглядит примерно однородным. В 90-х годах никто не занимался рендерингом (которому необходимо линейное цветовое пространство в отличие от 2D-графики), преобразование между цветовыми пространствами было слишком дорогим, а памяти было мало, поэтому 8-битная гамма sRGB, смоделированная для соответствия ЭЛТ-мониторам 90-х годов, был создан для получения хороших визуальных результатов для 2D-графики. 8-битный формат без гаммы дал бы плохие результаты, потому что все 255 шагов точности были бы потрачены впустую на черные цвета, а для белых не осталось бы никакой точности. Кроме того, применение гаммы перед отправкой изображения на мониторы было бы слишком дорогим.

Q4: Почему это является проблемой в 3ds Max?


A4: Потому что 3ds Max вообще не управляет цветом и не имеет концепции цветовых пространств. Внутри он использует просто "RGB" без информации о том, в каком пространстве он находится - что является проблемой, потому что это число может представлять различные цвета, и рендереры не могут просто использовать sRGB, как объяснялось ранее. Самая большая проблема заключается в том, что некоторые слоты карты (например, диффузный цвет) требуют линейных данных для правильной работы (линейный рабочий процесс), в то время как другие слоты (нормали, неровности и смещение) требуют данных sRGB, чтобы сохранить то, что задумал пользователь, когда создавал карту в Photoshop и сохранил ее как sRGB. В 3ds Max нет возможности указать, в каком пространстве находится входной тексмап или в каком пространстве он возвращает результаты, что возлагает бремя проверки этого на пользователя. Мы пытаемся облегчить задачу нашим пользователям, показывая предупреждения для нормальных карт, но это все равно не идеальное решение.

Q5: Почему разные текстуры должны быть в разных цветовых пространствах?


A5: Давайте рассмотрим пример: диффузный цвет против карты нормалей/размещения:


- Диффузный цвет - это просто отражение поверхности (при условии отсутствия отражений). При расчете GI/прямого света рендерер должен умножить диффузный цвет на падающее излучение, чтобы получить отраженное излучение. Это умножение не будет работать, если оно выполняется в цветовом пространстве sRGB, поскольку оно не является линейным. Когда вы создали фотографию дерева/гравия/листьев, ваша камера добавила гамма-кривую к изображению, когда оно было сохранено в формате .jpg - потому что так требует стандарт. Рендерер должен удалить ту же гамма-кривую, чтобы получить истинные линейные значения.


- Карта нормалей не может быть сфотографирована в реальности. Она рисуется в Photoshop, и стандарт здесь (созданный в эпоху "графики реального времени до линейного рабочего процесса") гласит, что 127 127 255, сохраненные в jpeg, - это "без изменений нормали". Если мы удалим ту же гамма-кривую, что мы сделали с диффузной текстурой, то "no change to normal" цвет станет "huge change to normal", что испортит внешний вид модели, потому что все нормали будут сильно отклоняться. Это очень легко воспроизвести, и я уверен, что это случалось с каждым хотя бы раз

Пример материала с использованием карты нормалей, загруженной с неправильной гаммой.


Используется точно такая же карта нормалей, только с установленным флажком "Add gamma to input". Это мгновенно делает рендеринг правильным. Хорошо то, что Corona попытается отловить такую ошибку автоматически и предупредит пользователя об этом, показав сообщение при рендеринге.

- Когда вы рисуете карту смещения в Photoshop и используете линейный градиент от черного к белому, вы ожидаете, что это приведет к линейному наклону поверхности. Вы сохраняете этот градиент в JPG в виде линейной прогрессии от 0 до 255. Если рендерер уберет гамму и интерпретирует числа как высоту, то уклон будет уже не линейным, а в форме гамма-кривой.


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

Если в качестве карты смещения используется градиент 0 - 255, он будет создавать разные кривые в зависимости от гаммы, с которой он загружен.

Выборщики цветов

В6: Почему эта проблема возникает при выборе цвета?


A6: Потому что при выборе цвета возникают точно такие же проблемы, как и при использовании текстуры - вы можете думать о цветоподборщиках как о маленьких текстурах размером 1*1 пиксель, и вам нужно указать их цветовое пространство так же, как и для текстур.

Q7: Как работает подборщик цвета в 3ds Max?

A7: Когда гамма в 3ds max настроена правильно, цветоподборщик будет показывать линейные (без гаммы) числа sRGB, показывать градиент, который является линейным в линейном пространстве, НО показывать sRGB (color-mapped) цвета на мониторе.

Q8: В чем проблема?
A8: Мы определили эти проблемы:
- Цветовой градиент, отображаемый на ползунках в 3ds Max color picker, прогрессирует равномерно в линейном пространстве, поэтому он прогрессирует нелинейно в отображаемом sRGB, поэтому он воспринимается неравномерно. Это видно по тому, как все черные цвета теснятся в самом верху, и как половина ползунка выглядит абсолютно белой.
- Вы не можете напрямую ввести значения цвета из Photoshop, с веб-страницы и т.д. Photoshop использует значения sRGB, и когда вы вводите эти значения в 3ds Max, они интерпретируются как линейные значения, что приводит к более ярким цветам. Это приводит к абсурдным ситуациям, когда вы открываете текстуру в Photoshop, выбираете один из ее пикселей, записываете этот цвет в 3ds Max и получаете совершенно другие результаты. Например, если в цветовом меню выбрать 127, то результат будет отличаться от того, если в слот текстуры поместить jpeg-текстуру с цветом 127.
- То же самое происходит и с другой стороны - если выбрать цвет для материала при белом освещении, скажем, 255 127 0, затем выполнить рендеринг, а затем скопировать изображение в Photoshop, то материал будет иметь совсем другое значение зеленого цвета.

RGB 176 39 50 выбирается в Photoshop Color Picker. Эти значения представляют интенсивный бордовый цвет.

Точно такие же значения RGB копируются в Corona Color Picker в 3ds Max с отключенным флажком sRGB (это поведение по умолчанию при использовании родного цветосборщика 3ds Max!). В результате получается совершенно другой, гораздо более пастельный цвет, чем тот, что мы видели в Photshop.

Включение флажка sRGB в Corona Color Picker делает отрисованный цвет соответствующим тому, который был выбран в Photoshop. Обратите внимание, что значения цветов остаются неизменными независимо от состояния флажка sRGB.

В9: Как работает Corona Color Picker?
A9: При выключенном флажке sRGB он работает точно так же, как и в 3ds Max, за одним исключением: мы сделали ползунки перцептивно однородными, так что примерно половина шкалы показывает темные цвета, а другая половина - светлые. Когда вы устанавливаете флажок sRGB, то ничего не меняется (отображаемый цвет, ползунки, ...), кроме числовых значений - они теперь в sRGB.

Это означает, что при включенном флажке sRGB вы можете копировать цвета непосредственно из Photoshop, Интернета и т.д. без изменения яркости.

В родном 3ds Max color picker черные цвета занимают только очень маленький диапазон ползунка. Corona Color Picker имеет более равномерный градиент, что делает его более удобным в использовании.


Q10: Должен ли флажок sRGB быть включен или выключен?
A10: Не существует "правильного" решения. Визуальный выбор цветов работает одинаково в обоих случаях. Единственное, что меняется, - это числовые значения. Что лучше - зависит от ситуации.

Выключите флажок sRGB для согласованности с 3ds Max.

Включите флажок sRGB, когда вам нужно соответствовать значениям Photoshop или веб.


В11: Это сбивает с толку, но я хочу использовать новый выбор цвета из-за температуры!
A11: Нет проблем, просто оставьте sRGB=off, чтобы иметь то же поведение, что и в 3ds Max.


Q12: Какое цветовое пространство использует Corona Renderer?

A12: Он использует цветовое пространство WideRGB, которое затем отображается как sRGB на вашем мониторе.

Версия "Меня не беспокоят технические подробности"

При использовании Corona Color Picker, оставьте флажок sRGB выключенным. Он будет вести себя точно так же, как 3ds max color picker.
Когда вы копируете значения RGB между Photoshop и 3ds Max и замечаете, что результат не совпадает, сначала включите sRGB, а затем скопируйте значения. Вы можете мысленно переименовать флажок в "сопоставить числа в Photoshop вместо 3ds Max".


Существует 3 различных качества для ползунка:

a) Является ли прогрессия ползунка равномерной в sRGB или linearRGB?
В Corona - в sRGB, в Max - в linearRGB.

b) Отображаются ли цвета в sRGB или linearRGB?
И в Max, и в Corona они отображаются в sRGB.

c) Отображаются ли числа в sRGB или linearRGB?
В Max - в linearRGB, в Corona - в sRGB.

Как видите, 3ds Max продвигает ползунок в linearRGB, но отображает его в sRGB, что приводит к его неравномерности (черный цвет почти не отображается). Corona и прогрессирует, и отображает его в sRGB, что приводит к равномерному градиенту


Более подробно ознакомиться со всеми курсами образовательного проекта CGBandit вы можете здесь: https://www.cgbanditcourse.com

Перевод статьи осуществлен образовательным проектом CGBandit c официального сайта coronarenderer.

Комментарии (0)