|
- shader_type canvas_item;
-
- uniform vec4 cell_color : hint_color;
- uniform float cell_energy : hint_range(1.0, 20.0) = 1.0;
- uniform float rimWidth : hint_range(1.0, 3.0) = 2.0;
- uniform vec4 rim_color : hint_color;
- uniform float fisheye_power = 2.0;
- uniform float wave_amp : hint_range(-1.0, 1.0) = 0.25;
- uniform float wave_freq : hint_range(0.0, 1.0) = 0.25;
- uniform float wave_scale :hint_range(0.0, 10.0) = 1.0;
-
- vec2 random2(vec2 p){
- return fract(sin(vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)))) * 43758.5453);
- }
-
- float ramp(float v, float f_min, float f_max){
- float res = (v - f_min) / (f_max - f_min);
- return max(0.0, min(res, 1.0));
- }
-
- float CellularNoise(vec2 vUV, float scale, float time){
- // Code modified from...
- // https://thebookofshaders.com/12/
- vec2 st = vUV * scale;
- //st.x = vres.x/vres.y;
-
- vec2 i_st = floor(st);
- vec2 f_st = fract(st);
-
- float min_dist = 1.0;
-
- for (int y = -1; y <= 1; y++){
- for (int x = -1; x <= 1; x++){
- vec2 neighbor = vec2(float(x), float(y));
- vec2 point = random2(i_st + neighbor);
- point = 0.5 + (0.5 * sin(time + (6.2831 * point)));
- float dist = length((neighbor + point) - f_st);
- min_dist = min(min_dist, dist);
- }
- }
-
- return min_dist;
- }
-
-
- vec2 fisheye(vec2 p) {
- // Function borrowed and slightly modified from...
- // https://gist.github.com/henriquelalves/989fdd72e10c90091188
- p *= 2.0;
- p -= vec2(1.0, 1.0);
- if (length(p) >= 1.5){return p;}
- //return p;
- if(p.x > 0.0){
- float angle = p.y / p.x;
- float theta = atan(angle);
- float radius = length(p);
- radius = pow(radius, fisheye_power);
-
- p.x = radius * cos(theta);
- p.y = radius * sin(theta);
- } else {
- float angle = p.y / p.x;
- float theta = atan(angle);
- float radius = length(p);
- radius = pow(radius, fisheye_power);
-
- p.y = radius * sin(-theta);
- p.x = radius * cos(theta);
- p.x = - p.x;
- }
-
-
- return 0.5 * (p + vec2(1.0,1.0));
- }
-
- vec2 wavey(vec2 p, float time) {
- float dx = wave_amp * sin(wave_freq * (p.y * wave_scale) * time);
- float dy = wave_amp * cos(wave_freq * (p.x * wave_scale) * time);
- //return vec2(dx, dy);
- return vec2(p.x + dx, p.y + dy);
- }
-
-
- void fragment(){
- float n = ramp(CellularNoise(wavey(fisheye(UV.xy), TIME), 5.0, TIME * cell_energy), 0.2, 0.9);
- float rim = length(vec2(0.5, 0.5) - (UV.xy));
- float mask = 1.0;
- if (rim > 0.5){
- rim = 0.0;
- mask = 0.0;
- }
- vec4 r_color = rim_color;
- rim = ramp(pow(rim, 4.0 - rimWidth), 0.125, 0.5);
-
- vec4 color = vec4(((cell_color.rgb * 0.5) + (texture(SCREEN_TEXTURE, wavey(SCREEN_UV, TIME*2.0)).rgb * 0.5)) * n, n);
- if (mask > 0.0){
- if (rim >= 0.9 || rim > n){
- color = color + vec4(rim_color.rgb * rim, rim);
- }
- } else {
- color.a = 0.0;
- }
-
- COLOR = color;
- }
|