Reflection
[opengl.git] / texturefrag.glsl
index 83cce42cc72a6d42d97fbbda5d1e6761c0f80d57..2a3de5508c2aa078cb47eb2220133581949c80c9 100644 (file)
@@ -1,13 +1,15 @@
 #version 330
 
 struct Material {
-       vec3 ambient;
-       vec3 diffuse;
+       vec4 ambient;
+       vec4 diffuse;
        sampler2D diffuseMap;
-       vec3 specular;
+       vec4 specular;
        sampler2D specularMap;
        float shininess;
 
+       float reflectivity;
+       
        bool hasTexture;
        bool hasSpecularMap;
 
@@ -15,7 +17,7 @@ struct Material {
        bool hasNormalMap;
 };
 
-in vec3 defNormal;
+in vec3 defNormal, worldNormal;
 in vec2 texCoord;
 
 // These are all in tangent space
@@ -23,45 +25,50 @@ in vec3 lightPos;
 in vec3 viewPos;
 in vec3 fragPos;
 
+in vec3 worldViewPos, worldFragPos;
+
 uniform vec4 lightColor;
 
 uniform Material material;
 
+uniform samplerCube skybox;
+
 out vec4 FragColor;
 
-void main() {
+vec4 reflection(vec3 normal) {
+       vec3 I = normalize(worldFragPos - worldViewPos);
+       vec3 R = reflect(I, normalize(normal));
+       return vec4(texture(skybox, R).rgb, 1);
+}
 
-       vec3 normal;
-       if (material.hasNormalMap) {
-               normal = texture(material.normalMap, texCoord).rgb;
+void main() {
+       vec3 normal = texture(material.normalMap, texCoord).rgb;
        normal = normalize(normal * 2 - 1);
-       } else {
+       if (!material.hasNormalMap)
                normal = defNormal;
-       }
 
        vec3 lightDir = normalize(lightPos - fragPos);
        
-       vec4 diffTex;
-       if (material.hasTexture)
-               diffTex = texture(material.diffuseMap, texCoord);
-       else
-               diffTex = vec4(1);
-       vec4 diffuse = vec4(max(0, dot(lightDir, normal)) * material.diffuse, 1) * diffTex;
+       vec4 diffTex = texture(material.diffuseMap, texCoord);
+       if (!material.hasTexture)
+               diffTex = material.diffuse;
+       
+       diffTex = mix(diffTex, reflection(worldNormal), material.reflectivity);
+       
+       vec4 ambient = material.ambient * diffTex;
+
+       vec4 diffuse = max(0, dot(lightDir, normal)) * diffTex;
 
        vec3 viewDir = normalize(viewPos - fragPos);
        vec3 reflectDir = reflect(-lightDir, normal);
 
+       vec4 specTex = texture(material.specularMap, texCoord);
+       if (!material.hasSpecularMap)
+               specTex = material.specular;
 
-       vec4 specTex;
-       if (material.hasSpecularMap)
-               specTex = texture(material.specularMap, texCoord);
-       else
-               specTex = vec4(1);
-
-       vec4 specular = vec4(pow(max(0, dot(viewDir, reflectDir)), material.shininess) * material.specular, 1) * specTex;
+       vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex;
 
-       vec4 lighting = (vec4(material.ambient, 1) + diffuse + specular) * lightColor;
+       FragColor = (ambient + diffuse + specular) * lightColor;
 
-       FragColor = lighting;
 }