20 in vec3 defNormal, worldNormal;
23 // These are all in tangent space
28 in vec3 worldViewPos, worldFragPos;
30 uniform vec4 lightColor;
32 uniform Material material;
34 uniform samplerCube skybox;
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);
45 vec3 normal = texture(material.normalMap, texCoord).rgb;
46 normal = normalize(normal * 2 - 1);
47 if (!material.hasNormalMap)
50 vec3 lightDir = normalize(lightPos - fragPos);
52 vec4 diffTex = texture(material.diffuseMap, texCoord);
53 if (!material.hasTexture)
54 diffTex = material.diffuse;
56 diffTex = mix(diffTex, reflection(worldNormal), material.reflectivity);
58 vec4 ambient = material.ambient * diffTex;
60 vec4 diffuse = max(0, dot(lightDir, normal)) * diffTex;
62 vec3 viewDir = normalize(viewPos - fragPos);
63 vec3 reflectDir = reflect(-lightDir, normal);
65 vec4 specTex = texture(material.specularMap, texCoord);
66 if (!material.hasSpecularMap)
67 specTex = material.specular;
69 vec4 specular = pow(max(0, dot(viewDir, reflectDir)), material.shininess) * specTex;
71 FragColor = (ambient + diffuse + specular) * lightColor;