34 lines
No EOL
1.2 KiB
GLSL
34 lines
No EOL
1.2 KiB
GLSL
shader_type canvas_item;
|
|
render_mode unshaded;
|
|
|
|
uniform vec4 viewport_rect;
|
|
uniform sampler2D occlusion_mask;
|
|
uniform vec4 occlusion_rect;
|
|
uniform float cell_div = 0.03125; // 1/cell_size = 1/32
|
|
uniform float diffusion = 0.3;
|
|
uniform float scale_factor = 0.5;
|
|
|
|
float tile_at(vec2 coord, vec2 camera_tile_offset, vec2 occlusion_div) {
|
|
return texture(occlusion_mask, (coord * cell_div - occlusion_rect.xy) * occlusion_div + camera_tile_offset).r;
|
|
}
|
|
|
|
void fragment() {
|
|
vec2 occlusion_div = 1.0 / occlusion_rect.zw;
|
|
vec2 camera_offset = viewport_rect.xy * scale_factor;
|
|
vec2 camera_tile_offset = camera_offset * cell_div * occlusion_div;
|
|
|
|
vec2 coords = UV.xy * viewport_rect.zw * scale_factor;
|
|
float tile = tile_at(coords, camera_tile_offset, occlusion_div);
|
|
|
|
vec4 ray_coords = vec4(0,0, viewport_rect.zw/2.) * scale_factor;
|
|
vec2 ray_dir = normalize(ray_coords.zw - ray_coords.xy);
|
|
if (int(coords.x+camera_offset.x) % 32 < 1 || int(coords.y+camera_offset.y) % 32 < 1) {
|
|
COLOR = vec4(1);
|
|
} else if (distance(coords, ray_coords.xy) < 10.0 || distance(coords, ray_coords.zw) < 10.) {
|
|
COLOR = vec4(0,1,0,1);
|
|
} else if (tile >= diffusion) {
|
|
COLOR = vec4(1,0,0,1);
|
|
} else {
|
|
COLOR = texture(SCREEN_TEXTURE, SCREEN_UV);
|
|
}
|
|
} |