#version 460 core in vec2 pass_textureCoords; in vec3 surfaceNormal; in vec3 worldPos; uniform sampler2D diffuseSampler; uniform float opacity; uniform float shininess; uniform vec3 lightPosition; uniform vec3 lightColor; uniform vec3 cameraPosition; uniform vec3 highlightColor; uniform float highlightIntensity; out vec4 fragColor; void main() { vec3 normal = normalize(surfaceNormal); vec3 lightDir = normalize(lightPosition - worldPos); vec3 camDir = normalize(cameraPosition - worldPos); vec3 reflectDir = reflect(-lightDir, normal); vec3 ambient = 0.1 * lightColor; float diff = max(dot(normal, lightDir) , 0.0f); vec3 diffuse = diff * lightColor; float spec = pow(max(dot(camDir, reflectDir), 0.0), max(shininess, 1.0f)); vec3 specular = 0.5 * spec * lightColor; vec4 texColor = texture(diffuseSampler, pass_textureCoords); fragColor = vec4((ambient + diffuse + specular) * texColor.rgb, texColor.a * opacity); float intensity = clamp(highlightIntensity, 0.0, 1.0); fragColor.rgb += highlightColor * intensity; }