2019-02-04 18:32:08 +01:00
|
|
|
#version 430 core
|
|
|
|
|
|
|
|
in layout(location = 0) vec3 normal;
|
2019-02-19 16:16:13 +01:00
|
|
|
in layout(location = 1) vec3 vertex;
|
|
|
|
|
|
|
|
// point lights
|
|
|
|
struct Light {
|
|
|
|
vec3 position;
|
|
|
|
mat4 MV;
|
|
|
|
bool is_spot;
|
|
|
|
vec3 spot_target; // MV space coordinates
|
|
|
|
};
|
|
|
|
|
|
|
|
#define N_LIGHTS 3
|
|
|
|
|
|
|
|
uniform Light light[N_LIGHTS];
|
2019-02-04 18:32:08 +01:00
|
|
|
|
|
|
|
out vec4 color;
|
|
|
|
|
2019-02-19 16:16:13 +01:00
|
|
|
// constants
|
|
|
|
float shininess = 15;
|
|
|
|
vec3 c_diffuse = vec3(0.75390625, 0.4296875, 0.4375);
|
|
|
|
vec3 c_emissive = vec3(0.01171875, 0.0, 0.15234375);
|
|
|
|
vec3 c_specular = vec3(0.9453125, 0.94921875, 0.84765625);
|
|
|
|
|
|
|
|
float spot_cuttof_angle = cos(4 / 180.0 * 3.1415926535);
|
|
|
|
|
2019-02-04 18:32:08 +01:00
|
|
|
void main()
|
|
|
|
{
|
2019-02-19 16:16:13 +01:00
|
|
|
vec3 nnormal = normalize(normal);
|
|
|
|
|
|
|
|
float diffuse_intensity = 0.0;
|
|
|
|
float specular_intensity = 0.0;
|
|
|
|
|
|
|
|
for (int i = 0; i<3; i++) {
|
|
|
|
vec3 L = vec3(light[i].MV * vec4(light[i].position, 1.0f)) - vertex;
|
|
|
|
float attenuation = clamp(1000/(1 + 40*length(L) + 0.1*length(L)*length(L)), 0.0, 1.25);
|
|
|
|
L = normalize(L);
|
|
|
|
|
|
|
|
if (light[i].is_spot) {
|
|
|
|
vec3 L2 = normalize(vec3(light[i].MV * vec4(light[i].position, 1.0f)) - light[i].spot_target);
|
|
|
|
if (dot(L2, L) < spot_cuttof_angle) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
attenuation *= 70;
|
|
|
|
}
|
|
|
|
|
|
|
|
float diffuse_i = dot(nnormal, L);
|
|
|
|
|
|
|
|
float specular_i = pow(dot(reflect(-L, nnormal), normalize(vec3(0,0,0) - vertex)), shininess);
|
|
|
|
|
|
|
|
|
|
|
|
if (diffuse_i > 0) diffuse_intensity += attenuation*diffuse_i;
|
|
|
|
if (specular_i > 0) specular_intensity += attenuation*specular_i;
|
|
|
|
}
|
|
|
|
|
|
|
|
//diffuse_intensity *= 1.0 / N_LIGHTS;
|
|
|
|
//specular_intensity *= 1.0 / N_LIGHTS;
|
|
|
|
|
|
|
|
|
|
|
|
//float intensity = dot(normalize(normal), normalize(light_pos_2));
|
|
|
|
//color = vec4(0.5 * normal + 0.5, 1.0);
|
|
|
|
|
|
|
|
color = vec4(c_emissive
|
|
|
|
+ c_diffuse*diffuse_intensity
|
|
|
|
+ c_specular*specular_intensity, 1.0f);
|
2019-02-04 18:32:08 +01:00
|
|
|
}
|