#version 100 #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; precision highp int; #else precision mediump float; precision mediump int; #endif /*struct Precise { float mantissa, exponent; }; Precise Precise_make (inout Precise precise) { float extra_exp = ceil(log2(abs(precise.mantissa))); precise.mantissa /= exp2(extra_exp); precise.exponent += extra_exp; return precise; } Precise Precise_create (const in float n) { Precise precise; precise.mantissa = n; precise.exponent = 0.0; return Precise_make(precise); } Precise Precise_create (in float mantissa, in float exponent) { Precise precise; precise.mantissa = mantissa; precise.exponent = exponent; return Precise_make(precise); } Precise Precise_create (in Precise n) { Precise precise; precise.mantissa = n.mantissa; precise.exponent = n.exponent; return Precise_make(precise); } void Precise_plusEquals (inout Precise a, in Precise b) { a.mantissa += b.mantissa * exp2(b.exponent - a.exponent); Precise_make(a); } Precise Precise_plus (in Precise a, in Precise b) { Precise result = Precise_create(a); Precise_plusEquals(result, b); return result; } void Precise_minusEquals (inout Precise a, in Precise b) { b.mantissa = -b.mantissa; Precise_plusEquals(a, b); b.mantissa = -b.mantissa; Precise_make(a); } Precise Precise_minus (in Precise a, in Precise b) { Precise result = Precise_create(a); Precise_minusEquals(result, b); return result; } void Precise_multiplyEquals (inout Precise a, in Precise b) { a.mantissa *= b.mantissa; a.exponent += b.exponent; Precise_make(a); } Precise Precise_multiply (in Precise a, in Precise b) { Precise result = Precise_create(a); Precise_multiplyEquals(result, b); return result; } float Precise_toFloat (in Precise a) { return a.mantissa * exp2(a.exponent); }*/ uniform vec2 uCanvasSize; uniform vec2 uOffset; uniform float uScale; vec4 calc (vec2 texCoord) { /* Mandelbrot Fractal Attempt float x = texCoord.x, y = texCoord.y; float v = 10000.0, j = 10000.0; for (int i = 0; i < 100; ++i) { float xtemp = x*x - y*y + texCoord.x; y = y*x + x*y + texCoord.y; x = xtemp; v = min(v, abs(x*x + y*y)); j = min(j, abs(x*y)); if ((x*x + y*y) > 4.0) { float d = (float(i) - (log(log(sqrt(x*x + y*y))) / log(2.0))) / 50.0; v = (1.0 - v) / 2.0; j = (1.0 - j) / 2.0; return vec4(d+j, d, d+v, 1); } } return vec4(0, 0, 0, 1);*/ float x = 0.0, y = 0.0; float v = 10000.0, j = 10000.0; for (int i = 0; i < 100; ++i) { float xtemp = x*x - y*y + (texCoord.x + 1.0); y = 2.0 + x*y + (texCoord.y + 1.0); x = xtemp; v = min(v, abs(x*x + y*y)); j = min(j, abs(x*y)); if ((x*x + y*y) >= 8.0) { float d = (float(i) - (log(log(sqrt(x*x + y*y))) / log(2.0))) / 50.0; v = (1.0 - v) / 2.0; j = (1.0 - j) / 2.0; //return vec4(d, j, v, 1); //return vec4(1, 1, 1, 2) - vec4(d+j, d, d+v, 1); // Inverted return vec4(d+j, d, d+v, 1); } } //return vec4(0, 0, 0, 0); return vec4(0, 0, 0, 1); //return vec4(1.0 - length(vec2(-1.0, -1.0)-texCoord) / 2.0, (texCoord + vec2(1.0, 1.0)) / 2.0, 1.0); } void main (void) { vec2 texCoord = (gl_FragCoord.xy / uCanvasSize.xy) * 2.0 - vec2(1.0, 1.0); texCoord = (texCoord * uScale) + uOffset; gl_FragColor = calc(texCoord); }