gradient_circle_mask.swsl 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. // Has 2 circles, an inner one that is unaffected and an outer one. Anything past the outer one is full red
  2. // and in-between is a gradient.
  3. light_mode unshaded;
  4. uniform highp vec3 color;
  5. uniform highp float time;
  6. // Uniforms because it makes testing way easier. If needed make it const.
  7. uniform highp float outerCircleRadius;
  8. uniform highp float outerCircleMaxRadius;
  9. uniform highp float innerCircleRadius;
  10. uniform highp float innerCircleMaxRadius;
  11. uniform highp float darknessAlphaOuter;
  12. const highp float darknessAlphaInner = 0.0;
  13. void fragment() {
  14. highp vec2 pixelSize = vec2(1.0/SCREEN_PIXEL_SIZE.x, 1.0/SCREEN_PIXEL_SIZE.y);
  15. highp vec2 pixelCenter = pixelSize*0.5;
  16. highp float distance = length(FRAGCOORD.xy - pixelCenter);
  17. highp float innerRadius = innerCircleRadius + time * (innerCircleMaxRadius - innerCircleRadius);
  18. highp float outerRadius = outerCircleRadius + time * (outerCircleMaxRadius - outerCircleRadius);
  19. if(distance > outerRadius) {
  20. COLOR = vec4(color.x, color.y, color.z, darknessAlphaOuter);
  21. }
  22. else if(distance < innerRadius) {
  23. COLOR = vec4(0.0, 0.0, 0.0, darknessAlphaInner);
  24. }
  25. else {
  26. highp float ratio = (distance - innerRadius) / (outerRadius - innerRadius);
  27. highp float alpha = darknessAlphaInner + (darknessAlphaOuter - darknessAlphaInner) * ratio;
  28. COLOR = vec4(color.x, color.y, color.z, alpha);
  29. }
  30. }