qtk/resources/shaders/fragment/solid-specular.frag

50 lines
1.2 KiB
GLSL

#version 330
// Color input from Vertex shader
in vec4 vColor;
in vec3 vNormal;
in vec3 vPosition;
// Final fragment fColor
out vec4 fColor;
// Light color RGB value
uniform vec3 uLightColor;
// Light object and camera position vectors
uniform vec3 uLightPosition;
uniform vec3 uCameraPosition;
// Strength ranges 0.0f - 1.0f
uniform float uAmbientStrength; // 0.2f
uniform float uSpecularStrength; // 0.25f
// 32, 64, 128, 256
uniform int uSpecularShine; // 64
void main()
{
// Ambient lighting
vec3 ambient = uAmbientStrength * uLightColor;
// Diffuse lighting
vec3 norm = normalize(vNormal);
vec3 lightDir = normalize(uLightPosition - vPosition);
float diff = max(dot(norm, lightDir), 0.0f);
vec3 diffuse = diff * uLightColor;
// Specular lighting
vec3 viewDir = normalize(uCameraPosition - vPosition);
vec3 reflectDir = reflect(-lightDir, norm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), uSpecularShine);
vec3 specular = uSpecularStrength * spec * uLightColor;
//
// Final calculation
// Strip vColor to vec3 to drop alpha
vec3 result = (ambient + specular) * vec3(vColor);
// Final output
fColor = vec4(result, 1.0f); // Reapply alpha
}