#version 460 core layout(location = 0) out vec4 color; in vec4 vColor; in vec3 vNormal; void main() { vec3 lightDirection = normalize(vec3(0.8, -0.5, 0.6)); // ambient component float ambientStrength = 0.1; vec3 ambient = ambientStrength * vColor.rgb; // bump mapping perturbation float bumpStrength = 0.2; float nVal = fract(sin(dot(vNormal.xy, vec2(12.9898, 78.233))) * 43758.5453); vec3 bumpNormal = normalize(vNormal + bumpStrength * (nVal - 0.5)); // diffuse component (Lambert) with bump float lambert = max(0.0, dot(normalize(bumpNormal), -lightDirection)); vec3 diffuse = vColor.rgb * lambert; // combine ambient and diffuse vec3 result = ambient + diffuse; // specular component (Phong) float shininess = 32.0; vec3 viewDir = vec3(0.0, 0.0, 1.0); vec3 reflectDir = reflect(-lightDirection, bumpNormal); float spec = pow(max(dot(reflectDir, viewDir), 0.0), shininess); float specStrength = 0.5; vec3 specular = specStrength * spec * vec3(1.0); result += specular; color = vec4(result, vColor.a); }