radiation.swsl 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // From https://godotshaders.com/snippet/2d-noise/
  2. uniform sampler2D SCREEN_TEXTURE;
  3. uniform highp vec2 positionInput;
  4. uniform highp vec2 renderScale;
  5. uniform highp float life;
  6. uniform highp float range;
  7. void fragment() {
  8. highp vec2 finalCoords = (FRAGCOORD.xy - positionInput) / (renderScale * 32.0);
  9. highp float distanceToCenter = length(finalCoords);
  10. highp float nlife = pow(sin(clamp(life, 0.0, 1.0) * 3.141592), 0.5);
  11. highp float on = ((range - distanceToCenter) / range);
  12. highp float n = on;
  13. highp vec2 fcOffset = vec2(zFBM(finalCoords.xy + life / 2.0),zFBM(finalCoords.yx + life / 2.0));
  14. n *= zFBM((finalCoords + fcOffset) / (nlife / (n * 1.5))) * 1.1;
  15. n *= clamp(nlife, 0.0, 1.0);
  16. highp float a = 0.0; // Alpha
  17. highp float p = 0.0; // Position between L and R stops
  18. lowp vec3 lCol = vec3(0.0); // Left stop color
  19. lowp vec3 rCol = vec3(0.0); // Right stop color
  20. if (n <= 0.05) {
  21. p = 0.0;
  22. a = 0.0;
  23. lCol = vec3(0.0);
  24. rCol = vec3(0.0);
  25. } else if (n < 0.132) {
  26. p = (n - 0.05) / (0.132 - 0.05);
  27. a = p;
  28. lCol = vec3(0.0);
  29. rCol = vec3(0.098, 0.406, 0.112);
  30. } else if (n < 0.186) {
  31. p = (n - 0.132) / (0.186 - 0.132);
  32. a = 1.0;
  33. lCol = vec3(0.098, 0.406, 0.112);
  34. rCol = vec3(0.168, 1.000, 0.288);
  35. } else if (n < 0.388) {
  36. p = (n - 0.186) / (0.388 - 0.186);
  37. a = 1.0;
  38. lCol = vec3(0.168, 1.000, 0.288);
  39. rCol = vec3(0.583, 1.000, 0.640);
  40. } else if (n >= 0.388) {
  41. p = (n - 0.388) / 0.5;
  42. a = 1.0;
  43. lCol = vec3(0.583, 1.000, 0.640);
  44. rCol = vec3(1.000, 1.000, 1.000);
  45. }
  46. p = clamp(p, 0.0, 1.0);
  47. highp vec4 warped = zTextureSpec(SCREEN_TEXTURE, (FRAGCOORD.xy*SCREEN_PIXEL_SIZE)+clamp(on*nlife*(fcOffset/8.0), 0.0, 1.0));
  48. // Extremely hacky way to detect FoV cones
  49. highp float osum = warped.r + warped.g + warped.b;
  50. highp float osr = osum > 0.1 ? 1.0 : 10.0 * osum;
  51. // Apply overlay
  52. // FYI: If you want a smoother mix, swap lCol and rCol.
  53. warped += mix(
  54. vec4(0.0),
  55. vec4(mix(rCol, lCol, vec3(p)), a),
  56. osr
  57. );
  58. COLOR = warped;
  59. }