#version 440 out vec4 FragColor; in vec2 uv; uniform sampler2D pos_tex; uniform sampler2D normal_tex; uniform sampler2D color_tex; struct Light { vec3 Position; vec3 Color; }; uniform int NLights; uniform Light lights[64]; uniform vec3 view_pos; void main() { vec3 FragPos = texture(pos_tex, uv).rgb; vec3 Normal = texture(normal_tex, uv).rgb; vec3 Albedo = texture(color_tex, uv).rgb; float Specular = 0.5f; // then calculate lighting as usual vec3 lighting = Albedo * 0.1; // hard-coded ambient component vec3 viewDir = normalize(view_pos - FragPos); for (int i = 0; i < NLights; ++i) { vec3 L = normalize(lights[i].Position.xyz - FragPos); vec3 V = normalize(view_pos - FragPos); vec3 H = normalize(V + L); vec3 diffuse = max(dot(Normal, L), 0.0) * Albedo * lights[i].Color; // specular float spec = pow(max(dot(Normal, H), 0.0), 16.0); vec3 specular = lights[i].Color * spec * Specular; lighting += diffuse + specular; } FragColor = vec4(lighting, 1.0); }