Files
glsl_playground/weird/hud.glsl
2017-06-06 12:01:53 -04:00

106 lines
3.1 KiB
GLSL

#ifdef GL_ES
precision mediump float;
#endif
#define PI 3.14159265359
#define blue1 vec3(0.74,0.95,1.00)
#define blue2 vec3(0.87,0.98,1.00)
#define blue3 vec3(0.35,0.76,0.83)
#define blue4 vec3(0.953,0.969,0.89)
#define red vec3(1.00,0.38,0.227)
uniform vec2 u_resolution;
uniform float u_time;
mat2 rotate2d(float a) {
float c = cos(a);
return mat2(c, -sin(a), sin(a), c);
}
vec2 get_center() {
return(u_resolution/2.)/min(u_resolution.x, u_resolution.y);
}
vec2 get_st() {
return gl_FragCoord.xy/min(u_resolution.x, u_resolution.y);
}
float dist(vec2 center) {
vec2 st = get_st();
return distance(st, center);
}
vec3 circle(vec2 center, float width, float rad, vec3 color) {
float e = 0.003;
float d = dist(center);
vec3 res = color;
res *= smoothstep(rad-width/2.-e, rad-width/2., d);
res *= 1.-smoothstep(rad+width/2., rad+width/2.+e, d);
return res;
}
vec3 circle_with_trace(vec2 center, float width, float rad, vec3 color) {
float e = 0.003;
float d = dist(center);
float trace = 0.08;
vec3 res = color;
res *= smoothstep(rad-width/2.-e, rad-width/2., d);
res *= 1.-smoothstep(rad+width/2., rad+width/2.+e, d);
return (res+color*.5*(smoothstep(rad-trace, rad, d)-step(rad, d)));
}
float circle_clip(float radius) {
float d = dist(get_center());
return 1.-step(radius, d);
}
vec3 floating_circle() {
vec2 pos = vec2(cos(u_time)*sin(u_time), sin(u_time))*.5+get_center();
return circle(pos, 0.002, 0.002, vec3(1.));
}
vec3 line(float width, float angle, vec3 color, vec2 origin) {
float e = 0.003;
vec2 st = get_st();
st -= origin;
st *= rotate2d(angle);
return color*((smoothstep(-e, 0., st.x)-smoothstep(0., e, st.x)));
}
vec3 line_with_trace(float width, float angle, vec3 color, vec2 origin) {
float e = 0.003;
float trace = 0.9 * dist(get_center());
vec2 origst = get_st();
vec2 st = origst - origin;
st *= rotate2d(angle);
return (color*(smoothstep(-e, 0., st.x)-smoothstep(0., e, st.x))+color*.5*(step(0., st.x)-smoothstep(0., trace, st.x)))*step(0., -st.y);
}
vec3 target() {
vec2 center = vec2(cos(u_time*0.5), sin(u_time*0.5))*0.2+get_center()+vec2(cos(u_time*0.3), sin(u_time*0.3))*0.25;
vec3 blink = circle(center, 0.01, 0.005, red) * step(0.5, abs(sin(u_time*8.)));
vec3 border = circle(center, 0.003, 0.02, red);
vec3 impulse = circle_with_trace(center, 0.003, mod(u_time, 1.)*0.12+0.03, red);
return blink+border+impulse;
}
void main(){
vec3 color = vec3(0.0);
vec2 st = get_st();
float clip = circle_clip(.5);
color += circle(get_center(), 0.002, 0.02, blue1);
color += circle(get_center(), 0.002, 0.3, blue1);
color += circle(get_center(), 0.002, 0.4, blue1);
color += circle(get_center(), 0.005, 0.5, vec3(0.8));
color += circle(get_center(), 0.007, 0.6, blue1);
color += clip*line(0.001, PI/4., vec3(.5), get_center());
color += clip*line(0.001, -PI/4., vec3(.5), get_center());
color += clip*line_with_trace(0.001, u_time, blue2, get_center());
color += floating_circle();
color += target();
gl_FragColor = vec4(color,1.0);
}