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