2a3de5508c2aa078cb47eb2220133581949c80c9
[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         float reflectivity;
12         
13         bool hasTexture;
14         bool hasSpecularMap;
15
16         sampler2D normalMap;
17         bool hasNormalMap;
18 };
19
20 in vec3 defNormal, worldNormal;
21 in vec2 texCoord;
22
23 // These are all in tangent space
24 in vec3 lightPos;
25 in vec3 viewPos;
26 in vec3 fragPos;
27
28 in vec3 worldViewPos, worldFragPos;
29
30 uniform vec4 lightColor;
31
32 uniform Material material;
33
34 uniform samplerCube skybox;
35
36 out vec4 FragColor;
37
38 vec4 reflection(vec3 normal) {
39         vec3 I = normalize(worldFragPos - worldViewPos);
40         vec3 R = reflect(I, normalize(normal));
41         return vec4(texture(skybox, R).rgb, 1);
42 }
43
44 void main() {
45         vec3 normal = texture(material.normalMap, texCoord).rgb;
46         normal = normalize(normal * 2 - 1);
47         if (!material.hasNormalMap)
48                 normal = defNormal;
49
50         vec3 lightDir = normalize(lightPos - fragPos);
51         
52         vec4 diffTex = texture(material.diffuseMap, texCoord);
53         if (!material.hasTexture)
54                 diffTex = material.diffuse;
55         
56         diffTex = mix(diffTex, reflection(worldNormal), material.reflectivity);
57         
58         vec4 ambient = material.ambient * diffTex;
59
60         vec4 diffuse = max(0, dot(lightDir, normal)) * diffTex;
61
62         vec3 viewDir = normalize(viewPos - fragPos);
63         vec3 reflectDir = reflect(-lightDir, normal);
64
65         vec4 specTex = texture(material.specularMap, texCoord);
66         if (!material.hasSpecularMap)
67                 specTex = material.specular;
68
69         vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex;
70
71         FragColor = (ambient + diffuse + specular) * lightColor;
72
73 }
74