Advertisement
giovani-rubim

Best Shader Ever

Feb 6th, 2019
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.72 KB | None | 0 0
  1. #ifdef GL_ES
  2. precision mediump float;
  3. #endif
  4.  
  5. #define PI  3.141592653589793
  6. #define TAU 6.283185307179586
  7. #define PX  0.01
  8.  
  9. uniform vec2 u_resolution;
  10. uniform float u_time;
  11.  
  12. float outerArcInAngles(float calcAngle, float angleMax1, float angleMin2, float angleMax2) {
  13.     return smoothstep(0.0, angleMax1, calcAngle) - smoothstep(angleMin2, angleMax2, calcAngle);
  14. }
  15.  
  16. float outerArcInRads(float len, float minRad1, float maxRad1, float minRad2, float maxRad2) {
  17.     return smoothstep(minRad1, maxRad1, len) - smoothstep(minRad2, maxRad2, len);
  18. }
  19.  
  20. float innerArcInAngles(float calcAngle, float arcRange, float angleMax1, float angleMin2, float angleMax2) {
  21.     return smoothstep(arcRange, arcRange + angleMax1, calcAngle) - smoothstep(angleMin2 - arcRange, angleMax2 - arcRange, calcAngle);
  22. }
  23.  
  24. float innerArcInAngles(float len, float edgeWidth, float minRad1, float maxRad1, float minRad2, float maxRad2) {
  25.     return smoothstep(minRad1, maxRad1, len - edgeWidth) - smoothstep(minRad2, maxRad2, len + edgeWidth);
  26. }
  27.  
  28. vec4 dArc(vec2 center, float radMin, float radMax, float edgeWidth, float angle, vec4 color1, vec4 color2) {
  29.  
  30.     vec2 pos = gl_FragCoord.xy;
  31.  
  32.     // Normalizando posição do pixel
  33.     pos = pos/u_resolution*2.0 - 1.0;
  34.  
  35.     vec2 delta = pos - center;
  36.  
  37.     // Distância do centro ao px atual
  38.     float len = length(delta);
  39.  
  40.     float invLen = 1.0/len;
  41.  
  42.     // pxRange = um pixel em radianos
  43.     float pxRange = PX*invLen;
  44.     float halfPxR = pxRange*0.5;
  45.  
  46.     // ângulo do centro ao px atual
  47.     float tmp1 = acos(delta.x*invLen);
  48.     float tmp2 = step(0.0, delta.y);
  49.     float tmp3 = tmp2*tmp1 + (1.0 - tmp2)*(TAU - tmp1);
  50.     float calcAngle = mod(PI + halfPxR - tmp3, TAU);
  51.    
  52.     float angleMax1 = pxRange;
  53.     float angleMin2 = angle;
  54.     float angleMax2 = angle + pxRange;
  55.  
  56.     float minRad1 = radMin - 0.5*PX;
  57.     float maxRad1 = radMin + 0.5*PX;
  58.     float minRad2 = radMax - 0.5*PX;
  59.     float maxRad2 = radMax + 0.5*PX;
  60.    
  61.     // Entre os angulos (arco maior)
  62.     float v1 = outerArcInAngles(calcAngle, angleMax1, angleMin2, angleMax2);
  63.  
  64.     // Entre os raios (arco maior)
  65.     float v2 = outerArcInRads(len, minRad1, maxRad1, minRad2, maxRad2);
  66.  
  67.     // Entre os angulos (arco menor)
  68.     float v3 = innerArcInAngles(calcAngle, edgeWidth*invLen, angleMax1, angleMin2, angleMax2);
  69.  
  70.     // Entre os raios (arco menor)
  71.     float v4 = innerArcInAngles(len, edgeWidth, minRad1, maxRad1, minRad2, maxRad2);
  72.  
  73.     vec4 res = mix(color1, color2, v3*v4);
  74.     res.a *= v1*v2;
  75.     return res;
  76.  
  77. }
  78.  
  79. void main() {
  80.     vec2 center = vec2(0.0, 0.0);
  81.     float rad1 = 0.5;
  82.     float rad2 = 1.0;
  83.     float space = 0.04;
  84.     float angle = PI + sin(u_time)*0.5;
  85.     vec4 color1 = vec4(0.0, 0.75, 1.0, 0.5);
  86.     vec4 color2 = vec4(0.0, 0.75, 1.0, 1.0);
  87.     gl_FragColor = dArc(center, rad1, rad2, space, angle, color1, color2);
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement