2023-12-14 15:33:49 +08:00
|
|
|
shader_type canvas_item;
|
|
|
|
|
2023-12-16 06:58:06 +08:00
|
|
|
// based on: https://docs.godotengine.org/en/4.0/tutorials/shaders/custom_postprocessing.html
|
2023-12-14 15:33:49 +08:00
|
|
|
|
|
|
|
uniform vec2 size = vec2(32.0, 28.0);
|
|
|
|
uniform sampler2D screen_texture : hint_screen_texture, repeat_disable, filter_nearest;
|
|
|
|
|
|
|
|
void fragment() {
|
|
|
|
vec2 norm_size = size * SCREEN_PIXEL_SIZE;
|
|
|
|
bool half = mod(SCREEN_UV.y / 2.0, norm_size.y) / norm_size.y < 0.5;
|
|
|
|
vec2 uv = SCREEN_UV + vec2(norm_size.x * 0.5 * float(half), 0.0);
|
|
|
|
vec2 center_uv = floor(uv / norm_size) * norm_size;
|
|
|
|
vec2 norm_uv = mod(uv, norm_size) / norm_size;
|
|
|
|
center_uv += mix(vec2(0.0, 0.0),
|
|
|
|
mix(mix(vec2(norm_size.x, -norm_size.y),
|
|
|
|
vec2(0.0, -norm_size.y),
|
|
|
|
float(norm_uv.x < 0.5)),
|
|
|
|
mix(vec2(0.0, -norm_size.y),
|
|
|
|
vec2(-norm_size.x, -norm_size.y),
|
|
|
|
float(norm_uv.x < 0.5)),
|
|
|
|
float(half)),
|
|
|
|
float(norm_uv.y < 0.3333333) * float(norm_uv.y / 0.3333333 < (abs(norm_uv.x - 0.5) * 2.0)));
|
|
|
|
|
|
|
|
COLOR = textureLod(screen_texture, center_uv, 0.0);
|
|
|
|
}
|