#version 450 struct DirectionalLightStruct { vec3 direction; uint isActive; uint cullingMask; vec4 diffuseColor; }; struct AmbientLightStruct { vec4 ambientColor; float strength; uint isActive; uint cullingMask; }; layout(local_size_x = 16, local_size_y = 16) in; layout(set = 4, binding = 0, rgba32f) uniform image2D positions; layout(set = 4, binding = 1, rgba32f) uniform image2D normals; layout(set = 4, binding = 2, rgba8) uniform image2D albedo; layout(set = 4, binding = 3, rgba8) uniform image2D targetImage; layout(set = 1, binding = 0) uniform LightCounts { uint directionalLights; uint pointLights; uint spotLights; uint ambientLights; } lightCounts; layout(std430, set = 1, binding = 1) buffer DirectionalLightData { DirectionalLightStruct dLightData[]; } DirLightData; layout(std430, set = 1, binding = 4) buffer AmbientLightData { AmbientLightStruct aLightData[]; } AmbLightData; void main() { // convenient variables ivec2 globalThread = ivec2(gl_GlobalInvocationID); // Get the diffuse color of the pixel vec3 pixelDiffuse = imageLoad (albedo, globalThread).rgb; // Get position of fragment in world space vec3 positionWorld = imageLoad (positions, globalThread).rgb; // normal of fragment vec3 normalWorld = imageLoad(normals, globalThread).rgb; vec3 fragColor = vec3 (0.0f); for (int i = 0; i < lightCounts.directionalLights; ++i) { // get normalized direction of light vec3 dLightNormalized = normalize (DirLightData.dLightData[i].direction); // Get diffuse strength float diffuseStrength = max (0, dot (dLightNormalized, normalWorld)); // Calculate the fragment color fragColor += DirLightData.dLightData[i].diffuseColor.rgb * diffuseStrength.rrr * pixelDiffuse; } for (int i = 0; i < lightCounts.ambientLights; ++i) { // Just do some add //fragColor += pixelDiffuse.rgb * AmbLightData.aLightData[i].ambientColor.rgb * vec3 (0.5f); fragColor += pixelDiffuse.rgb * AmbLightData.aLightData[i].ambientColor.rgb * vec3 (AmbLightData.aLightData[i].strength); } // store result into result image imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor, 1.0f)); }