Files
orx/orx-fx/src/shaders/glsl/distort/stack-repeat.frag
2021-06-27 21:07:44 +02:00

41 lines
1.1 KiB
GLSL

in vec2 v_texCoord0;
uniform sampler2D tex0;// input
uniform int repeats;
uniform float zoom;
uniform float xOrigin;
uniform float yOrigin;
uniform float xOffset;
uniform float yOffset;
uniform float rotation;
out vec4 o_color;
void main() {
vec2 origin = vec2((xOrigin+1.0)/2.0, (yOrigin+1.0)/2.0);
vec2 ts = textureSize(tex0, 0);
float r = ts.x/ts.y;
vec2 offset = vec2(1.0, r) * vec2(xOffset, yOffset);
vec2 uv = v_texCoord0 - vec2(origin);
float rad = (rotation/180) * 3.1415926535;
vec2 cs0 = vec2(cos(rad), -sin(rad));
vec2 cs1 = vec2(sin(rad), cos(rad));
mat2 rotStep = mat2(cs0, cs1);
mat2 rot = rotStep;
vec4 c = texture(tex0, v_texCoord0);
for (int i = 1; i <= repeats; ++i) {
//vec2 s = (uv * (1.0 + zoom) * i) + vec2(0.5);
vec2 s = (rot * uv * pow(1.0 + zoom,i*1.0) )+ vec2(origin) + vec2(offset) * i;
float f = s.x >= 0.0 && s.y > 0.0 && s.x < 1.0 && s.y < 1.0? 1.0 : 0.0;
vec4 sc = texture(tex0, s) * f;
c = c * (1.0-sc.a) + sc;
if (c.a > 1.0) {
c.a = 1.0;
}
rot *= rotStep;
}
o_color = c;
}