From 86661c101235cc55c89f9ef42dd9f7be31b6535e Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 7 Apr 2025 16:04:17 +0000 Subject: [PATCH] Update leenkx/Shaders/voxel_light/voxel_light.comp.glsl --- .../Shaders/voxel_light/voxel_light.comp.glsl | 89 +++++++++---------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/leenkx/Shaders/voxel_light/voxel_light.comp.glsl b/leenkx/Shaders/voxel_light/voxel_light.comp.glsl index 8d4515f..005a3c1 100644 --- a/leenkx/Shaders/voxel_light/voxel_light.comp.glsl +++ b/leenkx/Shaders/voxel_light/voxel_light.comp.glsl @@ -33,6 +33,7 @@ uniform layout(r32ui) uimage3D voxelsLight; #ifdef _ShadowMap uniform sampler2DShadow shadowMap; +uniform sampler2D shadowMapTransparent; uniform sampler2DShadow shadowMapSpot; #ifdef _ShadowMapAtlas uniform sampler2DShadow shadowMapPoint; @@ -86,53 +87,51 @@ float lpToDepth(vec3 lp, const vec2 lightProj) { void main() { int res = voxelgiResolution.x; + for (int i = 0; i < 6; i++) { + ivec3 dst = ivec3(gl_GlobalInvocationID.xyz); + vec3 P = (gl_GlobalInvocationID.xyz + 0.5) / voxelgiResolution; + P = P * 2.0 - 1.0; - ivec3 dst = ivec3(gl_GlobalInvocationID.xyz); - dst.y += clipmapLevel * res; - - vec3 P = (gl_GlobalInvocationID.xyz + 0.5) / voxelgiResolution; - P = P * 2.0 - 1.0; - P *= clipmaps[int(clipmapLevel * 10)]; - P *= voxelgiResolution; - P += vec3(clipmaps[int(clipmapLevel * 10 + 4)], clipmaps[int(clipmapLevel * 10 + 5)], clipmaps[int(clipmapLevel * 10 + 6)]); - - vec3 visibility; - vec3 lp = lightPos - P; - vec3 l; - if (lightType == 0) { l = lightDir; visibility = vec3(1.0); } - else { l = normalize(lp); visibility = vec3(attenuate(distance(P, lightPos))); } + float visibility; + vec3 lp = lightPos - P; + vec3 l; + if (lightType == 0) { l = lightDir; visibility = 1.0; } + else { l = normalize(lp); visibility = attenuate(distance(P, lightPos)); } #ifdef _ShadowMap - if (lightShadow == 1) { - vec4 lightPosition = LVP * vec4(P, 1.0); - vec3 lPos = lightPosition.xyz / lightPosition.w; - visibility = texture(shadowMap, vec3(lPos.xy, lPos.z - shadowsBias)).rrr; - } - else if (lightShadow == 2) { - vec4 lightPosition = LVP * vec4(P, 1.0); - vec3 lPos = lightPosition.xyz / lightPosition.w; - visibility *= texture(shadowMapSpot, vec3(lPos.xy, lPos.z - shadowsBias)).r; - } - else if (lightShadow == 3) { - #ifdef _ShadowMapAtlas - int faceIndex = 0; - const int lightIndex = index * 6; - const vec2 uv = sampleCube(-l, faceIndex); - vec4 pointLightTile = pointLightDataArray[lightIndex + faceIndex]; // x: tile X offset, y: tile Y offset, z: tile size relative to atlas - vec2 uvtiled = pointLightTile.z * uv + pointLightTile.xy; - #ifdef _FlipY - uvtiled.y = 1.0 - uvtiled.y; // invert Y coordinates for direct3d coordinate system - #endif - visibility *= texture(shadowMapPoint, vec3(uvtiled, lpToDepth(lp, lightProj) - shadowsBias)).r; - #else - visibility *= texture(shadowMapPoint, vec4(-l, lpToDepth(lp, lightProj) - shadowsBias)).r; - #endif - } -#endif + if (lightShadow == 1) { + vec4 lightPosition = LVP * vec4(P, 1.0); + vec3 lPos = lightPosition.xyz / lightPosition.w; + visibility = texture(shadowMap, vec3(lPos.xy, lPos.z - shadowsBias)).r; + } + else if (lightShadow == 2) { + vec4 lightPosition = LVP * vec4(P, 1.0); + vec3 lPos = lightPosition.xyz / lightPosition.w; + visibility *= texture(shadowMapSpot, vec3(lPos.xy, lPos.z - shadowsBias)).r; + } + else if (lightShadow == 3) { + #ifdef _ShadowMapAtlas + int faceIndex = 0; + const int lightIndex = index * 6; + const vec2 uv = sampleCube(-l, faceIndex); + vec4 pointLightTile = pointLightDataArray[lightIndex + faceIndex]; // x: tile X offset, y: tile Y offset, z: tile size relative to atlas + vec2 uvtiled = pointLightTile.z * uv + pointLightTile.xy; + #ifdef _FlipY + uvtiled.y = 1.0 - uvtiled.y; // invert Y coordinates for direct3d coordinate system + #endif + visibility *= texture(shadowMapPoint, vec3(uvtiled, lpToDepth(lp, lightProj) - shadowsBias)).r; + #else + visibility *= texture(shadowMapPoint, vec4(-l, lpToDepth(lp, lightProj) - shadowsBias)).r; + #endif + } + #endif + vec3 uvw_light = (P - vec3(clipmaps[int(clipmapLevel * 10 + 4)], clipmaps[int(clipmapLevel * 10 + 5)], clipmaps[int(clipmapLevel * 10 + 6)])) / (float(clipmaps[int(clipmapLevel * 10)]) * voxelgiResolution); + uvw_light = (uvw_light * 0.5 + 0.5); + if (any(notEqual(uvw_light, clamp(uvw_light, 0.0, 1.0)))) return; + vec3 writecoords_light = floor(uvw_light * voxelgiResolution); - vec3 light = visibility * lightColor; - - imageAtomicAdd(voxelsLight, dst + ivec3(0, 0, 0), uint(light.r * 255)); - imageAtomicAdd(voxelsLight, dst + ivec3(0, 0, voxelgiResolution.x), uint(light.g * 255)); - imageAtomicAdd(voxelsLight, dst + ivec3(0, 0, voxelgiResolution.x * 2), uint(light.b * 255)); + imageAtomicMax(voxelsLight, ivec3(writecoords_light), uint(visibility * lightColor.r * 255)); + imageAtomicMax(voxelsLight, ivec3(writecoords_light) + ivec3(0, 0, voxelgiResolution.x), uint(visibility * lightColor.g * 255)); + imageAtomicMax(voxelsLight, ivec3(writecoords_light) + ivec3(0, 0, voxelgiResolution.x * 2), uint(visibility * lightColor.b * 255)); + } }