#version 330 core struct Material { vec3 ambient; vec3 diffuse; vec3 specular; float shininess; }; struct Light { vec3 position; vec3 ambient; vec3 diffuse; vec3 specular; }; uniform Material material; uniform Light light; vec3 calc_ambient_light() { return light.ambient * material.ambient; } vec3 calc_diffuse_light(in vec3 light_dir, in vec3 norm) { float diff = max(dot(norm, light_dir), 0.0); return light.diffuse * (diff * material.diffuse); } vec3 calc_specular_light( in vec3 light_dir, in vec3 norm, in vec3 view_pos, in vec3 frag_pos ) { vec3 view_direction = normalize(view_pos - frag_pos); vec3 reflect_direction = reflect(-light_dir, norm); float spec = pow(max(dot(view_direction, reflect_direction), 0.0), material.shininess); return light.specular * (spec * material.specular); }