shader to simil small pixels blocks losing signal (random black squares)
authorEduardo <[email protected]>
Wed, 31 Jan 2024 00:37:33 +0000 (01:37 +0100)
committerEduardo <[email protected]>
Wed, 31 Jan 2024 00:37:33 +0000 (01:37 +0100)
levels/unicorn_level/Shaders.gd
levels/unicorn_level/unicorn_map.tscn
shaders/screen_shaders.gdshader

index 92fda5ea84bb4498d30054f547e7e1d641eb1c78..dfdd59fe2f1118cef2856c3208257967b296a25e 100644 (file)
@@ -1,5 +1,29 @@
 extends ColorRect
 
-# Called every frame. 'delta' is the elapsed time since the previous frame.
+const squareLenghtMax := 50
+var blackBlock := false
+
+
 func _process(_delta):
+       # edit noise level
        material.set("shader_parameter/cell_amount", randf_range(100, 250))
+
+       # black squares from time to time
+       var current_time := Time.get_ticks_msec()
+       if (((current_time / 100) % 5 == 0) and (randf() < .1)): # put a square
+               blackBlock = true
+               material.set("shader_parameter/square_position", generate_square_points())
+       elif blackBlock: # remove the square
+               blackBlock = false
+               material.set("shader_parameter/square_position", Vector4())
+
+
+func generate_square_points() -> Vector4:
+       var res := get_viewport_rect().size
+
+       var x := randi_range(0, res.x)
+       var y := randi_range(x, x + squareLenghtMax)
+       var z := randi_range(0, res.y)
+       var w := randi_range(z, z + squareLenghtMax)
+
+       return Vector4(x, y, z, w)
index 4ee00e2e700d89bae4807889e4b56e056886378e..b594292a37e6010fa3fe083a011bdacabdde7bbd 100644 (file)
@@ -36,6 +36,7 @@ shader_parameter/period = Vector2(100, 100)
 shader_parameter/r_displacement = Vector2(3, -1)
 shader_parameter/g_displacement = Vector2(0, 0)
 shader_parameter/b_displacement = Vector2(-3, 1)
+shader_parameter/square_position = Vector4(0, 0, 0, 0)
 
 [node name="Node3D" type="Node3D"]
 
index 3d68d8608428551ec76968b98445a2382c8bac31..ebf26262252b5bf19aae7de59833fa4f44a9c773 100644 (file)
@@ -14,12 +14,15 @@ uniform vec2 r_displacement = vec2(3.0, 0.0);
 uniform vec2 g_displacement = vec2(0.0, 0.0);
 uniform vec2 b_displacement = vec2(-3.0, 0.0);
 
-vec2 modulo(vec2 divident, vec2 divisor){
+// Uniforms corruption squares
+uniform vec4 square_position = vec4(10., 200., 20., 50.); // x, y, z, w
+
+vec2 modulo(vec2 divident, vec2 divisor) {
        vec2 positiveDivident = mod(divident, divisor) + divisor;
        return mod(positiveDivident, divisor);
 }
 
-vec2 random(vec2 value){
+vec2 random(vec2 value) {
        value = vec2( dot(value, vec2(127.1,311.7) ),
                                  dot(value, vec2(269.5,183.3) ) );
        return -1.0 + 2.0 * fract(sin(value) * 43758.5453123);
@@ -50,6 +53,7 @@ float seamless_noise(vec2 uv, vec2 _period) {
 }
 
 void fragment() {
+
     // Generate random noise
     // float noise = (fract(sin(dot(UV, vec2(12.9898, 78.233))) * 43758.5453) - 0.5) * 2.0;
        float noise = seamless_noise(UV, period);
@@ -58,5 +62,9 @@ void fragment() {
        float g = clamp(texture(screen_texture, SCREEN_UV + vec2(SCREEN_PIXEL_SIZE*g_displacement), 0.0).g + noise * grain_amount * grain_size, 0.0, 1.0);
        float b = clamp(texture(screen_texture, SCREEN_UV + vec2(SCREEN_PIXEL_SIZE*b_displacement), 0.0).b + noise * grain_amount * grain_size, 0.0, 1.0);
 
-       COLOR = vec4(r, g, b, 1.0);
+       if (FRAGCOORD.x > square_position.x && FRAGCOORD.x < square_position.y && FRAGCOORD.y > square_position.z && FRAGCOORD.y < square_position.w) {
+               COLOR = vec4(0, 0, 0, 1.0);
+       } else {
+               COLOR = vec4(r, g, b, 1.0);
+       }
 }
\ No newline at end of file