#version 330 core in VS_OUT { vec3 position; vec3 normal; vec2 tex_coords; } vs_out; layout(location = 0) out vec4 frag_color; layout(location = 1) out vec4 bright_color; struct light_t { vec3 position; vec3 color; }; uniform light_t lights[3]; uniform sampler2D diffuse_texture; uniform vec3 view_pos; const int light_count = 3; void main(void) { vec3 color = texture(diffuse_texture, vs_out.tex_coords).rgb; vec3 ambient = 0.01 * color; vec3 lighting = vec3(0.0); vec3 view_dir = normalize(view_pos - vs_out.position); for (int i = 0; i < light_count; i++) { vec3 light_dir = normalize(lights[i].position - vs_out.position); float diff = max(dot(light_dir, vs_out.normal), 0.0); vec3 result = lights[i].color * diff * color; float distance = length(vs_out.position - lights[i].position); result *= 1.0 / (distance * distance); lighting += result; } vec3 result = ambient + lighting; float brightness = dot(result, vec3(0.2126, 0.7152, 0.0722)); if (brightness > 1.0) { bright_color = vec4(result, 1.0); } else { bright_color = vec4(0.0, 0.0, 0.0, 1.0); } frag_color = vec4(result, 1.0); }