12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- uniform sampler2D tex;
- uniform float radius;
- uniform int iterations;
- uniform float brightness;
- uniform float width;
- uniform float height;
- uniform bool use_base_pixel;
- uniform bool prefer_closer_pixels;
- float srand(vec2 a) {
- return sin(dot(a, vec2(1233.224, 1743.335)));
- }
- float rand(inout float r) {
- r = fract(3712.65 * r + 0.61432);
- return (r - 0.5) * 2.0;
- }
- void main() {
- vec2 uv = cogl_tex_coord0_in.st;
- vec2 p = 16 * radius / vec2(width, height);
- float r = srand(uv);
- vec2 rv;
- vec2 dir;
- vec2 new_uv;
- int strength;
- int count = 0;
- vec4 c = vec4(0.);
- for (int i = 0; i < iterations; i++) {
- rv.x = rand(r);
- rv.y = rand(r) * 3.141592;
- dir = vec2(cos(rv.y), sin(rv.y));
- new_uv = uv + rv.x * dir * p;
- if (new_uv.x > 2. / width && new_uv.y > 2. / height && new_uv.x < 1. - 3. / width && new_uv.y < 1. - 3. / height) {
- strength = prefer_closer_pixels ? (iterations - i)^2 : 1;
- c += strength * texture2D(tex, new_uv);
- count += strength;
- }
- }
- if (count == 0 || use_base_pixel) {
- strength = prefer_closer_pixels ? (iterations + 1)^2 : 1;
- c += strength * texture2D(tex, uv);
- count += strength;
- }
- c.xyz *= brightness;
- cogl_color_out = c / count;
- }
|