ChocolateBird/shaders/worldmap_shader.gdshader

58 lines
2.3 KiB
Plaintext
Raw Normal View History

2023-07-27 19:38:53 +09:30
shader_type canvas_item;
uniform sampler2D tile_atlas : hint_normal;
uniform sampler2D palette : hint_normal;
2023-07-27 19:38:53 +09:30
// uniform float tile_width = 8.0;
uniform float tilemap_width = 512.0; // Require square tilemap for now
2023-07-27 19:38:53 +09:30
const float index_scale = 255.0 / 16.0;
2023-07-28 16:35:15 +09:30
const vec2 sea_tile_uv = vec2(0.125, 0.375);
const vec2 sea_tile_uv_end = vec2(0.25, 0.5);
const vec2 sea_tile_size = sea_tile_uv_end - sea_tile_uv;
const vec2 sea_tile_size_inv = 1.0/sea_tile_size;
2023-07-27 19:38:53 +09:30
// This shader maps from tileID texels to Tiles, and then applies palette.
// tiles hardcoded to 16x16 tiles for now
// palette hardcoded to 16x16 colors for now
vec2 get_tile_atlas_uv(float tile_id, vec2 uv) {
float tile_idx16 = tile_id * index_scale; // Rescale from [0.0, 1.0] to [0, 255] to [0, 15.9375 (15+15/16)]
float tile_row = trunc(tile_idx16) / 16.0;
float tile_col = fract(tile_idx16);
vec2 tile_uv = vec2(tile_col, tile_row); // Convert 15.9375 to vec2(0.9375==15/16, (15)/16), this should result in integer coordinates in [0,15] scaled to [0,15/16] for UV
2023-07-28 00:06:46 +09:30
vec2 sub_tile_uv = fract(uv * tilemap_width) / 16.0;
2023-07-28 16:35:15 +09:30
vec2 out_uv = tile_uv + sub_tile_uv;
// Sea HScroll tile UV modulation
// Make this branchless later
if (all(greaterThanEqual(out_uv, sea_tile_uv)) && all(lessThan(out_uv, sea_tile_uv_end))) {
vec2 sea_tile_uv_diff = out_uv - sea_tile_uv;
vec2 pos = sea_tile_uv_diff * sea_tile_size_inv;
// pos.x = fract(pos.x + fract(TIME*0.4) + cos(pos.y*0.5) + 20.0*sin(uv.y*20.0));
pos.x = fract(pos.x + fract(TIME*0.4) + 20.0*sin(uv.y*20.0));
pos.y = fract(pos.y + 0.5*sin(sin(TIME*0.5 + 32.0*uv.x)));
out_uv = mix(sea_tile_uv, sea_tile_uv_end, pos);
}
// TODO: waterfall VScroll UV modulation
return out_uv;
}
2023-07-27 19:38:53 +09:30
void fragment() {
// GLES2
2023-07-28 00:06:46 +09:30
// vec2 uv_tile = trunc(UV * tilemap_width) / tilemap_width;
vec2 uv_tile = UV;
float s = texture(TEXTURE, uv_tile).r;
2023-07-27 19:38:53 +09:30
// TODO: move cycling palette to a sampler2DArray or sampler3D rather than rebinding
vec2 lut_uv = get_tile_atlas_uv(s, UV);
2023-07-28 00:06:46 +09:30
float color_id = texture(tile_atlas, lut_uv).r;
float color_idx16 = color_id * index_scale;
float pal_row = trunc(color_idx16) / 16.0;
float pal_col = fract(color_idx16);
vec2 palette_uv = vec2(pal_col, pal_row);
2023-07-27 19:38:53 +09:30
COLOR = texture(palette, palette_uv);
2023-07-28 00:06:46 +09:30
COLOR.a = step(0.000001, color_idx16); // Branchless transparency
2023-07-27 19:38:53 +09:30
}