You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.4 KiB
55 lines
1.4 KiB
#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]; // FIXME: should be directions |
|
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); |
|
}
|
|
|