#version 450 #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable layout (input_attachment_index = 0, binding = 0) uniform subpassInput samplerposition; layout (input_attachment_index = 1, binding = 1) uniform subpassInput samplerNormal; layout (input_attachment_index = 2, binding = 2) uniform subpassInput samplerAlbedo; layout (location = 0) in vec2 inUV; layout (location = 0) out vec4 outColor; layout (constant_id = 0) const int NUM_LIGHTS = 64; struct Light { vec4 position; vec3 color; float radius; }; layout (binding = 3) uniform UBO { vec4 viewPos; Light lights[NUM_LIGHTS]; } ubo; void main() { // Read G-Buffer values from previous sub pass vec3 fragPos = subpassLoad(samplerposition).rgb; vec3 normal = subpassLoad(samplerNormal).rgb; vec4 albedo = subpassLoad(samplerAlbedo); #define ambient 0.15 // Ambient part vec3 fragcolor = albedo.rgb * ambient; for(int i = 0; i < NUM_LIGHTS; ++i) { // Vector to light vec3 L = ubo.lights[i].position.xyz - fragPos; // Distance from light to fragment position float dist = length(L); // Viewer to fragment vec3 V = ubo.viewPos.xyz - fragPos; V = normalize(V); // Light to fragment L = normalize(L); // Attenuation float atten = ubo.lights[i].radius / (pow(dist, 2.0) + 1.0); // Diffuse part vec3 N = normalize(normal); float NdotL = max(0.0, dot(N, L)); vec3 diff = ubo.lights[i].color * albedo.rgb * NdotL * atten; // Specular part // Specular map values are stored in alpha of albedo mrt vec3 R = reflect(-L, N); float NdotR = max(0.0, dot(R, V)); //vec3 spec = ubo.lights[i].color * albedo.a * pow(NdotR, 32.0) * atten; fragcolor += diff;// + spec; } outColor = vec4(fragcolor, 1.0); }