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

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

Страницы: 1 2 3 4 Следующая »
#30
14:29, 8 фев 2018

ENAleksey
> И это замени:
Уже пробовал, вообще ошибку выдаёт!

#31
15:11, 8 фев 2018

> пробовал, вообще ошибку выдаёт
Потому что аргументы должны быть одного типа - либо все скаляры, либо все векторы

#32
17:15, 8 фев 2018

Daniil Petrov
> Я что-то делаю не так?
зовите доктора :)

#33
19:20, 8 фев 2018

ENAleksey
>И это замени:

ToneColor = vec3 (
        lerp ( dot ( ToneColor, AP1_RGB2Y ), ToneColor.r, 0.93 ),
        lerp ( dot ( ToneColor, AP1_RGB2Y ), ToneColor.g, 0.93 ),
        lerp ( dot ( ToneColor, AP1_RGB2Y ), ToneColor.b, 0.93 )
);

>На это:

ToneColor = mix(dot(ToneColor, AP1_RGB2Y), ToneColor, 0.93);

Собственно, у меня та же байда вышла

+ JPEG-1316x770

Подставил в конце

ToneColor = mix ( vec3 ( dot ( ToneColor, AP1_RGB2Y ) ), ToneColor, 0.93 );
#34
20:01, 8 фев 2018

чота хрень какая-то

#35
23:11, 8 фев 2018

Тогда уж и

    WorkingColor          = vec3 ( 
        lerp ( dot ( WorkingColor, AP1_RGB2Y ), WorkingColor.r, 0.96 ),
        lerp ( dot ( WorkingColor, AP1_RGB2Y ), WorkingColor.g, 0.96 ),
        lerp ( dot ( WorkingColor, AP1_RGB2Y ), WorkingColor.b, 0.96 )
    );

заменить на

WorkingColor = mix ( vec3 ( dot ( WorkingColor, AP1_RGB2Y ) ), WorkingColor, 0.96 );

а

float lerp(float a, float b, float t)
{
  return (a * (1.0 - t) + b * t);
}

упразднить, раз пошла такая массовка :))) А как проблему-то решить???

#36
1:44, 9 фев 2018

если уж берётесь копировать / вываливать код, то хотя бы пишите смысл аргументов, потому что результирующий цвет можнет быть уже в sRGB (оптимизация), вот эти вот AP1_2_sRGB очень смущают, например

#37
7:22, 12 фев 2018

Вот для чего действительно не помешает знать HLSL, так это для портирования шейдеров на GLSL :)))
Нашёл вот такой код на HLSL:

float3 ACESFilm( float3 x )
{
    float a = 2.51f;
    float b = 0.03f;
    float c = 2.43f;
    float d = 0.59f;
    float e = 0.14f;
    return saturate((x*(a*x+b))/(x*(c*x+d)+e));
}

Перереписал его на GLSL:

float saturate (float a) { return (clamp(a, 0.0, 1.0)); }

vec4 ACESFilm(vec4 x)
{
    float a = 2.51;
    float b = 0.03;
    float c = 2.43;
    float d = 0.59;
    float e = 0.14;
    return vec4(saturate((x.r *(a * x.r + b)) / (x.r * (c * x.r + d) + e)),
        saturate((x.g *(a * x.g + b)) / (x.g * (c * x.g + d) + e)),
        saturate((x.b *(a * x.b + b)) / (x.b * (c * x.b + d) + e)), x.a);
}

Посмотрите, примерно такой должен быть эффект ACES-тонирования? А то я как-то не особо точно представляю, каким должен быть конечный результат :)
У меня и так sRGB съел все тёмные и яркие тона, так эта штука ещё больше приводит их к серому виду :)))

#38
12:03, 12 фев 2018

>эта штука ещё больше приводит их к серому виду
Есть такая проблема, попробуй в другом пространстве, yCoCg например.

#39
17:59, 12 фев 2018

Daniil Petrov
> Посмотрите, примерно такой должен быть эффект ACES-тонирования? А то я как-то
> не особо точно представляю, каким должен быть конечный результат :)
> У меня и так sRGB съел все тёмные и яркие тона, так эта штука ещё больше
> приводит их к серому виду :)))
Результат использования этой функции сильно отличается от настоящего ACES тонирования.
Вот, сделал несколько скриншотов для сравнения:

+ Первый тест
+ Второй тест
+ Третий тест
#40
0:56, 1 авг 2018

ENAleksey
здравствуй ещё раз, спустя год :)

Я наткнулся на следующую реализацию ACES (она ведь с линейным цветом работает, верно?):

vec3 acesFilm(const vec3 x) {
    const float a = 2.51;
    const float b = 0.03;
    const float c = 2.43;
    const float d = 0.59;
    const float e = 0.14;
    return clamp((x * (a * x + b)) / (x * (c * x + d ) + e), 0.0, 1.0);
}

(её же ты предлагал парню в соседнем топике)

насколько хорошо она отрабатывает по сравнению с твоей реализацией? (в твоем шейдере было довольно много преобразований через матрицы)

ещё у меня есть вопрос про параметр exposure. Как его учесть? :)
Могу предположить, что через умножение на цвет, передаваемый в функцию тон маппинга, но... Я заметил, что в редакторах по типу substance painter и cmft studio выдержка может принимать отрицательные значения. Это сбивает с толку


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

#41
0:57, 1 авг 2018

ENAleksey
> Результат использования этой функции сильно отличается от настоящего ACES
> тонирования.
> Вот, сделал несколько скриншотов для сравнения:
черт возьми, я слепой!

#42
1:27, 1 авг 2018

Saitei
> выдержка может принимать отрицательные значения.
стоп... Или надо делать out = linear_to_srgb(tone_mapping(color * exp2(exposure)))?

Просто если юзать exp2 (тобишь 2^x), то проблема уходит (т.к. 2^-x == 1/(2^x) )

#43
9:59, 1 авг 2018

Saitei
Да, так тоже делают.
Ещё можно использовать EV100 и параметры камеры для установки экспозиции:

float EV100 = bFixedExposure ? FixedEV100 : log2(Fstop * Fstop * CameraShutterSpeed * 100.0f / max(1.0f, CameraISO));

Exposure = 1.0f / (1.2f * pow(2.0f, EV100));
#44
13:31, 1 авг 2018

ENAleksey
> Ещё можно использовать EV100 и параметры камеры для установки экспозиции:
это однозначно круто, но под мои задачи пока не подходит :(

ENAleksey
> Да, так тоже делают.
а exposure надо в линейном виде воспринимать? Или лучше через log/log2 преобразовывать? (насколько знаю, человеческие органы чувств больше любят логарифмическое изменение параметров)

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

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