-
Notifications
You must be signed in to change notification settings - Fork 0
/
default.geom
83 lines (67 loc) · 2.38 KB
/
default.geom
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#version 330 core
layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;
out vec3 Normal;
out vec3 color;
out vec2 texCoord;
out vec3 crntPos;
out vec3 lightPos;
out vec3 camPos;
in DATA
{
vec3 Normal;
vec3 color;
vec2 texCoord;
mat4 projection;
mat4 model;
vec3 lightPos;
vec3 camPos;
} data_in[];
// Default main function
void main()
{
// Edges of the triangle
vec3 edge0 = gl_in[1].gl_Position.xyz - gl_in[0].gl_Position.xyz;
vec3 edge1 = gl_in[2].gl_Position.xyz - gl_in[0].gl_Position.xyz;
// Lengths of UV differences
vec2 deltaUV0 = data_in[1].texCoord - data_in[0].texCoord;
vec2 deltaUV1 = data_in[2].texCoord - data_in[0].texCoord;
// one over the determinant
float invDet = 1.0f / (deltaUV0.x * deltaUV1.y - deltaUV1.x * deltaUV0.y);
vec3 tangent = vec3(invDet * (deltaUV1.y * edge0 - deltaUV0.y * edge1));
vec3 bitangent = vec3(invDet * (-deltaUV1.x * edge0 + deltaUV0.x * edge1));
vec3 T = normalize(vec3(data_in[0].model * vec4(tangent, 0.0f)));
vec3 B = normalize(vec3(data_in[0].model * vec4(bitangent, 0.0f)));
vec3 N = normalize(vec3(data_in[0].model * vec4(cross(edge1, edge0), 0.0f)));
mat3 TBN = mat3(T, B, N);
// TBN is an orthogonal matrix and so its inverse is equal to its transpose
TBN = transpose(TBN);
gl_Position = data_in[0].projection * gl_in[0].gl_Position;
Normal = data_in[0].Normal;
color = data_in[0].color;
texCoord = data_in[0].texCoord;
// Change all lighting variables to TBN space
crntPos = TBN * gl_in[0].gl_Position.xyz;
lightPos = TBN * data_in[0].lightPos;
camPos = TBN * data_in[0].camPos;
EmitVertex();
gl_Position = data_in[1].projection * gl_in[1].gl_Position;
Normal = data_in[1].Normal;
color = data_in[1].color;
texCoord = data_in[1].texCoord;
// Change all lighting variables to TBN space
crntPos = TBN * gl_in[1].gl_Position.xyz;
lightPos = TBN * data_in[1].lightPos;
camPos = TBN * data_in[1].camPos;
EmitVertex();
gl_Position = data_in[2].projection * gl_in[2].gl_Position;
Normal = data_in[2].Normal;
color = data_in[2].color;
texCoord = data_in[2].texCoord;
// Change all lighting variables to TBN space
crntPos = TBN * gl_in[2].gl_Position.xyz;
lightPos = TBN * data_in[2].lightPos;
camPos = TBN * data_in[2].camPos;
EmitVertex();
EndPrimitive();
}