struct LightSourceParameters { vec4 position; vec3 color; int type; vec3 attenuation; }; const int max_lights = 6; layout(set=0) uniform Lighting { LightSourceParameters light_sources[max_lights]; vec4 ambient_color; vec4 fog_color; //float fog_start_distance; float fog_density; }; #pragma MSP stage(fragment) struct IncomingLight { vec3 direction; vec3 color; }; virtual IncomingLight get_incoming_light(int index, vec3 world_pos) { vec4 light_pos = light_sources[index].position; vec3 rel_pos = light_pos.xyz-world_pos*light_pos.w; float d = length(rel_pos); float attenuation = 1.0/dot(vec3(1.0, d, d*d), light_sources[index].attenuation); return IncomingLight(rel_pos/d, light_sources[index].color*attenuation); }