среда, 24 января 2018 г.

Хроматическая аберрация



Алгоритм эффекта: каналы GBA оставляем на месте, а канал R сдвигаем на несколько пикселей в любую сторону. Можно изменять не именно красный канал, а и любой другой.

Самый простой код хроматической аберрации для AGK на языке GLSL:

uniform sampler2D texture0;

varying mediump vec2 uvVarying;

uniform vec2 agk_resolution;
uniform float agk_sintime;

void main()
{


vec2 scale = 1.0/agk_resolution;
vec4 color = vec4(texture2D(texture0, uvVarying ).rgba);
vec2 UV_MOD=vec2(3.0*agk_sintime*agk_sintime , 0.0 );
color.r = texture2D(texture0, uvVarying+UV_MOD*scale).r;

gl_FragColor = color;
}


Переменная scale нужна для определения размера одного пикселя на экране, так как OpenGL использует нормализованные вектора длиной в 1.0 (при любой ширине (или высоте) экрана, первый пиксель будет иметь координату по х (или у) 0.0, а последний пиксель будет 1.0)   

vec4 color = vec4(texture2D(texture0, uvVarying ).rgba); - объявляем переменную и записываем в нее цвет пикселя текстуры texture0 с координатами uvVarying.
Если используем все 4 канала текстуры, то ".rgba" в конце и vec4 можно не писать.
Вот так: 
vec4 color = vec4(texture2D(texture0, uvVarying ).rgba);
или (равноценно)
vec4 color = texture2D(texture0, uvVarying);

vec2 UV_MOD=vec2(3.0*agk_sintime*agk_sintime , 0.0 ); - наша новая переменная (2-компонентный вектор) для модификации смещения координаты текстуры на 3.0 пикселя (3 пикселя может и много, но для большей выразительности эффекта сойдет). 
agk_sintime используется для динамического изменения эффекта с течением времени.
agk_sintime - имеет значение в диапазоне от -1.0 до 1.0
А вот agk_sintime*agk_sintime дает значение в диапазоне от 0.0 до 1.0, что даст смещение только в одну сторону.

color.r = texture2D(texture0, uvVarying+UV_MOD*scale).r; - заменяем красный канал текстуры на красный канал этой же текстуры, но со сдвигом в 3 пикселя по оси х. Умножение на scale даст попиксельное нормализованное смещение для конкретного текущего разрешения экрана в правильных пропорциях.
gl_FragColor = color; -обязательно выводим наш цвет пикселя в переменную gl_FragColor .

Комментариев нет:

Отправить комментарий