ledbanner-shaders/chebyshev.glsl
2018-05-19 14:47:52 +02:00

54 lines
1.4 KiB
GLSL

float chebyshev(float x, int n){
const int MAX_POWER = 16;
vec2 tvec = vec2( 1., x);
mat2 m = mat2 (0., -1., 1., 2.*x);
for( int i = 2; i < MAX_POWER; i += 1){
if( i > n ) return tvec.y;
tvec = m*tvec;
}
return tvec.y;
}
//https://github.com/hughsk/glsl-hsv2rgb/blob/master/index.glsl
vec3 hsv2rgb(vec3 c) {
vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord / max(iResolution.x, iResolution.y);
uv *= 2.5;
uv.x -= 1.2;
uv.y -= 0.5;
float timex = iTime * .21;
float tx = cos(timex)*chebyshev(uv.x, 2) + sin(timex)* chebyshev(uv.x, 5) ;
float timey = iTime * 0.2;
float ty = cos(timey)*chebyshev(uv.y, 3) + sin(timey)* chebyshev(uv.y, 7) ;
float t2 = iTime * .5;
float csigma = cos(t2);
float s2sigma = 1. - csigma*csigma;
//next formula was taken from this paper
//http://boj.pntic.mec.es/~jcastine/Trabajos%20matematicos_archivos/cmj122-127.pdf
float b = tx*tx + ty*ty - 2.0*tx*ty*csigma + s2sigma;
float w = 3.*fwidth(b);
//float w = .2;
b *= 2.;
float bFloor = floor(b);
b = smoothstep(w,0.,abs(fract(b) -.5))/fwidth(b);
//b*= step(abs(uv.x), 1.);
//b*= step(abs(uv.y), 1.);
vec3 color = hsv2rgb(vec3(bFloor/10.+fract(iTime*0.1),1.,1.));
color *= b;
fragColor = vec4(color, 1.0);
}
// https://www.shadertoy.com/view/MtBBRG