24a54d56ea686420c083bf906976daae8991deed
[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         vec3 lightDir = normalize(lightPos - fragPos);
60         
61         vec4 diffTex = texture(material.diffuseMap, texCoord);
62         if (!material.hasTexture)
63                 diffTex = material.diffuse;
64         
65         diffTex = mix(diffTex, reflection(), material.reflectivity);
66         
67         diffTex = mix(diffTex, refraction(), 1 - material.opacity);
68         
69         vec4 ambient = material.ambient * diffTex;
70
71         vec4 diffuse = max(0, dot(lightDir, normal)) * diffTex;
72
73         vec3 viewDir = normalize(viewPos - fragPos);
74         vec3 reflectDir = reflect(-lightDir, normal);
75
76         vec4 specTex = texture(material.specularMap, texCoord);
77         if (!material.hasSpecularMap)
78                 specTex = material.specular;
79
80         vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex;
81
82         FragColor = (ambient + diffuse + specular) * lightColor;
83
84 }
85