#version 420 core out vec4 FragColor; in vec3 Normal; in vec3 FragPos; in vec3 viewPos; uniform vec3 lightPos; uniform vec4 lightColor; uniform vec4 meshColor; struct Material { vec4 ambient; vec4 diffuse; vec4 specular; vec4 emissive; float shininess; }; uniform Material material; void main() { vec3 normal = normalize(Normal); vec3 lightDir = normalize(lightPos - FragPos); vec3 viewDir = normalize(viewPos - FragPos); vec3 halfwayDir = normalize(lightDir + viewDir); // diffuse float diff = max(dot(normal, lightDir), 0.0); // specular vec3 reflectDir = reflect(-lightDir, normal); float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); vec4 ambient = lightColor * material.ambient; vec4 diffuse = lightColor * (diff * material.diffuse); vec4 specular = lightColor * (spec *material.specular); FragColor = ambient + diffuse + specular + material.emissive; }