This repository has been archived on 2020-09-30. You can view files and clone it, but cannot push or open issues or pull requests.
odyssey-old/Scenes/Rendering/SSLO.shader

34 lines
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);
}
}