From b8ca4be56a6db1222384cb549945cd9db0263ac1 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Wed, 21 May 2025 16:08:14 +0000 Subject: [PATCH] Update leenkx/Shaders/voxel_temporal/voxel_temporal.comp.glsl --- .../voxel_temporal/voxel_temporal.comp.glsl | 111 +++++++++--------- 1 file changed, 58 insertions(+), 53 deletions(-) diff --git a/leenkx/Shaders/voxel_temporal/voxel_temporal.comp.glsl b/leenkx/Shaders/voxel_temporal/voxel_temporal.comp.glsl index 6c70b3b..7a89be0 100644 --- a/leenkx/Shaders/voxel_temporal/voxel_temporal.comp.glsl +++ b/leenkx/Shaders/voxel_temporal/voxel_temporal.comp.glsl @@ -41,20 +41,21 @@ uniform vec2 lightProj; uniform float shadowsBias; uniform mat4 LVP; #endif +uniform float envmapStrength; uniform sampler3D voxelsSampler; uniform layout(r32ui) uimage3D voxels; uniform layout(r32ui) uimage3D voxelsLight; -uniform layout(rgba8) image3D voxelsB; -uniform layout(rgba8) image3D voxelsOut; -uniform layout(r8) image3D SDF; +uniform layout(rgba16f) image3D voxelsB; +uniform layout(rgba16f) image3D voxelsOut; +uniform layout(r16f) image3D SDF; #else #ifdef _VoxelAOvar #ifdef _VoxelShadow -uniform layout(r8) image3D SDF; +uniform layout(r16f) image3D SDF; #endif uniform layout(r32ui) uimage3D voxels; -uniform layout(r8) image3D voxelsB; -uniform layout(r8) image3D voxelsOut; +uniform layout(r16f) image3D voxelsB; +uniform layout(r16f) image3D voxelsOut; #endif #endif @@ -74,14 +75,6 @@ void main() { #endif #endif - ivec3 src = ivec3(gl_GlobalInvocationID.xyz); - #ifdef _VoxelGI - vec3 light = vec3(0.0); - light.r = float(imageLoad(voxelsLight, src)) / 255; - light.g = float(imageLoad(voxelsLight, src + ivec3(0, 0, voxelgiResolution.x))) / 255; - light.b = float(imageLoad(voxelsLight, src + ivec3(0, 0, voxelgiResolution.x * 2))) / 255; - #endif - for (int i = 0; i < 6 + DIFFUSE_CONE_COUNT; i++) { #ifdef _VoxelGI @@ -90,7 +83,7 @@ void main() { float aniso_colors[6]; #endif - src = ivec3(gl_GlobalInvocationID.xyz); + ivec3 src = ivec3(gl_GlobalInvocationID.xyz); src.x += i * res; ivec3 dst = src; dst.y += clipmapLevel * res; @@ -103,44 +96,58 @@ void main() { if (i < 6) { #ifdef _VoxelGI - vec4 basecol = vec4(0.0); - basecol.r = float(imageLoad(voxels, src)) / 255; - basecol.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x))) / 255; - basecol.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 2))) / 255; - basecol.a = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 3))) / 255; - basecol /= 4; - vec3 emission = vec3(0.0); - emission.r = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 4))) / 255; - emission.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 5))) / 255; - emission.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 6))) / 255; - emission /= 3; - vec3 N = vec3(0.0); - N.r = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 7))) / 255; - N.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 8))) / 255; - N /= 2; - vec3 wnormal = decode_oct(N.rg * 2 - 1); - vec3 envl = vec3(0.0); - envl.r = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 9))) / 255; - envl.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 10))) / 255; - envl.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 11))) / 255; - envl /= 3; + int count = int(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 15))); + if (count > 0) { + vec4 basecol = vec4(0.0); + basecol.r = float(imageLoad(voxels, src)) / 255; + basecol.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x))) / 255; + basecol.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 2))) / 255; + basecol.a = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 3))) / 255; + basecol /= count; + vec3 emission = vec3(0.0); + emission.r = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 4))) / 255; + emission.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 5))) / 255; + emission.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 6))) / 255; + emission /= count; + // Retrieve encoded normal (stored in 8-bit format) + vec3 N = vec3(0.0); + N.r = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 7))) / 255.0; + N.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 8))) / 255.0; + N /= count; + // Decode octahedral normal + N = decode_oct(N.rg * 2.0 - 1.0); + vec3 envl = vec3(0.0); + envl.r = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 9))) / 255; + envl.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 10))) / 255; + envl.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 11))) / 255; + envl /= count; + envl *= envmapStrength; + vec3 light = vec3(0.0); + light.r = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 12))) / 255; + light.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 13))) / 255; + light.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 14))) / 255; + light /= count; - //clipmap to world - vec3 wposition = (gl_GlobalInvocationID.xyz + 0.5) / voxelgiResolution.x; - wposition = wposition * 2.0 - 1.0; - wposition *= float(clipmaps[int(clipmapLevel * 10)]); - wposition *= voxelgiResolution.x; - wposition += vec3(clipmaps[clipmapLevel * 10 + 4], clipmaps[clipmapLevel * 10 + 5], clipmaps[clipmapLevel * 10 + 6]); - - radiance = basecol; - vec4 trace = traceDiffuse(wposition, wnormal, voxelsSampler, clipmaps); - vec3 indirect = trace.rgb + envl.rgb * (1.0 - trace.a); - radiance.rgb *= light / PI + indirect; - radiance.rgb += emission.rgb; + //clipmap to world + vec3 P = (gl_GlobalInvocationID.xyz + 0.5) / voxelgiResolution.x; + P = P * 2.0 - 1.0; + P *= float(clipmaps[int(clipmapLevel * 10)]); + P *= voxelgiResolution.x; + P += vec3(clipmaps[clipmapLevel * 10 + 4], clipmaps[clipmapLevel * 10 + 5], clipmaps[clipmapLevel * 10 + 6]); + radiance = basecol; + vec4 trace = traceDiffuse(P, N, voxelsSampler, clipmaps); + vec3 indirect = trace.rgb + envl.rgb * (1.0 - trace.a); + radiance.rgb *= light + indirect; + radiance.rgb += emission.rgb; + } #else - opac = float(imageLoad(voxels, src)) / 255; + int count = int(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x))); + if (count > 0) { + opac = float(imageLoad(voxels, src)) / 255; + opac /= count; + } #endif #ifdef _VoxelGI @@ -206,15 +213,13 @@ void main() { vec4 sam = aniso_colors[face_offsets.x] * direction_weights.x + aniso_colors[face_offsets.y] * direction_weights.y + - aniso_colors[face_offsets.z] * direction_weights.z - ; + aniso_colors[face_offsets.z] * direction_weights.z; radiance = sam; #else float sam = aniso_colors[face_offsets.x] * direction_weights.x + aniso_colors[face_offsets.y] * direction_weights.y + - aniso_colors[face_offsets.z] * direction_weights.z - ; + aniso_colors[face_offsets.z] * direction_weights.z; opac = sam; #endif }