45 lines
1.2 KiB
GLSL
45 lines
1.2 KiB
GLSL
#version 460 core
|
|
in vec2 v_texcoord;
|
|
in vec3 v_normal;
|
|
in vec3 v_position;
|
|
|
|
layout (binding = 1, std140) uniform Light {
|
|
uniform vec4 light_color;
|
|
uniform vec3 light_pos;
|
|
uniform vec3 camera_pos;
|
|
};
|
|
|
|
uniform sampler2D u_texture;
|
|
|
|
out vec4 f_color;
|
|
|
|
vec4 pointLight() {
|
|
vec3 light_vector = light_pos - v_position;
|
|
float dist = length(light_vector);
|
|
float a = 1.0;
|
|
float b = 0.7;
|
|
float intensity = 1 / (a * dist * dist + b * dist + 1.0f);
|
|
|
|
// ambient lighting
|
|
float ambient = 0.2;
|
|
|
|
// diffuse lighting
|
|
float diffuse_light = 0.7;
|
|
vec3 normal = normalize(v_normal);
|
|
vec3 light_direction = normalize(light_vector);
|
|
float diffuse = diffuse_light * max(dot(normal, light_direction), 0);
|
|
|
|
// specular lighting
|
|
float specular_light = 0.7;
|
|
vec3 view_direction = normalize(camera_pos - v_position);
|
|
vec3 reflection_direction = reflect(-light_direction, normal);
|
|
vec3 halfway_vec = normalize(view_direction + light_direction);
|
|
float specular = specular_light * pow(max(dot(normal, halfway_vec), 0), 100);
|
|
|
|
return (texture(u_texture, v_texcoord) * (diffuse * intensity + ambient) + specular * intensity) * light_color;
|
|
}
|
|
|
|
void main() {
|
|
f_color = pointLight();
|
|
}
|