@@ -15,19 +15,31 @@ in vec2 vs_texcoord0;
15
15
16
16
// Fragment shader outputs
17
17
out vec3 fs_uv0;
18
- out vec2 fs_uv1;
19
- out vec2 fs_uv2;
18
+ out vec3 fs_uv1;
19
+ out vec3 fs_uv2;
20
+ out vec3 fs_uv3;
21
+ out vec2 fs_uv4;
22
+ out vec2 fs_uv5;
23
+
24
+ const float offset = 1 .0f / 1024 .0f;
20
25
21
26
void main() {
22
27
gl_Position = un_mvp * vec4 (vs_position, 1 .0f);
23
28
24
- float offset = 1 .0f / 1024 .0f;
25
- fs_uv0 = (un_shadow * vec4 (vs_position, 1 .0f) + vec4 (- offset, + offset* 0 .5f, 0 , 0 )).xyz;
29
+ const vec4 p = un_shadow * vec4 (vs_position, 1 .0f);
30
+ fs_uv0 = (p + vec4 (- offset, + offset* 0 .5f, 0 , 0 )).xyz;
31
+ fs_uv1 = (p + vec4 (offset, - offset* 0 .5f, 0 , 0 )).xyz;
32
+ fs_uv2 = (p + vec4 (0 , - offset, 0 , 0 )).xyz;
33
+ fs_uv3 = (p + vec4 (0 , offset, 0 , 0 )).xyz;
26
34
#if SOKOL_GLSL
27
35
fs_uv0.y = 1 .0f - fs_uv0.y;
36
+ fs_uv1.y = 1 .0f - fs_uv1.y;
37
+ fs_uv2.y = 1 .0f - fs_uv2.y;
38
+ fs_uv3.y = 1 .0f - fs_uv3.y;
28
39
#endif
29
- fs_uv1 = vs_texcoord0;
30
- fs_uv2 = vs_position.xy * un_inv_world_size;
40
+
41
+ fs_uv4 = vs_texcoord0;
42
+ fs_uv5 = vs_position.xy * un_inv_world_size;
31
43
}
32
44
@end
33
45
@@ -43,36 +55,44 @@ uniform texture2D un_tex1; // diffuse
43
55
uniform texture2D un_tex2; // light map
44
56
45
57
// Fragment shader inputs from Vertex shader
46
- in vec3 fs_uv0; // shadow map
47
- in vec2 fs_uv1; // diffuse
48
- in vec2 fs_uv2; // light map
58
+ in vec3 fs_uv0; // shadow map 1
59
+ in vec3 fs_uv1; // shadow map 2
60
+ in vec3 fs_uv2; // shadow map 3
61
+ in vec3 fs_uv3; // shadow map 4
62
+ in vec2 fs_uv4; // diffuse
63
+ in vec2 fs_uv5; // light map
49
64
50
65
// Fragment shader outputs
51
66
out vec4 frag_color;
52
67
53
- // SHADE - коэффициэнт, не который умножается цвет объекта в тени.
68
+ // SHADE - коэффициент, на который умножается цвет объекта в тени.
54
69
#define SHADE 0 .5f
55
70
56
71
// MSHADE=1-SHADE
57
72
#define MSHADE 0 .5f
58
73
59
- void main() {
60
- frag_color = texture(sampler2DShadow (un_tex0, un_sampler1), fs_uv0).rrrr;
74
+ // ambient color
75
+ const vec3 c0 = vec3 (SHADE, MSHADE, 0 .25f);
76
+ const vec3 c4 = vec3 (0 .25f, 0 .25f, 0 .25f);
61
77
62
- // ambient color
63
- vec4 c0 = vec4 (SHADE, MSHADE, 0 , 1 .0f);
64
- frag_color = frag_color * c0.y + c0.x;
78
+ void main() {
79
+ // shadow
80
+ float shadow = texture(sampler2DShadow (un_tex0, un_sampler1), fs_uv0).r;
81
+ shadow += texture(sampler2DShadow (un_tex0, un_sampler1), fs_uv1).r;
82
+ shadow += texture(sampler2DShadow (un_tex0, un_sampler1), fs_uv2).r;
83
+ shadow += texture(sampler2DShadow (un_tex0, un_sampler1), fs_uv3).r;
84
+ vec3 result = c4 * shadow * c0.y + c0.x;
65
85
66
86
// diffuse
67
- frag_color = frag_color * texture(sampler2D (un_tex1, un_sampler0), fs_uv1) ;
87
+ result *= texture(sampler2D (un_tex1, un_sampler0), fs_uv4).rgb ;
68
88
69
89
// tile color
70
- frag_color = frag_color * un_tile_color;
90
+ result *= un_tile_color.rgb ;
71
91
72
92
// light map
73
- frag_color = frag_color * texture(sampler2D (un_tex2, un_sampler0), fs_uv2) ;
93
+ result *= texture(sampler2D (un_tex2, un_sampler0), fs_uv5).rgb ;
74
94
75
- frag_color.a = un_tile_color.a;
95
+ frag_color = vec4 (result, un_tile_color.a) ;
76
96
}
77
97
@end
78
98
0 commit comments