-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
lighting_prep.comp
51 lines (39 loc) · 1.65 KB
/
lighting_prep.comp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#version 430
layout(local_size_x = 25, local_size_y = 25, local_size_z = 1) in;
// CHUNK_SIZE / LIGHT_SIZE
uniform int light_scale;
// CHUNK_SIZE x CHUNK_SIZE
uniform layout(binding=1, rgba32f) readonly image2D t_src;
// LIGHT_SIZE x LIGHT_SIZE
uniform layout(binding=2, rgba32f) readonly image2D t_light_n;
uniform layout(binding=3, rgba32f) readonly image2D t_light_e;
uniform layout(binding=4, rgba32f) readonly image2D t_light_s;
uniform layout(binding=5, rgba32f) readonly image2D t_light_w;
// (LIGHT_SIZE + 2) x (LIGHT_SIZE + 2)
uniform layout(binding=7, rgba32f) writeonly image2D t_work;
void prep();
vec3 max3(vec3 a, vec3 b) {
return vec3(max(a.r, b.r), max(a.g, b.g), max(a.b, b.b));
}
void main() {
ivec2 pos_light = ivec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y);
ivec2 pos_work = pos_light + ivec2(1);
ivec2 pos_chunk = pos_light * light_scale;
vec3 val = vec3(0.0);
for (int dx = 0; dx < light_scale; dx++) {
for (int dy = 0; dy < light_scale; dy++) {
val = max3(val, imageLoad(t_src, pos_chunk + ivec2(dx, dy)).rgb);
}
}
imageStore(t_work, pos_work, vec4(val, 1.0));
if (pos_light.x == 0) {
imageStore(t_work, ivec2(0, pos_work.y), imageLoad(t_light_w, ivec2(24, pos_light.y)));
} else if (pos_light.x == 24) {
imageStore(t_work, ivec2(26, pos_work.y), imageLoad(t_light_e, ivec2(0, pos_light.y)));
}
if (pos_light.y == 0) {
imageStore(t_work, ivec2(pos_work.x, 0), imageLoad(t_light_n, ivec2(pos_light.x, 24)));
} else if (pos_light.y == 24) {
imageStore(t_work, ivec2(pos_work.x, 26), imageLoad(t_light_s, ivec2(pos_light.x, 0)));
}
}