#version 330 struct Material { vec3 ambient; vec3 diffuse; sampler2D diffuseMap; vec3 specular; sampler2D specularMap; float shininess; bool hasTexture; bool hasSpecularMap; sampler2D normalMap; bool hasNormalMap; }; in vec3 defNormal; in vec2 texCoord; // These are all in tangent space in vec3 lightPos; in vec3 viewPos; in vec3 fragPos; uniform vec4 lightColor; uniform Material material; out vec4 FragColor; void main() { vec3 normal; if (material.hasNormalMap) { normal = texture(material.normalMap, texCoord).rgb; normal = normalize(normal * 2 - 1); } else { 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; vec3 viewDir = normalize(viewPos - fragPos); vec3 reflectDir = reflect(-lightDir, normal); 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 lighting = (vec4(material.ambient, 1) + diffuse + specular) * lightColor; FragColor = lighting; }