From 28e77fd9af4fedd04b6135765a6f9531eca7f789 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Mon, 7 Feb 2022 08:49:33 -0500 Subject: [PATCH] re-implement full_lighting shader point lights --- data/full_lighting.frag | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/data/full_lighting.frag b/data/full_lighting.frag index becd324..a99a778 100644 --- a/data/full_lighting.frag +++ b/data/full_lighting.frag @@ -8,16 +8,17 @@ out vec4 color; uniform sampler2D sampler; +// TODO: ambient light should be part of the lights uniform 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; + uint padding; vec4 pl_positions[NUM_LIGHTS]; vec4 pl_colors[NUM_LIGHTS]; @@ -28,12 +29,16 @@ layout (std140) uniform lights uint dl_intensities[NUM_LIGHTS]; // NOTE: 16 bytes * NUM_LIGHTS }; +const float CONSTANT_ATTENUATION = 0.1; +const float LINEAR_ATTENUATION = 0.2; +const float QUADRATIC_ATTENUATION = 0.02; + void main() { - // NOTE: directional lights vec4 diffuse_color = vec4(0); + // NOTE: directional lights for (uint i = 0u; i < active_d_lights; i++) { vec4 light_direction = normalize(dl_directions[i]); float diffuse_factor = @@ -42,14 +47,21 @@ void main() 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 + // NOTE: point lights + for (uint i = 0u; i < active_p_lights; i ++) { + vec3 direction = vec3(pl_positions[i]).xyz - frag_pos; + float distance = length(direction); + direction = direction / distance; + + float attenuation = CONSTANT_ATTENUATION + + LINEAR_ATTENUATION * distance + + QUADRATIC_ATTENUATION * pow(distance, 2); + float diffuse_factor = clamp(dot(frag_normal, direction), 0, 1); + vec4 added_color = pl_colors[i] * pl_intensities[i] + * diffuse_factor / attenuation; + + diffuse_color = diffuse_color + added_color; + } color = (ambient_color + diffuse_color) * texture(sampler, frag_uv.st); }