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