diff --git a/godot/effects/dithering/CanvasLayer.tscn b/godot/effects/dithering/CanvasLayer.tscn new file mode 100644 index 0000000..d5600ad --- /dev/null +++ b/godot/effects/dithering/CanvasLayer.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://effects/dithering/screen_space_shader.tres" type="Shader" id=1] + +[sub_resource type="ShaderMaterial" id=1] +shader = ExtResource( 1 ) +shader_param/seed = 81.0 +shader_param/power = 0.0022 +shader_param/speed = 0.1 +shader_param/param = 13.0 +shader_param/scale = 2.0 +shader_param/grid = 4 +shader_param/anim_period = 1.65 +shader_param/amount = 0.06 +shader_param/factor = 200.0 + +[node name="CanvasLayer" type="CanvasLayer"] + +[node name="ColorRect" type="ColorRect" parent="."] +material = SubResource( 1 ) +anchor_right = 1.0 +anchor_bottom = 1.0 diff --git a/godot/effects/dithering/screen_space_shader.tres b/godot/effects/dithering/screen_space_shader.tres new file mode 100644 index 0000000..5b34c37 --- /dev/null +++ b/godot/effects/dithering/screen_space_shader.tres @@ -0,0 +1,204 @@ +[gd_resource type="Shader" format=2] + +[resource] +code = "shader_type canvas_item; + +// Color space code from +// HSV: https://godotshaders.com/shader/hsv-adjustment/ +// LAB/XYZ: https://gist.github.com/msbarry/cd98f928542f5152111a +// Note: don't use the XYZ space, but sources use it to convert to LAB +uniform float seed = 81.0; +uniform float power : hint_range( 0.0, 1.0 ) = 0.0022; +uniform float speed = 0.1; + +uniform float param : hint_range(0.0, 255.0, 1.0); + +vec3 rgb2hsv(vec3 c) { + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +vec3 rgb2xyz(vec3 c) { + float R = ((c.r > 0.04045) ? pow((( c.r + 0.055 ) / 1.055), 2.4) : (c.r / 12.92)) * 100.0; + float G = ((c.g > 0.04045) ? pow((( c.g + 0.055 ) / 1.055), 2.4) : (c.g / 12.92)) * 100.0; + float B = ((c.b > 0.04045) ? pow((( c.b + 0.055 ) / 1.055), 2.4) : (c.b / 12.92)) * 100.0; + + float X = R * 0.4124 + G * 0.3576 + B * 0.1805; + float Y = R * 0.2126 + G * 0.7152 + B * 0.0722; + float Z = R * 0.0193 + G * 0.1192 + B * 0.9505; + + return vec3(X, Y, Z); +} + +vec3 xyz2rgb(vec3 c) { + float X = c.x / 100.0; + float Y = c.y / 100.0; + float Z = c.z / 100.0; + + float R = X * 3.2406 + Y * -1.5372 + Z * -0.4986; + float G = X * -0.9689 + Y * 1.8758 + Z * 0.0415; + float B = X * 0.0557 + Y * -0.2040 + Z * 1.0570; + + R = ((R > 0.0031308) ? (1.055 * ( pow( R, 1./2.4 ) ) - 0.055) : (12.92 * R)); + G = ((G > 0.0031308) ? (1.055 * ( pow( G, 1./2.4 ) ) - 0.055) : (12.92 * G)); + B = ((B > 0.0031308) ? (1.055 * ( pow( B, 1./2.4 ) ) - 0.055) : (12.92 * B)); + + return vec3(R, G, B); +} + +vec3 xyz2lab(vec3 c) { + float X = c.x / 95.047; + float Y = c.y / 100.0; + float Z = c.z / 108.883; + + X = ((X > 0.008856) ? (pow( X, 1./3.)) : (( 7.787 * X ) + ( 16./116.))); + Y = ((Y > 0.008856) ? (pow( Y, 1./3.)) : (( 7.787 * Y ) + ( 16./116.))); + Z = ((Z > 0.008856) ? (pow( Z, 1./3.)) : (( 7.787 * Z ) + ( 16./116.))); + + float L = ( 116. * Y ) - 16.; + float a = 500. * ( X - Y ); + float b = 200. * ( Y - Z ); + + return vec3(L, a, b); +} + +vec3 lab2xyz(vec3 c) { + float L = c.x; + float a = c.y; + float b = c.z; + + float Y = ( L + 16. ) / 116.; + float X = a / 500. + Y; + float Z = Y - b / 200.; + + Y = ((pow(Y,3.) > 0.008856) ? (pow(Y,3.)) : ((Y - 16. / 116.) / 7.787)); + X = ((pow(X,3.) > 0.008856) ? (pow(X,3.)) : ((X - 16. / 116.) / 7.787)); + Z = ((pow(Z,3.) > 0.008856) ? (pow(Z,3.)) : ((Z - 16. / 116.) / 7.787)); + + float ref_X = 95.047; + float ref_Y = 100.0; + float ref_Z = 108.883; + + return vec3(ref_X * X, ref_Y * Y, ref_Z * Z); +} + + +vec3 band_colors(vec3 rgb) +{ + return round(rgb * param) / param; +} + +vec3 band_colors_preserve_hue_lum(vec3 rgb) +{ + vec3 hsv = rgb2hsv(rgb); + hsv.r = round(hsv.r * param) / param; + vec3 lab = xyz2lab(rgb2xyz(rgb)); + lab.r = round(lab.r * (param / 100.0)) / (param / 100.0); + + // Into HSV + vec2 sv = rgb2hsv(xyz2rgb(lab2xyz(lab))).gb; + hsv.gb = sv; + return hsv2rgb(hsv); +} + +uniform float scale = 2.0; +uniform int grid = 5; + +vec3 band_dither(vec3 rgb, vec2 uv) +{ + + uv *= (1.0 / scale); + int x = int(mod(uv.x, float(grid))) + 1; + int y = int(mod(uv.y, float(grid))) + 1; + + vec3 hsv = rgb2hsv(rgb); + + int g = int(round(mix(float(grid), float(2), fract(hsv.r * param)))); + + + if (x % g == 0 && y % g == 0) { + hsv.r = ceil(hsv.r * param) / param; + } else { + hsv.r = floor(hsv.r * param) / param; + } + vec3 lab = xyz2lab(rgb2xyz(rgb)); + if (x % g == 0 && y % g == 0) { + lab.r = ceil(lab.r * (param / 100.0)) / (param / 100.0); + } else { + lab.r = floor(lab.r * (param / 100.0)) / (param / 100.0); + } + + // Into HSV + vec2 sv = rgb2hsv(xyz2rgb(lab2xyz(lab))).gb; + hsv.gb = sv; + + + return hsv2rgb(hsv); + +} + +uniform float anim_period : hint_range(0.1, 5, 0.01); + + + +vec2 random( vec2 pos ) +{ + return fract( + sin( + vec2( + dot(pos, vec2(12.9898,78.233)) + , dot(pos, vec2(-148.998,-65.233)) + ) + ) * 43758.5453 + ); +} + +uniform float amount = 0.060; + +uniform float factor = 200.0; + + +void fragment() +{ + vec2 uv = SCREEN_UV + ( random( UV + vec2( seed - TIME * speed, TIME * speed ) ) - vec2( 0.5, 0.5 ) ) * power; + COLOR = textureLod( SCREEN_TEXTURE, uv, 0.0 ); + + vec2 buv = UV; + //buv.r = buv.r % 25.0 + buv.r = round(buv.r * factor) / factor; + buv.g = round(buv.g * factor) / factor; + + + + float a = fract(sin(dot(buv, vec2(12.9898, 78.233) * TIME)) * 438.5453) * 1.9; + a = a * amount; + + COLOR.rgb = band_colors_preserve_hue_lum(COLOR.rgb); + //vec3 banded_nostalgia = band_colors(rgb); + COLOR.r -= a; + COLOR.g -= a; + COLOR.b -= a; + + //float weight = mod(TIME, anim_period) / anim_period; + //float double_weight = mod(TIME, anim_period*2.0) / (anim_period*2.0); + //weight = double_weight > 0.5 ? (1.-weight) : weight; + //vec3 mixed = mix(banded_nostalgia, banded_preserved, weight); + //COLOR.rgb = mixed; + + +} + + + +" diff --git a/godot/effects/grainy_shader.tres b/godot/effects/grainy_shader.tres new file mode 100644 index 0000000..58f611f --- /dev/null +++ b/godot/effects/grainy_shader.tres @@ -0,0 +1,56 @@ +[gd_resource type="ShaderMaterial" load_steps=2 format=2] + +[sub_resource type="Shader" id=1] +code = "/* + 砂嵐エフェクト by あるる(きのもと 結衣) + Screen Noise Effect Shader by Yui Kinomoto @arlez80 + + MIT License +*/ +shader_type canvas_item; + +uniform float seed = 81.0; +uniform float power : hint_range( 0.0, 1.0 ) = 0.0022; +uniform float speed = 0.1; + +vec2 random( vec2 pos ) +{ + return fract( + sin( + vec2( + dot(pos, vec2(12.9898,78.233)) + , dot(pos, vec2(-148.998,-65.233)) + ) + ) * 43758.5453 + ); +} + +uniform float amount = 0.060; + + +void fragment( ) +{ + vec2 uv = SCREEN_UV + ( random( UV + vec2( seed - TIME * speed, TIME * speed ) ) - vec2( 0.5, 0.5 ) ) * power; + COLOR = textureLod( SCREEN_TEXTURE, uv, 0.0 ); + + vec2 buv = UV; + //buv.r = buv.r % 25.0 + float factor = 200.0; + buv.r = round(buv.r * factor) / factor; + buv.g = round(buv.g * factor) / factor; + + + + float a = fract(sin(dot(buv, vec2(12.9898, 78.233) * TIME)) * 438.5453) * 1.9; + a = a * amount; + COLOR.r -= a; + COLOR.g -= a; + COLOR.b -= a; +}" + +[resource] +shader = SubResource( 1 ) +shader_param/seed = 81.0 +shader_param/power = 0.0022 +shader_param/speed = 0.1 +shader_param/amount = 0.06 diff --git a/godot/effects/grainy_shader.tscn b/godot/effects/grainy_shader.tscn index 39d5cd6..1c21970 100644 --- a/godot/effects/grainy_shader.tscn +++ b/godot/effects/grainy_shader.tscn @@ -1,59 +1,19 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=4 format=2] -[sub_resource type="Shader" id=1] -code = "/* - 砂嵐エフェクト by あるる(きのもと 結衣) - Screen Noise Effect Shader by Yui Kinomoto @arlez80 +[ext_resource path="res://effects/dithering/screen_space_shader.tres" type="Shader" id=1] +[ext_resource path="res://effects/grainy_shader.tres" type="Material" id=2] - MIT License -*/ -shader_type canvas_item; - -uniform float seed = 81.0; -uniform float power : hint_range( 0.0, 1.0 ) = 0.0022; -uniform float speed = 0.1; - -vec2 random( vec2 pos ) -{ - return fract( - sin( - vec2( - dot(pos, vec2(12.9898,78.233)) - , dot(pos, vec2(-148.998,-65.233)) - ) - ) * 43758.5453 - ); -} - -uniform float amount = 0.060; - - -void fragment( ) -{ - vec2 uv = SCREEN_UV + ( random( UV + vec2( seed - TIME * speed, TIME * speed ) ) - vec2( 0.5, 0.5 ) ) * power; - COLOR = textureLod( SCREEN_TEXTURE, uv, 0.0 ); - - vec2 buv = UV; - //buv.r = buv.r % 25.0 - float factor = 200.0; - buv.r = round(buv.r * factor) / factor; - buv.g = round(buv.g * factor) / factor; - - - - float a = fract(sin(dot(buv, vec2(12.9898, 78.233) * TIME)) * 438.5453) * 1.9; - a = a * amount; - COLOR.r -= a; - COLOR.g -= a; - COLOR.b -= a; -}" - -[sub_resource type="ShaderMaterial" id=2] -shader = SubResource( 1 ) +[sub_resource type="ShaderMaterial" id=3] +shader = ExtResource( 1 ) shader_param/seed = 81.0 shader_param/power = 0.0022 shader_param/speed = 0.1 +shader_param/param = 23.0 +shader_param/scale = 2.0 +shader_param/grid = 4 +shader_param/anim_period = 0.1 shader_param/amount = 0.06 +shader_param/factor = 200.0 [node name="shader" type="Spatial"] @@ -61,7 +21,13 @@ shader_param/amount = 0.06 layer = 100 [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] -material = SubResource( 2 ) +visible = false +material = ExtResource( 2 ) anchor_right = 1.0 anchor_bottom = 1.0 mouse_filter = 2 + +[node name="ColorRect2" type="ColorRect" parent="CanvasLayer"] +material = SubResource( 3 ) +anchor_right = 1.0 +anchor_bottom = 1.0