diff --git a/leenkx/Shaders/std/conetrace.glsl b/leenkx/Shaders/std/conetrace.glsl index 776752a..5eb745e 100644 --- a/leenkx/Shaders/std/conetrace.glsl +++ b/leenkx/Shaders/std/conetrace.glsl @@ -125,7 +125,7 @@ vec4 traceCone(const sampler3D voxels, const sampler3D voxelsSDF, const vec3 ori if(clipmap_blend > 0.0 && clipmap_index < voxelgiClipmapCount - 1) { vec4 mipSampleNext = sampleVoxel(voxels, p0, clipmaps, clipmap_index + 1.0, step_dist, precomputed_direction, face_offset, direction_weight); - mipSample = mix(mipSample, mipSampleNext, smoothstep(0.0, 1.0, clipmap_blend)); + mipSample = mix(mipSample, mipSampleNext, clipmap_blend); } sampleCol += (1.0 - sampleCol.a) * mipSample; @@ -148,8 +148,9 @@ vec4 traceCone(const sampler3D voxels, const sampler3D voxelsSDF, const vec3 ori vec4 traceDiffuse(const vec3 origin, const vec3 normal, const sampler3D voxels, const float clipmaps[voxelgiClipmapCount * 10]) { float sum = 0.0; vec4 amount = vec4(0.0); + mat3 TBN = makeTangentBasis(normal); for (int i = 0; i < DIFFUSE_CONE_COUNT; ++i) { - vec3 coneDir = DIFFUSE_CONE_DIRECTIONS[i]; + vec3 coneDir = TBN * DIFFUSE_CONE_DIRECTIONS[i]; const float cosTheta = dot(normal, coneDir); if (cosTheta <= 0) continue; @@ -166,7 +167,7 @@ vec4 traceDiffuse(const vec3 origin, const vec3 normal, const sampler3D voxels, } vec4 traceSpecular(const vec3 origin, const vec3 normal, const sampler3D voxels, const sampler3D voxelsSDF, const vec3 viewDir, const float roughness, const float clipmaps[voxelgiClipmapCount * 10], const vec2 pixel, const vec2 velocity) { - vec3 specularDir = reflect(-viewDir, normal); + vec3 specularDir = reflect(normalize(-viewDir), normal); vec3 P = origin + specularDir * ((BayerMatrix8[int(pixel.x + velocity.x) % 8][int(pixel.y + velocity.y) % 8] - 0.5)) * voxelgiStep; vec4 amount = traceCone(voxels, voxelsSDF, P, normal, specularDir, 0, true, roughness, voxelgiStep, clipmaps); @@ -177,8 +178,8 @@ vec4 traceSpecular(const vec3 origin, const vec3 normal, const sampler3D voxels, } vec4 traceRefraction(const vec3 origin, const vec3 normal, sampler3D voxels, sampler3D voxelsSDF, const vec3 viewDir, const float ior, const float roughness, const float clipmaps[voxelgiClipmapCount * 10], const vec2 pixel, const vec2 velocity, const float opacity) { - const float transmittance = 1.0; - vec3 refractionDir = refract(-viewDir, normal, 1.0 / ior); + const float transmittance = 1.0 - opacity; + vec3 refractionDir = refract(normalize(-viewDir), normal, 1.0 / ior); vec3 P = origin + refractionDir * (BayerMatrix8[int(pixel.x + velocity.x) % 8][int(pixel.y + velocity.y) % 8] - 0.5) * voxelgiStep; vec4 amount = transmittance * traceCone(voxels, voxelsSDF, P, normal, refractionDir, 0, true, roughness, voxelgiStep, clipmaps); @@ -259,7 +260,6 @@ float traceAO(const vec3 origin, const vec3 normal, const sampler3D voxels, cons } #endif - #ifdef _VoxelShadow float traceConeShadow(const sampler3D voxels, const sampler3D voxelsSDF, const vec3 origin, const vec3 n, const vec3 dir, const float aperture, const float step_size, const float clipmaps[voxelgiClipmapCount * 10]) { float sampleCol = 0.0; @@ -287,7 +287,7 @@ float traceConeShadow(const sampler3D voxels, const sampler3D voxelsSDF, const v float clipmap_blend = fract(lod); vec3 p0 = start_pos + dir * dist; - samplePos = (p0 - vec3(clipmaps[int(clipmap_index * 10 + 4)], clipmaps[int(clipmap_index * 10 + 5)], clipmaps[int(clipmap_index * 10 + 6)])) / (float(clipmaps[int(clipmap_index * 10)]) * voxelgiResolution.x); + samplePos = (p0 - vec3(clipmaps[int(clipmap_index * 10 + 4)], clipmaps[int(clipmap_index * 10 + 5)], clipmaps[int(clipmap_index * 10 + 6)])) / (float(clipmaps[int(clipmap_index * 10)]) * voxelgiResolution); samplePos = samplePos * 0.5 + 0.5; if ((any(notEqual(samplePos, clamp(samplePos, 0.0, 1.0))))) {