94bda7fa859231016a526ff3fd5f7af405ee7b43
[opengl.git] / texturefrag.glsl
1 #version 330
2
3 struct Material {
4         vec4 ambient;
5         vec4 diffuse;
6         sampler2D diffuseMap;
7         vec4 specular;
8         sampler2D specularMap;
9         float shininess;
10         
11         bool hasTexture;
12         bool hasSpecularMap;
13
14         sampler2D normalMap;
15         bool hasNormalMap;
16 };
17
18 in vec3 defNormal;
19 in vec2 texCoord;
20
21 // These are all in tangent space
22 in vec3 lightPos;
23 in vec3 viewPos;
24 in vec3 fragPos;
25
26 uniform vec4 lightColor;
27
28 uniform Material material;
29
30 out vec4 FragColor;
31
32 void main() {
33
34         vec3 normal;
35         if (material.hasNormalMap) {
36                 normal = texture(material.normalMap, texCoord).rgb;
37                 normal = normalize(normal * 2 - 1);
38         } else {
39                 normal = defNormal;
40         }
41
42         vec3 lightDir = normalize(lightPos - fragPos);
43         
44         vec4 diffTex;
45         if (material.hasTexture)
46                 diffTex = texture(material.diffuseMap, texCoord);
47         else
48                 diffTex = vec4(1);
49         
50         vec4 ambient = material.ambient * diffTex;
51
52         vec4 diffuse = max(0, dot(lightDir, normal)) * material.diffuse * diffTex;
53
54         vec3 viewDir = normalize(viewPos - fragPos);
55         vec3 reflectDir = reflect(-lightDir, normal);
56
57         vec4 specTex;
58         if (material.hasSpecularMap)
59                 specTex = texture(material.specularMap, texCoord);
60         else
61                 specTex = vec4(1);
62
63         vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * material.specular * specTex;
64
65         vec4 lighting = (ambient + diffuse + specular) * lightColor;
66
67         FragColor = lighting;
68 }
69