Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef GL_ES
- precision mediump float;
- #endif
- #define PI 3.141592653589793
- #define TAU 6.283185307179586
- #define PX 0.01
- uniform vec2 u_resolution;
- uniform float u_time;
- float outerArcInAngles(float calcAngle, float angleMax1, float angleMin2, float angleMax2) {
- return smoothstep(0.0, angleMax1, calcAngle) - smoothstep(angleMin2, angleMax2, calcAngle);
- }
- float outerArcInRads(float len, float minRad1, float maxRad1, float minRad2, float maxRad2) {
- return smoothstep(minRad1, maxRad1, len) - smoothstep(minRad2, maxRad2, len);
- }
- float innerArcInAngles(float calcAngle, float arcRange, float angleMax1, float angleMin2, float angleMax2) {
- return smoothstep(arcRange, arcRange + angleMax1, calcAngle) - smoothstep(angleMin2 - arcRange, angleMax2 - arcRange, calcAngle);
- }
- float innerArcInAngles(float len, float edgeWidth, float minRad1, float maxRad1, float minRad2, float maxRad2) {
- return smoothstep(minRad1, maxRad1, len - edgeWidth) - smoothstep(minRad2, maxRad2, len + edgeWidth);
- }
- vec4 dArc(vec2 center, float radMin, float radMax, float edgeWidth, float angle, vec4 color1, vec4 color2) {
- vec2 pos = gl_FragCoord.xy;
- // Normalizando posição do pixel
- pos = pos/u_resolution*2.0 - 1.0;
- vec2 delta = pos - center;
- // Distância do centro ao px atual
- float len = length(delta);
- float invLen = 1.0/len;
- // pxRange = um pixel em radianos
- float pxRange = PX*invLen;
- float halfPxR = pxRange*0.5;
- // ângulo do centro ao px atual
- float tmp1 = acos(delta.x*invLen);
- float tmp2 = step(0.0, delta.y);
- float tmp3 = tmp2*tmp1 + (1.0 - tmp2)*(TAU - tmp1);
- float calcAngle = mod(PI + halfPxR - tmp3, TAU);
- float angleMax1 = pxRange;
- float angleMin2 = angle;
- float angleMax2 = angle + pxRange;
- float minRad1 = radMin - 0.5*PX;
- float maxRad1 = radMin + 0.5*PX;
- float minRad2 = radMax - 0.5*PX;
- float maxRad2 = radMax + 0.5*PX;
- // Entre os angulos (arco maior)
- float v1 = outerArcInAngles(calcAngle, angleMax1, angleMin2, angleMax2);
- // Entre os raios (arco maior)
- float v2 = outerArcInRads(len, minRad1, maxRad1, minRad2, maxRad2);
- // Entre os angulos (arco menor)
- float v3 = innerArcInAngles(calcAngle, edgeWidth*invLen, angleMax1, angleMin2, angleMax2);
- // Entre os raios (arco menor)
- float v4 = innerArcInAngles(len, edgeWidth, minRad1, maxRad1, minRad2, maxRad2);
- vec4 res = mix(color1, color2, v3*v4);
- res.a *= v1*v2;
- return res;
- }
- void main() {
- vec2 center = vec2(0.0, 0.0);
- float rad1 = 0.5;
- float rad2 = 1.0;
- float space = 0.04;
- float angle = PI + sin(u_time)*0.5;
- vec4 color1 = vec4(0.0, 0.75, 1.0, 0.5);
- vec4 color2 = vec4(0.0, 0.75, 1.0, 1.0);
- gl_FragColor = dArc(center, rad1, rad2, space, angle, color1, color2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement