#version 330 core in vec3 frag_pos; in vec3 frag_normal; in vec2 frag_uv; out vec4 color; uniform sampler2D sampler; const vec4 ambient_color = vec4(0.1, 0.1, 0.1, 1); const uint NUM_LIGHTS = 32u; layout (std140) uniform lights { uint buf_size; uint max_p_lights; uint active_p_lights; uint max_d_lights; uint active_d_lights; vec4 pl_positions[NUM_LIGHTS]; vec4 pl_colors[NUM_LIGHTS]; uint pl_intensities[NUM_LIGHTS]; // NOTE: 16 bytes * NUM_LIGHTS vec4 dl_directions[NUM_LIGHTS]; vec4 dl_colors[NUM_LIGHTS]; uint dl_intensities[NUM_LIGHTS]; // NOTE: 16 bytes * NUM_LIGHTS }; void main() { // NOTE: directional lights vec4 diffuse_color = vec4(0); for (uint i = 0u; i < active_d_lights; i++) { vec4 light_direction = normalize(dl_directions[i]); float diffuse_factor = clamp(dot(vec4(frag_normal, 1), light_direction), 0, 1); diffuse_color = diffuse_color + dl_intensities[i] * diffuse_factor * dl_colors[i]; } //#else // point light // vec4 light_direction = pl1.pos - frag_pos; // float len = length(light_direction); // light_direction = normalize(light_direction); // float diffuse_factor = dot(frag_normal, light_direction) / pow(len, 2); // diffuse_factor = clamp(diffuse_factor, 0, 1); // vec4 diffuse_color = pl1.intensity * vec4(pl1.color * diffuse_factor); //#endif color = (ambient_color + diffuse_color) * texture(sampler, frag_uv.st); }