50 lines
1.2 KiB
GLSL
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
|
|
}
|