76 lines
1.9 KiB
GLSL
76 lines
1.9 KiB
GLSL
#version 330
|
|
|
|
// Vertex shader input data
|
|
in vec2 fragTexCoord;
|
|
in vec3 fragNormal;
|
|
|
|
// Diffuse data
|
|
uniform sampler2D texture0;
|
|
uniform vec4 fragTintColor;
|
|
|
|
// Light attributes
|
|
uniform vec3 light_ambientColor = vec3(0.6, 0.3, 0);
|
|
uniform vec3 light_diffuseColor = vec3(1, 0.5, 0);
|
|
uniform vec3 light_specularColor = vec3(0, 1, 0);
|
|
uniform float light_intensity = 1;
|
|
uniform float light_specIntensity = 1;
|
|
|
|
// Material attributes
|
|
uniform vec3 mat_ambientColor = vec3(1, 1, 1);
|
|
uniform vec3 mat_specularColor = vec3(1, 1, 1);
|
|
uniform float mat_glossiness = 50;
|
|
|
|
// World attributes
|
|
uniform vec3 lightPos;
|
|
uniform vec3 cameraPos;
|
|
|
|
// Fragment shader output data
|
|
out vec4 fragColor;
|
|
|
|
vec3 AmbientLighting()
|
|
{
|
|
return mat_ambientColor * light_ambientColor;
|
|
}
|
|
|
|
vec3 DiffuseLighting(in vec3 N, in vec3 L)
|
|
{
|
|
// Lambertian reflection calculation
|
|
float diffuse = clamp(dot(N, L), 0, 1);
|
|
|
|
return tintColor.xyz * light_diffuseColor * light_intensity * diffuse;
|
|
}
|
|
|
|
vec3 SpecularLighting(in vec3 N, in vec3 L, in vec3 V)
|
|
{
|
|
float specular = 0;
|
|
|
|
// Calculate specular reflection only if the surface is oriented to the light source
|
|
if(dot(N, L) > 0)
|
|
{
|
|
// Calculate half vector
|
|
vec3 H = normalize(L + V);
|
|
|
|
// Calculate specular intensity
|
|
specular = pow(dot(N, H), 3 + mat_glossiness);
|
|
}
|
|
|
|
return mat_specularColor * light_specularColor * light_specIntensity * specular;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
// Normalize input vectors
|
|
vec3 L = normalize(lightPos);
|
|
vec3 V = normalize(cameraPos);
|
|
vec3 N = normalize(fragNormal);
|
|
|
|
vec3 ambient = AmbientLighting();
|
|
vec3 diffuse = DiffuseLighting(N, L);
|
|
vec3 specular = SpecularLighting(N, L, V);
|
|
|
|
// Get base color from texture
|
|
vec4 textureColor = texture(texture0, fragTexCoord);
|
|
vec3 finalColor = textureColor.rgb;
|
|
|
|
fragColor = vec4(finalColor * (ambient + diffuse + specular), textureColor.a);
|
|
} |