Почему карты Bump, Normal и Displacement не должны быть гамма-скорректированы?

9

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

Когда вы добавляете карту Bump, Normal или Displacement в свой шейдер, они не должны корректироваться гаммой. Но диффузные текстуры должны быть. Но почему?

Когда вы сохраняете файл в 8-битном (или 16-битном целом) формате в формате JPEG, PNG или TIFF, они получают сгоревшую гамму 0,4545 (1 / 2,2). Таким образом, камера захватывает свет из реального мира (который является линейным) и при сохранении фотографии в формате JPEG добавляется значение гаммы 1 / 2,2, как способ сжатия информации в 8 бит, а затем при просмотре изображения на мониторе, которое добавляет гамму 2,2, снова делая линейность яркости.

Таким образом, при использовании диффузных текстур (например, фото) вам необходимо «удалить» эту гамму 1 / 2.2, чтобы сделать ее линейной (называемой линеаризацией), так что теперь текстура выглядит темнее, но эти значения верны с математической точки зрения, поэтому средство визуализации будет сделать правильные расчеты. Примечание: программное обеспечение использовало гамму дисплея 2,2, чтобы убедиться, что текстуры выглядят правильно, только для внутреннего расчета они линеаризуются. Но когда я создаю карту Bump в Photoshop и сохраняю ее как JPG или PNG, то эта 1 / 2.2-гамма также сжигается в этом изображении, так почему же эту карту Bump также не нужно линеаризовать?

Если я загружаю карту Bump в 3ds Max с входной гаммой 2.2, как это было бы с текстурой Diffuse, diffuse выглядит правильно, но выпуклость выглядит неправильно, поэтому я должен установить входную гамму равной 1,0 для выпуклости, чтобы чтобы это выглядело правильно, но, как я уже сказал: почему, в обоих файлах изображений сгорела гамма 1 / 2.2, верно?

Кристоффер Хеландер
источник

Ответы:

5

Тот факт, что фотография хранится в гамма-пространстве, не связан с PNG или JPEG, а с тем, что это фотография.

Камера обнаруживает 50% -ную интенсивность, но собирается сохранить ее как 187 вместо 127, потому что более эффективно хранить информацию о цвете, которая важна для человеческого глаза, когда у вас есть только 256 различных возможных значений. Как и Фотошоп, если вы скажете это так.

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

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

Жюльен Геро
источник
Как вы говорите Photoshop сохранить изображение с запеченной гаммой, как вы сказали выше: «Как и Photoshop, если вы скажете это».
Кристофер Хеландер
Это не объясняет «почему» вообще. Это просто повторяет «что».
user1118321
@ user1118321: Я верю, что это так. Я добавил акцент в попытке прояснить ситуацию.
Жюльен Герто
Ну, правда, но это все еще не объясняет, почему. Я признаю, что у меня та же проблема, я просто упоминаю отсутствие пользы или вреда от такого сжатия. Нет необходимости, кроме того, почему данные изображений являются специфическими из-за человеческих чувств, в то время как наши пространственные рассуждения более линейны по своему характеру (что касается 3D-приложения)
joojaa
3

JPG, PNG или любые другие 8-битные форматы изображений не имеют встроенной гаммы 1 / 2,2. Они просто хранят значения от 0 до 255. Как эти данные интерпретируются, зависит от программного обеспечения, которое читает и записывает эти файлы. Интересно, что большинство программ для редактирования изображений по умолчанию использует гамма-цветовое пространство. Все кисти, эффекты, фильтры и даже палитра цветов работают в гамма-пространстве. Достаточно взглянуть на оттенки серого на палитре цветов в Photoshop. Они не следуют линейному распределению.

В результате Photoshop не выполняет преобразования между гаммой и линейным цветовым пространством при открытии или сохранении изображения (по умолчанию), а только при его отображении. Это означает, что вы можете использовать его для создания или редактирования линейных данных, таких как карта высот, так же легко, как и для редактирования фотографий. Карта рельефа не выглядит правильно при загрузке с гамма-коррекцией, потому что она не была сохранена с ним.

Quinchilion
источник
Вот видео на YouTube, также объясняющее, что сохраненное значение в изображении - это 1 / 2.2 (но он упрощает его и просто говорит, что это квадратный корень, в тексте есть отказ от ответственности.) Компьютерный цвет не работает - ссылка
Кристоффер Хеландер
@KristofferHelander Да, но он говорит, что только камера хранит значения в виде квадратных корней и только дисплей, который возвращает их в квадрат. Затем программное обеспечение для редактирования изображений, такое как Photoshop, просто откройте и сохраните изображение без преобразований, что приведет к появлению артефактов, показанных в видео при попытке смешать цвета.
Quinchilion
Поправь меня, если я ошибаюсь. Когда я рисую градиентную рампу в Photoshop, которая выглядит мне линейной на экране, значения в этой рампе на самом деле линейны. Но Photoshop добавляет гамму просмотра 1 / 2,2, так как монитор добавляет гамму 2,2, таким образом, значения пикселей изображения являются линейными, и они также выглядят линейными. Но эта гамма 1 / 2.2 - это только гамма для просмотра, которую Photoshop использует для отображения изображения, она не запекается в изображение, и, следовательно, в программном обеспечении 3D не нужно делать гамма-коррекцию изображения (используйте gamma 1.0), так как значения уже линейны?
Кристоффер Хеландер
@KristofferHelander goo.gl/yqkeUP Нижний градиент представляет физическую яркость. Если Photoshop применяет гамму 1 / 2.2 для рисования градиента или отображения изображения, вы увидите нижний градиент. Вместо этого вы видите верхнюю, которая, по совпадению, выглядит линейной, но это не так. Это также не будет работать для просмотра фотографий. Камера применила 1 / 2.2 при сохранении фотографии, затем Photoshop применил бы еще 1 / 2.2, но дисплей добавляет гамму 2.2 только один раз. Это не будет выглядеть правильно.
Quinchilion
Если я залью документ в Photoshop наполовину красным (255,0,0), а в другой половине - зеленым (0,255,0), а затем использую размытие по Гауссу, результирующий градиент становится коричневатым, а не желтым в середине, как показано в этом видео я разместил. Это почему? Если пиксели на изображении линейные, тогда почему математика испорчена? Я не понимаю, как карта смещения, нарисованная в Photoshop, линейна и хороша для рендеринга, но в то же время размытие пикселей искажается неправильной гаммой, а цвета становятся темными и коричневатыми?
Кристофер Хеландер
3

Введение

Это зависит от того, как вы создаете карту! Подумайте о следующем и дайте ему немного подождать, прежде чем идти вперед:

  1. Изображение отображается с гамма-коррекцией для ваших глаз
  2. Данные все еще только данные. Гамма-коррекция предназначена для части отображения, а не для части данных.

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

  • Если вы решите, что 128 - это наполовину ваша интенсивность, тогда это реальность. Так как это то, что ваша кодировка в потоке данных. Данные - это то, что вы интерпретируете как не предназначенные для человеческих глаз и монитора. Кого волнует, что монитор показывает значения как единственное на том, как вы интерпретируете данные, редактируя их.

Создание карты удара / смещения

Итак, теперь я описал, что данные до интерпретации. Но почему вы интерпретируете данные как линейные? Потому что тогда вы можете создать свой боковой профиль лучше. Посмотрите, что вы можете сделать, это думать о 100% непрозрачности вашей кисти как о высоте цели, которую вы хотите вырезать или слой. Затем вы можете использовать инструмент кривых, чтобы создать форму вашей кисти для штампов (так как вы думаете, что данные линейны).

введите описание изображения здесь

Изображение 1 : штамп с присоской.

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

введите описание изображения здесь

Изображение 2 : То же изображение смещено и интерпретировано линейно (заметьте, я немного масштабировал высоту, чтобы соответствовать размеру моего bb по умолчанию), работая по назначению.

Технически линейно лучше.

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

Во-вторых, изображению не нужно указывать, в каком цветовом пространстве оно находится. Просто редакторы изображений предполагают, что оно закодировано в sRGB. У вас нет причин делать такую ​​же интерпретацию, никакая информация не означает просто: «Никто не удосужился записать, что они думают». Так что, возможно, следует подчеркнуть, что вы должны пометить его как линейный. Но вот в чем проблема ... ваш компьютер не имеет легко доступного линейного профиля.

Как насчет Photoshop и размытия?

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

Но вы можете сделать одну из двух вещей, чтобы исправить это:

  1. Отключить гамма-коррекцию размытия
  2. установить рабочее пространство на линейный профиль

Вывод

Причина, по которой вам трудно с этим

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

Первый пункт особенно запутан. Я просто знаю, что ВСЕ мои карты удара и смещения на самом деле являются линейными. Но я не могу знать, каковы ваши карты. Скорее всего, они линейны, потому что почти все понимают, что данные линейны. Даже люди, которые не знают о гамме, имеют тенденцию делать это линейным для удара / смещения по какой-то причине (потому что это легко, и вы так думаете, изображения пока кто-то не скажет вам иначе).

joojaa
источник
Спасибо за ваш вклад - вау! :) Я посмотрю на это, когда у меня будет больше свободного времени. Я вернусь к вам, спасибо!
Кристофер Хеландер
Even people who do not know about gamma tend to do it linear for bump/displacement for some reasonВероятно, потому что эти карты генерируются.
Тара
3

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

Для связанной проблемы и исправления для Adobe Photoshop см. Эту колоду слайдов: https://docs.google.com/presentation/d/1vS5nAAnXbZ8Pt6-dXxy-xEXDkjfjXTmNnthNGccorl0/edit#slide=id.g14b3e28660_0_8

неравенство
источник
Это особенно верно для карты нормалей, если вы ожидаете, что длина вектора будет равна 1.
PaulHK