#version 440 layout(location = 0) in vec3 vECVertNormal; layout(location = 1) in vec3 vECVertPos; layout(location = 2) flat in vec3 vDiffuseAdjust; layout(std140, binding = 1) uniform buf { vec3 ECCameraPosition; vec3 ka; vec3 kd; vec3 ks; // Have one light only for now. vec3 ECLightPosition; vec3 attenuation; vec3 color; float intensity; float specularExp; } ubuf; layout(location = 0) out vec4 fragColor; void main() { vec3 unnormL = ubuf.ECLightPosition - vECVertPos; float dist = length(unnormL); float att = 1.0 / (ubuf.attenuation.x + ubuf.attenuation.y * dist + ubuf.attenuation.z * dist * dist); vec3 N = normalize(vECVertNormal); vec3 L = normalize(unnormL); float NL = max(0.0, dot(N, L)); vec3 dColor = att * ubuf.intensity * ubuf.color * NL; vec3 R = reflect(-L, N); vec3 V = normalize(ubuf.ECCameraPosition - vECVertPos); float RV = max(0.0, dot(R, V)); vec3 sColor = att * ubuf.intensity * ubuf.color * pow(RV, ubuf.specularExp); fragColor = vec4(ubuf.ka + (ubuf.kd + vDiffuseAdjust) * dColor + ubuf.ks * sColor, 1.0); }