Browse Source

re-implement full_lighting shader point lights

main
cinnaboot 4 years ago
parent
commit
28e77fd9af
  1. 32
      data/full_lighting.frag

32
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);
}

Loading…
Cancel
Save