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

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

Страницы: 1 2 3 4
#45
15:02, 1 авг 2018

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

pow(2.0f, ExposureBias)

или

pow(2.0f, ExposureBias) / (1.2f * pow(2.0f, EV100))

Я использую первый вариант.

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

float GetLogLumAverage(float3 color)
{
  float Intensity = max(dot(color, float3(0.2126, 0.7152, 0.0722)), g_fHistogramMinIntensity);
  return g_fHistogramMultiply * log2(Intensity) + g_fHistogramAdd; 
}

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

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

+ Код шейдера
+ Код программы

Затем перед тонированием умножаем цвет на значение из получившейся текстуры.

Реализацию частично взял из Unreal Engine. Если у тебя есть поддержка вычислительных шейдеров, то для достижения лучшего результата перед тем, как находить среднюю яркость сцены, можно строить гистограмму и отбрасывать слишком темные и слишком яркие значения.

#46
18:22, 8 авг 2018

vindast
> завал в фиолетовый цвет
Это исправляется:

+ Показать

Если кто-то хочет попробовать, то вот LUT текстура (гамма-коррекция уже применена):
Изображение

+ Код

В соседней теме предлагали Gran Turismo Tonemapper (кривая, презентация (jp, en)). Но похоже, что там всё немного сложнее, так как у них в презентации указано, что цвета должны стремиться к белому:

+ Показать
#47
21:16, 8 авг 2018

Не на тех цветах смотришь. Попробуй на половинчатых, где одна компонента 0.5, типа (1.0, 0.5, 0.0)

#48
23:25, 8 авг 2018

ENAleksey
Для Uncharted2Tonemap походу у тебя там неверная имплементация.

#49
23:44, 8 авг 2018

ENAleksey
Посмотрел еще на Gran Turismo Tonemapper. Двоякие чувства, и понравилось и не понравилось одновременно.
Понравилось, что он достаточно неплохо сохраняет прямой участок на значениях <0.6
Не понравилось, что он уже на значениях 3 практически упирается в единицу. Считаю это значительным минусом, и на твоих шариках хорошо видно эту проблему.

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

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