38 lines
1.1 KiB
GLSL
38 lines
1.1 KiB
GLSL
#version 150
|
|
|
|
uniform vec4 color1;
|
|
uniform vec4 color2;
|
|
uniform float radius;
|
|
uniform float thickness;
|
|
uniform float start;
|
|
uniform float end;
|
|
uniform vec2 size;
|
|
uniform vec2 location;
|
|
|
|
out vec4 fragColor;
|
|
|
|
#define PI 3.141592653589793
|
|
#define RAD 0.0174533
|
|
|
|
void main() {
|
|
float startAngle = start * RAD;
|
|
float endAngle = startAngle + min(end * RAD, PI * 2);
|
|
|
|
float smoothThresh = 6.0 * (1.0 / length(size));
|
|
vec2 centerPos = ((gl_FragCoord.xy - location) / size.xy) * 2.0 - 1.0;
|
|
|
|
float dist = length(centerPos);
|
|
float bandAlpha = smoothstep(radius, radius + smoothThresh, dist) * smoothstep(radius + thickness, (radius + thickness) - smoothThresh, dist);
|
|
float angle = (atan(centerPos.y, centerPos.x) + PI);
|
|
float angleAlpha = smoothstep(angle, angle - smoothThresh, startAngle - 0.1) * smoothstep(angle, angle + smoothThresh, endAngle + 0.1);
|
|
|
|
float angle2 = (angle / PI * 180.);
|
|
angle2 = angle2 - 360. * floor(angle2 / 360.);
|
|
if (angle2 >= 180.) {
|
|
angle2 = (360. - angle2) * 2.;
|
|
} else {
|
|
angle2 = angle2 * 2.;
|
|
}
|
|
fragColor = mix(color1, color2, angle2 / 360.) * bandAlpha * angleAlpha;
|
|
}
|