Add specular and normal mapping
[opengl.git] / texturefrag.glsl
1 #version 330
2
3 struct Material {
4         vec3 ambient;
5         vec3 diffuse;
6         sampler2D diffuseMap;
7         vec3 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         vec4 diffuse = vec4(max(0, dot(lightDir, normal)) * material.diffuse, 1) * diffTex;
50
51         vec3 viewDir = normalize(viewPos - fragPos);
52         vec3 reflectDir = reflect(-lightDir, normal);
53
54
55         vec4 specTex;
56         if (material.hasSpecularMap)
57                 specTex = texture(material.specularMap, texCoord);
58         else
59                 specTex = vec4(1);
60
61         vec4 specular = vec4(pow(max(0, dot(viewDir, reflectDir)), material.shininess) * material.specular, 1) * specTex;
62
63         vec4 lighting = (vec4(material.ambient, 1) + diffuse + specular) * lightColor;
64
65         FragColor = lighting;
66 }
67