#version 450 struct DirectionalLightStruct { vec3 direction; uint isActive; uint cullingMask; vec4 diffuseColor; mat4 pvMatrix; uint shadowData; }; struct AmbientLightStruct { vec4 ambientColor; float strength; uint isActive; uint cullingMask; }; layout(local_size_x = 16, local_size_y = 16) in; layout(set = 3, binding = 0, rgba32f) uniform image2D positions; layout(set = 3, binding = 1, rgba32f) uniform image2D normals; layout(set = 3, binding = 2, rgba8) uniform image2D albedo; layout(set = 3, binding = 3, r32ui) uniform uimage2D lightLayerData; layout(set = 3, binding = 4, r8) uniform image2D ssaoBlurredImage; layout(set = 3, binding = 5, rgba8) uniform image2D targetImage; layout (set = 4, binding = 0) uniform sampler2D shadowMaps[]; // for textures (global) 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; // bool IsInShadow (sampler2D shadowMap, vec2 coords, float depth, mat4 lightVP) // { // // vec4 fragPosLightPOV = lightVP * // } 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 positionView = imageLoad (positions, globalThread).rgb; // normal of fragment vec3 normalView = imageLoad(normals, globalThread).rgb; // light layer index uint lightLayer = imageLoad (lightLayerData, globalThread).r; vec3 fragColor = vec3 (0.0f); vec4 shadowMapColor = vec4 (1.0f); for (int i = 0; i < lightCounts.ambientLights; ++i) { if ((lightLayer & AmbLightData.aLightData[i].cullingMask) != 0) { // 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); } } for (int i = 0; i < lightCounts.directionalLights; ++i) { if ((lightLayer & DirLightData.dLightData[i].cullingMask) != 0) { // get normalized direction of light vec3 dLightNormalized = normalize (DirLightData.dLightData[i].direction); // Get diffuse strength float diffuseStrength = max (0, dot (dLightNormalized, normalView)); // Calculate the fragment color fragColor += DirLightData.dLightData[i].diffuseColor.rgb * diffuseStrength.rrr * pixelDiffuse; // If the shadow map is enabled (test the bit) if ((DirLightData.dLightData[i].shadowData & uint(1)) == 1) { // calculate shadow map here vec2 texCoord = vec2 (gl_GlobalInvocationID.xy) / vec2 (imageSize (targetImage)); } } } float ssaoVal = imageLoad (ssaoBlurredImage, globalThread).r; fragColor *= ssaoVal; // store result into result image imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor.rgb, 1.0f)); // imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), shadowMapColor); //imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(ssaoVal.rrr, 1.0f)); }