1
|
// Matice projekce.
|
2
|
uniform mat4 un_Projection;
|
3
|
// Pozice svetla.
|
4
|
uniform vec3 un_Light;
|
5
|
// Model-view matice pro kazdy graficky prvek (az na zdi, pro ty se matice shoduji
|
6
|
// s matici trajektorie).
|
7
|
uniform mat4 un_ModelView[5];
|
8
|
// Normalova matice pro kazdy graficky prvek (az na zdi).
|
9
|
uniform mat3 un_Normal[5];
|
10
|
// Barvy pro kazdy graficky prvek (az na zdi, u tech je barva urcena texturou).
|
11
|
uniform vec4 un_Color[5];
|
12
|
|
13
|
// Souradnice vrcholu.
|
14
|
attribute vec3 vertex;
|
15
|
// Normala pridelena k danemu vrcholu.
|
16
|
attribute vec3 normal;
|
17
|
// K jakemu grafickemu prvku vrchol patri.
|
18
|
attribute float group;
|
19
|
|
20
|
// Typ grafickeho prvku, ktery je sdilen s FRAGMENT casti shader programu.
|
21
|
varying float v_Group;
|
22
|
// Intezita svetla pro dany vrchol.
|
23
|
varying float v_Light;
|
24
|
// Barva daneho vrcholu.
|
25
|
varying vec4 v_Color;
|
26
|
// Jaka UV souradnice textury odpovida danemu vrcholu (pouze u group >= 4, coz
|
27
|
// jsou zdi).
|
28
|
varying vec2 v_Coord;
|
29
|
|
30
|
// Pri kazdem prekresleni se zavola pro kazdy vrchol.
|
31
|
void main()
|
32
|
{
|
33
|
v_Group = group;
|
34
|
if (v_Group >= 5.0)
|
35
|
{
|
36
|
int corner = int(v_Group) - 5; // O jaky roh textury jde.
|
37
|
v_Coord = vec2(corner == 2 || corner == 3, corner == 1 || corner == 3);
|
38
|
v_Group = 5.0; // Pro vsechny zdi stejna pravidla (az na barvy).
|
39
|
}
|
40
|
|
41
|
// a mod b = a - (b * floor(a/b))
|
42
|
int index = int(v_Group) - (5 * int(floor(v_Group / 5.0))); // 5 = zed - bez jakychkoli uprav, stejne jako 0 = trajektorie.
|
43
|
v_Light = max(dot(normalize(un_Normal[index] * normal), normalize(un_Light - vertex)), 0.0);
|
44
|
v_Color = un_Color[index];
|
45
|
|
46
|
// Vysledna pozice (pixel).
|
47
|
gl_Position = un_Projection * un_ModelView[index] * vec4(vertex, 1.0);
|
48
|
}
|