Для контекста:
Я работаю над генеративной 2D-анимацией с OpenFrameworks.
Я пытаюсь реализовать шейдер, смещающий заливки некоторых фигур цветом, в зависимости от ориентации краев фигур.
В основном это изображение выглядит так:
и выплевывает что-то вроде этого:
Обратите внимание, что он намеренно берет только цвет с левой стороны фигуры.
Прямо сейчас мой фрагментный шейдер выглядит так:
#version 150
out vec4 outputColor;
uniform sampler2DRect fbo;
uniform sampler2DRect mask;
vec2 point;
vec4 col;
float x,i;
float delta = 200;
vec4 extrudeColor()
{
x = gl_FragCoord.x > delta ? gl_FragCoord.x - delta : 0;
for(i = gl_FragCoord.x; i > x; i--)
{
point = vec2(i, gl_FragCoord.y);
if(texture(fbo, point) != vec4(0,0,0,0)){
col = texture(fbo, point);
return vec4(col.r, col.g, col.b, (i-x)/delta);
}
}
return vec4(0,0,0,1);
}
void main()
{
outputColor = texture(mask, gl_FragCoord.xy) == vec4(1,1,1,1) && texture(fbo, gl_FragCoord.xy) == vec4(0,0,0,0) ? extrudeColor() : vec4(0,0,0,0);
}
Сэмплер mask
- это просто черно-белая версия второго изображения, которую я использую, чтобы избежать вычисления пикселей за пределами фигур.
Шейдер у меня работает, но он медленный, и я чувствую, что не использую правильное мышление и кодирование на GPU.
Актуальный, более общий вопрос:
Я совершенно новичок в glsl и opengl. Есть ли способ сделать этот тип итерации через соседние пиксели более эффективным и без стольких texture()
операций чтения?
Может быть, с использованием матриц? ИДК!