Войти
ПрограммированиеФорумГрафика

Правильная цветопередача, гамма-коррекция, tone mapping и цветовые пространства. Поболтаем-с?

Страницы: 1 2 3 4 Следующая »
#0
18:10, 20 сен 2017

Цель: достичь максимально правдоподобную цветопередачу, которая упрется в сами возможности монитора

Я структурировал информацию и смог выделить следующие вопросы:

1. Во многих источниках про гамма-коррекцию значение gamma = 2.2, однако... Есть ли возможность получить точное значение гаммы от самого монитора, чтобы сделать максимально правдоподобную гамма-коррекцию? Я крупно сомневаюсь что все мониторы придерживаются именно значения 2.2, к тому же не исключены небольшие погрешности

2. Принято полагать, что все diffuse-текстуры по умолчанию находятся в sRGB пространстве. Но многие графические редакторы, в частности Photoshop, могут работать с AdobeRGB, например. Разница вроде как и несущественна, но... Переводить AdobeRGB в линейное пространство RGB тем же методом что и sRGB заведомо неверно? Есть форматы изображений, которые хранят информацию о цветовом пространстве? Как быть с png/jpg/etc?

3. Когда изображение сохраняется в sRGB через тот же Photoshop, используется какое значение gamma? Или это значение можно изменять во время экспорта?

4. Какая функция тон маппинга сейчас самая актуальная? Где можно почитать про реализации? Я использую такую ф-цию: vec3(1.0) - exp(-сolor * exposure); , но честно говоря не знаю как она называется. Также слышал про ф-цию Рейнхарда: color / (color + vec3(1.0))

5. Что можно ещё предпринять для более правильной цветопередачи? Ваши размышления?

6. Как работают тесты для подбора гаммы "на глаз"? Сложно ли такое реализовать самому? Где можно почитать?

7. А есть ли вариации функции гамма-коррекции? Или она одна?: pow(color, vec3(1.0 / gamma));

#1
20:41, 20 сен 2017

Saitei
> Какая функция тон маппинга сейчас самая актуальная?
Сейчас в движки внедряют поддержку ACES Tonemapping. В Unreal Engine 4 к тому же добавили поддержку HDR мониторов + автоматическое определение гаммы монитора. В Unity 5 практически весь код для пост-эффектов выдернули из UE4 (особенно тонирование).
https://www.shadertoy.com/view/Mdfcz7
https://github.com/Unity-Technologies/PostProcessing/blob/feaee80… mapping.cginc
https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Sha… mapCommon.ush

Saitei
> А есть ли вариации функции гамма-коррекции? Или она одна?: pow(color, vec3(1.0
> / gamma));
В UE4 делают примерно так (берут значение гаммы за 2.4), но, вроде бы, используются и другие функции с зависимостью от гаммы монитора:

float3 toLinear(float3 rgb)
{
  rgb = max(6.10352e-5, rgb);
  return rgb > 0.04045 ? pow( rgb * (1.0 / 1.055) + 0.0521327, 2.4 ) : rgb * (1.0 / 12.92);
}

float3 toGamma(float3 lin)
{
  lin = max(6.10352e-5, lin);
  return min(lin * 12.92, pow(max(lin, 0.00313067), 1.0/2.4) * 1.055 - 0.055);
}

Я реализовал ACES Tonemapping у себя, вот сравнение с UE4:

+ Показать
+ Показать
#2
21:18, 20 сен 2017

ENAleksey
> Сейчас в движки внедряют поддержку ACES Tonemapping. В Unreal Engine 4 к тому
> же добавили поддержку HDR мониторов + автоматическое определение гаммы
> монитора. В Unity 5 практически весь код для пост-эффектов выдернули из UE4
> (особенно тонирование).
Очень полезная инфа, спасибо большое!

ENAleksey
> вроде бы, используются и другие функции с зависимостью от гаммы монитора:
А можно по-подробнее? И самое главное - как получить гамму монитора?

ENAleksey
> Я реализовал ACES Tonemapping у себя, вот сравнение с UE4:
А где кто? Первый скриншот - ваш? =)

ENAleksey
> В UE4 делают примерно так (берут значение гаммы за 2.4)
А чем это обусловлено? По идее же цвета будут не совсем корректными

#3
21:59, 20 сен 2017

Saitei
> А можно по-подробнее? И самое главное - как получить гамму монитора?
Вот здесь происходит коррекция цвета и тонирование, после идёт преобразование из линейного пространства в пространство монитора:
https://github.com/EpicGames/UnrealEngine/blob/1d2c1e48bf49836a4f… mbineLUTs.usf
В зависимости от значения GetOutputDevice() выбираем, в какое пространство преобразовывать:
- sRGB
- Rec 709
- ACES 1000nit transform with PQ/2084 encoding
- ACES 2000nit transform with PQ/2084 encoding
- Gamma 2.2
Для определения монитора, скорее всего, можно использовать SDK от NVIDIA (там и скомпилированный пример есть): https://developer.nvidia.com/high-dynamic-range-display-development
Там же есть и статьи об HDR, ACES. https://developer.nvidia.com/preparing-real-hdr

#4
22:15, 20 сен 2017

Saitei
> А где кто? Первый скриншот - ваш? =)
Под первым спойлером мой скриншот с демонстрацией вычисления освещения в линейном пространстве и ACES Tonemapping. Под вторым: первые два - мои, оставшиеся два - Unreal Engine 4.
Особенностью ACES Tonemapping является то, что очень яркие цвета стремятся к белому.
Вот сравнение разных видов тонирования (правда, это старые скриншоты, без гамма-коррекции):

+ Показать

А вот новые (только ACES):

+ Показать
#5
23:47, 20 сен 2017

Saitei
>А чем это обусловлено? По идее же цвета будут не совсем корректными
Насколько я знаю:
1. Формула из спеки sRGB. https://en.wikipedia.org/wiki/SRGB :
Изображение
Изображение
2. Сделано оно так, чтобы производные в 0 не были 0 или inf.

Ну и график очень похож на c^(2.2) и c^(1/2.2) соответственно.

#6
7:46, 21 сен 2017

Разве можно получить параметры монитора, у которого нет nvSync или freeSync?

#7
14:15, 21 сен 2017

Saitei
> vec3(1.0) - exp(-сolor * exposure); , но честно говоря не знаю как она называется.

Называется экспоненциальная

У себя после сравнений разных функций остановился на Reinhard. Чисто визуально выглядело приятнее.

#8
14:22, 21 сен 2017

Мне ACES не нравится двумя вещами - сильно искажает цвета и при этом очень мудрёный. Тонмаппинг - вещь субъективная, если только не пытаться копировать восприятие света человеческими глазами, но что-то никто этим не заморачивается, зато пытаются копировать какие-то фотоплёнки и хз что. Так что я б не сказал, что какой-то из них передовой, какой нравится - такой и бери. Мой выбор обычно - анчартедовый (в гта5 тоже он) - http://filmicworlds.com/blog/filmic-tonemapping-operators/ он искажает цвета меньше других, сжимает пересветы, убирает перечернения. Немного серит, но это проще твикнуть, чем уехавшие цвета.

#9
14:40, 21 сен 2017

FordPerfect
> Ну и график очень похож на c^(2.2) и c^(1/2.2) соответственно.
Спасибо, теперь стало ясно откуда возникло такое магическое приближение :)


0xc0de
> У себя после сравнений разных функций остановился на Reinhard. Чисто визуально
> выглядело приятнее.
А с какими ф-циями сравнивал?

ENAleksey
выглядит солидно! А твой код где-нибудь можно почитать?
Это у тебя так блум прикольно светит? :)

#10
14:52, 21 сен 2017

Saitei
> 4. Какая функция тон маппинга сейчас самая актуальная? Где можно почитать про реализации?
Любой тон-маппинг, отличный от clamp(color/exposure), — это искажение, даже просто clamp — это уже искажение, но с ним ничего не поделать.
Соответственно, не вижу смысла обсуждать гаммы и sRGB при включенном тон-маппинге.

#11
15:07, 21 сен 2017

}:+()___ [Smile]
> Любой тон-маппинг, отличный от clamp(color/exposure), — это искажение, даже
> просто clamp — это уже искажение, но с ним ничего не поделать.
> Соответственно, не вижу смысла обсуждать гаммы и sRGB при включенном
> тон-маппинге.
А можно подробнее? Заинтересовал твой ответ. Кламп все обрезает же (до каких границ?), зачем?

#12
18:38, 21 сен 2017

Saitei
> А можно подробнее? Заинтересовал твой ответ. Кламп все обрезает же (до каких границ?), зачем?
Кламп обрезает резко, а, например, твое 1 − exp обрезает плавно. Т. е. вносит искажения даже тогда, когда требуемая яркость пикселя не превосходит предела монитора.
Что делать с превышением — это отдельный вопрос, лично я считаю, что наиболее близким к физической реальности будет bloom-фильтр превышения.

#13
1:40, 22 сен 2017

*подписался*

#14
7:45, 22 сен 2017

Можно глупый вопрос? :))) А для какой именно цели делается Tone Mapping - для стилизации картинки или чего-то более нужного?

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.