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

Color Vibrance (After Effects plugin) reverse-engineering

Страницы: 1 2 Следующая »
#0
7:42, 26 фев. 2019

У after effects есть такой plug-in, который называется Color Vibrance. Если опустить всю канитель вокруг их самовыдуманной терминологии, которая ни с чем не согласовывается, то алгоритм занимается отображением линейного параметра (чёрно-белый цвет) во что-то вроде теплового градиента, в основе которого лежит произвольный цвет. На первый взгляд может показаться, что результат — просто перемножение, но на самом деле вовсе нет, так как в результирующей палитре частично меняется hue получившегося цвета, а не только value/saturation. Вот пример, как того же самого можно добиться, применяя просто кривые к rgb каналам: https://www.videocopilot.net/blog/2014/05/new-plug-in-color-vibrance/ (на 1:36)

Далее в видео показывается, как того же самого можно добиться этим плагином в автоматическом режиме (на 3:10). Я пробовал придумать несколько формул, которые дают похожий результат, но мне всё равно не удалось получить такого же качества. На 5:24 ещё один хороший пример, как оно работает.

Может, кто-то догадается, что за преобразование они делают?

#1
7:47, 26 фев. 2019

Suslik
Посмотрел видео. В картинках изменение hue не увидел. Можно ткнуть носом, где оно?

#2
(Правка: 7:51) 7:51, 26 фев. 2019

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

#3
(Правка: 10:03) 8:00, 26 фев. 2019

во, добавил иллюстрацию для обычного перемножения и для моей реализации vibrance:
(обновил картинку, добавил вариант с другим цветом и формулу FordPerfect)
Изображение

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

#4
8:37, 26 фев. 2019

Похоже на
color = lerp(a, b*a,a)
saturation = a

#5
(Правка: 8:41) 8:39, 26 фев. 2019

Да там много всякого можно придумать.
Похоже на #3 визуально, например:

vec3 color=vec3(0.2,0.5,0.8);

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
  vec2 uv=fragCoord/iResolution.x;

    float B=1.0; // Black intensity.
    float W=1.75; // White intensity.
    float P=0.75; // Power.

    float c=length(texture(iChannel0,uv));
    fragColor=vec4(pow(color,vec3(P*(1.0/(c-B)-1.0/(W-B)))),1.0);
}
На ShaderToy текстуры Organic2 и Stars неплохо демонстрируют эффект.

#6
8:58, 26 фев. 2019

В смысле

vec3 color=vec3(0.2,0.5,0.8);

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
  vec2 uv=fragCoord/iResolution.x;

    float B=1.0; // Black intensity.
    float W=1.75; // White intensity.
    float P=0.75; // Power.

    float c=length(texture(iChannel0,uv));
    fragColor=vec4(pow(color,vec3(P*(1.0/max(c-B,0.0)-1.0/(W-B)))),1.0);
}
ясно.

#7
9:17, 26 фев. 2019

x*y*2 плюс color crosstalk плюс тонмаппинг

#8
9:19, 26 фев. 2019

Suslik
> и для моей реализации vibrance
А у тебя она хорошо себя ведет во всем диапазоне hue? Или только для синего цвета так хорошо вышло?

#9
9:24, 26 фев. 2019

Suslik
У меня просто вышло как-то так (вверху без vibrance, внизу с vibrance):
v2 | Color Vibrance (After Effects plugin) reverse-engineering
Но на синем цвете оно ведет себя плохо. :)

#10
(Правка: 10:42) 10:09, 26 фев. 2019

FordPerfect
добавил твою формулу в пост #3. у меня не получилось её настроить так, чтобы было достаточно много тёмного цвета. получается очень контрастный переход от чёрного к белому.

MrShoor
я использую цвета srgb(0.0f, 0.75f, 1.0f) (синий) и srgb(1.0f, 0.5f, 0.0f) (оранжевый) для тестов.

MrShoor
мне кажется, твой вариант плохо работает для других цветов, потому что ты тестируешь на цвете (1, 1, 0), у которого два канала совпадают, поэтому ты работаешь в hsv. это можно считать вырожденным случаем, так как после любого rgb-преобразования два канала всё равно будут совпадать. проще полагать, что значения во всех каналах разные и работать в rgb.
моя формула мне не нравится с точки зрения плавающего петуха, иногда её уносит в вырожденных случаях

мне кажется, искомая формула должна удовлетворять как минимум следующим критериям:
float3 Vibrance(float3 color, float value); — базовый вариант, у которого настраивается только цвет color и принимается на вход только чёрно-белая маска value.
Vibrance(blabla, 0.0f) = float3(0.0f, 0.0f 0.0f) — чёрные участки на маске должны переходить в чёрные участки после применения фильтра
Vibrance(blabla, 1.0f) = float3(1.0f, 1.0f, 1.0f) — белые участки на маске переходят в белый цвет? по крайней мере так себя ведёт семейство вручную настроенных фильтров из видео в нульпосте.
Vibrance(blabla, x) = blabla — должно существовать такое значение маски x, для которого цвет сохраняется. вероятно, положение x также должно быть одним из входных параметров?

#11
17:43, 26 фев. 2019

Не пробовал, но вот что предлагают:
https://stackoverflow.com/questions/33966121/what-is-the-algorith… rance-filters

#12
(Правка: 22:16) 22:16, 26 фев. 2019

Возьмите LUT текстуру, примените к ней повышающийся vibrance, получите график как разные цвета меняются от него, подгоните формулу под график)

(И мне потом расскажите)

#13
(Правка: 2:13) 2:13, 27 фев. 2019

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

#14
(Правка: 8:27) 8:26, 27 фев. 2019

чё-то мы заморочились и сделали более детальное исследование, что же делает тот плагин. вот картинка с разными входными данными для того плагина. вверху — фактически lookup table, можно по нему смотреть, что именно происходит со всеми цветами диапазона 0..1:

Изображение

preserve luminance — ещё один параметр эффекта в плагине, который сохраняет светимость. с ним более-менее понятно, он просто перенормализует цвет. поэтому интереснее всего смотреть на колонку preserve = 0

обратите внимание, что чёрный действительно всегда остаётся чёрным, а белый действительно всегда переходит в белый.

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