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; 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 vec4 ambient_color = vec4(0.1, 0.1, 0.1, 1);
const uint NUM_LIGHTS = 32u; const uint NUM_LIGHTS = 32u;
layout (std140) uniform lights layout (std140) uniform lights
{ {
uint buf_size;
uint max_p_lights; uint max_p_lights;
uint active_p_lights; uint active_p_lights;
uint max_d_lights; uint max_d_lights;
uint active_d_lights; uint active_d_lights;
uint padding;
vec4 pl_positions[NUM_LIGHTS]; vec4 pl_positions[NUM_LIGHTS];
vec4 pl_colors[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 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() void main()
{ {
// NOTE: directional lights
vec4 diffuse_color = vec4(0); vec4 diffuse_color = vec4(0);
// NOTE: directional lights
for (uint i = 0u; i < active_d_lights; i++) { for (uint i = 0u; i < active_d_lights; i++) {
vec4 light_direction = normalize(dl_directions[i]); vec4 light_direction = normalize(dl_directions[i]);
float diffuse_factor = float diffuse_factor =
@ -42,14 +47,21 @@ void main()
dl_intensities[i] * diffuse_factor * dl_colors[i]; dl_intensities[i] * diffuse_factor * dl_colors[i];
} }
//#else // point light // NOTE: point lights
// vec4 light_direction = pl1.pos - frag_pos; for (uint i = 0u; i < active_p_lights; i ++) {
// float len = length(light_direction); vec3 direction = vec3(pl_positions[i]).xyz - frag_pos;
// light_direction = normalize(light_direction); float distance = length(direction);
// float diffuse_factor = dot(frag_normal, light_direction) / pow(len, 2); direction = direction / distance;
// diffuse_factor = clamp(diffuse_factor, 0, 1);
// vec4 diffuse_color = pl1.intensity * vec4(pl1.color * diffuse_factor); float attenuation = CONSTANT_ATTENUATION +
//#endif 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); color = (ambient_color + diffuse_color) * texture(sampler, frag_uv.st);
} }

Loading…
Cancel
Save