diff --git a/leenkx/Shaders/voxel_temporal/voxel_temporal.comp.glsl b/leenkx/Shaders/voxel_temporal/voxel_temporal.comp.glsl index d077029..679e0f3 100644 --- a/leenkx/Shaders/voxel_temporal/voxel_temporal.comp.glsl +++ b/leenkx/Shaders/voxel_temporal/voxel_temporal.comp.glsl @@ -35,28 +35,26 @@ uniform vec3 lightColor; uniform int lightType; uniform vec3 lightDir; uniform vec2 spotData; -uniform float envmapStrength; #ifdef _ShadowMap uniform int lightShadow; 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(rgba16f) image3D voxelsB; uniform layout(rgba16f) image3D voxelsOut; -uniform layout(r16f) image3D SDF; +uniform layout(r8) image3D SDF; #else #ifdef _VoxelAOvar #ifdef _VoxelShadow -uniform layout(r16f) image3D SDF; +uniform layout(r8) image3D SDF; #endif uniform layout(r32ui) uimage3D voxels; -uniform layout(r16f) image3D voxelsB; -uniform layout(r16f) image3D voxelsOut; +uniform layout(r8) image3D voxelsB; +uniform layout(r8) image3D voxelsOut; #endif #endif @@ -76,6 +74,9 @@ void main() { #endif #endif + mat3 TBN = mat3(1.0); + vec3 avgNormal = vec3(0.0); + for (int i = 0; i < 6 + DIFFUSE_CONE_COUNT; i++) { #ifdef _VoxelGI @@ -100,45 +101,46 @@ void main() { 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)) / 1024; - basecol.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x))) / 1024; - basecol.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 2))) / 1024; - basecol.a = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 3))) / 1024; + 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))) / 1024; - emission.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 5))) / 1024; - emission.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 6))) / 1024; + 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))) / 1024.0; - N.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 8))) / 1024.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 /= count; - // Decode octahedral normal N = decode_oct(N.rg * 2.0 - 1.0); + avgNormal += N; + + if (i == 5) + TBN = makeTangentBasis(normalize(avgNormal)); + vec3 envl = vec3(0.0); - envl.r = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 9))) / 1024; - envl.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 10))) / 1024; - envl.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 11))) / 1024; + 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))) / 1024; - light.g = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 13))) / 1024; - light.b = float(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x * 14))) / 1024; + 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 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]); + 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(P, N, voxelsSampler, clipmaps); + vec4 trace = traceDiffuse(wposition, N, voxelsSampler, clipmaps); vec3 indirect = trace.rgb + envl.rgb * (1.0 - trace.a); radiance.rgb *= light + indirect; radiance.rgb += emission.rgb; @@ -146,7 +148,7 @@ void main() { #else int count = int(imageLoad(voxels, src + ivec3(0, 0, voxelgiResolution.x))); if (count > 0) { - opac = float(imageLoad(voxels, src)) / 1024; + opac = float(imageLoad(voxels, src)) / 255; opac /= count; } #endif @@ -202,7 +204,7 @@ void main() { } else { // precompute cone sampling: - vec3 coneDirection = DIFFUSE_CONE_DIRECTIONS[i - 6]; + vec3 coneDirection = TBN * DIFFUSE_CONE_DIRECTIONS[i - 6]; vec3 aniso_direction = -coneDirection; uvec3 face_offsets = uvec3( aniso_direction.x > 0 ? 0 : 1, @@ -214,13 +216,15 @@ 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 }