shader_type canvas_item; uniform sampler2D tiles; uniform sampler2D palette; // uniform float tile_width = 8.0; uniform float tilemap_width = 256.0; // Require square tilemap for now const float index_scale = 255.0 / 16.0; // 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 void fragment() { // GLES2 float tile_idx = texture(TEXTURE, UV).a * index_scale; vec2 tile_uv = vec2(fract(tile_idx), trunc(tile_idx) / 16.0); vec2 sub_tile_uv = fract(UV / tilemap_width); // TODO: add sea HScroll, waterfall VScroll tile UV modulation // TODO: move cycling palette to a sampler2DArray or sampler3D rather than rebinding float color_idx = texture(tiles, tile_uv + (sub_tile_uv/16.0)).a * index_scale; float palette_uv = vec2(fract(color_idx), trunc(color_idx) / 16.0); COLOR = texture(palette, palette_uv); if (color_idx == 0.0) COLOR.a = 0.0; }