41 lines
1.1 KiB
GLSL
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;
|
|
}
|