From bad7325c7f59aed4c8353fa6d23e60f8271f6457 Mon Sep 17 00:00:00 2001 From: TheJackiMonster <thejackimonster@gmail.com> Date: Tue, 26 Jul 2022 17:56:48 +0200 Subject: [PATCH] Fixed fluid compute shader and linearized depth Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> --- projects/fire_works/shaders/add.comp | 34 +++++++------------ projects/fire_works/shaders/fluid.comp | 11 +++--- projects/fire_works/shaders/voxel.inc | 7 ++++ .../fire_works/shaders/voxel_particle.comp | 2 +- projects/fire_works/shaders/voxel_smoke.comp | 2 +- projects/fire_works/shaders/voxel_trail.comp | 2 +- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/projects/fire_works/shaders/add.comp b/projects/fire_works/shaders/add.comp index 36591985..737a1f3f 100644 --- a/projects/fire_works/shaders/add.comp +++ b/projects/fire_works/shaders/add.comp @@ -20,7 +20,18 @@ layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; #define NUM_VOXEL_SAMPLES 32 +shared vec2 sc_data [NUM_VOXEL_SAMPLES]; + void main() { + const float localRadian = 0.25f * pi * randomData[gl_LocalInvocationIndex % randomData.length()]; + + sc_data[gl_LocalInvocationIndex % NUM_VOXEL_SAMPLES] = vec2( + sin(localRadian), cos(localRadian) + ); + + memoryBarrierShared(); + barrier(); + const ivec2 res = imageSize(outImage); if(any(greaterThanEqual(gl_GlobalInvocationID.xy, res))){ @@ -34,34 +45,15 @@ void main() { vec4 outTrails = imageLoad(inTrails, uv); vec2 pos = (vec2(uv) + vec2(0.5f)) / vec2(res); - vec2 size = vec2(textureSize(sampler2D(voxelTexture, voxelSampler), 0)); - - vec4 outSamples = vec4(0.0f); - - const uint globalID = uv.y + uv.x * res.y; - - for (uint i = 0; i < NUM_VOXEL_SAMPLES; i++) { - vec2 noise = vec2( - randomData[(globalID * NUM_VOXEL_SAMPLES * 2 + i * 2 + 0) % randomData.length()], - randomData[(globalID * NUM_VOXEL_SAMPLES * 2 + i * 2 + 1) % randomData.length()] - ); - - float noiseF = max(0.0f, 1.0f - length(noise)); - - outSamples += texture( - sampler2D(voxelTexture, voxelSampler), - pos + noise * (NUM_VOXEL_SAMPLES - 1.0f) / size - ) * (noiseF * noiseF); - } - outSamples /= NUM_VOXEL_SAMPLES; + vec4 outSamples = texture(sampler2D(voxelTexture, voxelSampler), pos); vec4 result = vec4(0.0f); result = smokeBlend(result, outParticles); result = smokeBlend(result, outTrails); result = smokeBlend(result, outSmoke); - result = smokeBlend(result, outSamples); + result = smokeBlend(result, outSamples * 0.1f); result.r = clamp(result.r, 0, 1); result.g = clamp(result.g, 0, 1); diff --git a/projects/fire_works/shaders/fluid.comp b/projects/fire_works/shaders/fluid.comp index fc382f33..076a2807 100644 --- a/projects/fire_works/shaders/fluid.comp +++ b/projects/fire_works/shaders/fluid.comp @@ -37,11 +37,12 @@ vec4 loadCachedData(vec3 position, ivec3 offset, ivec3 size) { uvec3 localId = gl_LocalInvocationID; ivec3 index = ivec3(localId) + offset; - if ((any(lessThan(index, ivec3(0)))) || (any(greaterThan(index, ivec3(gl_WorkGroupSize))))) { - return getDataFrom(position, vec3(offset) / vec3(size)); - } else { - return cachedData[index.x][index.y][index.z]; - } + // TOO SPECIAL FOR GPU TO WORK..! + //if ((any(lessThan(index, ivec3(0)))) || (any(greaterThan(index, ivec3(gl_WorkGroupSize))))) { + return getDataFrom(position, vec3(offset) / vec3(size)); + //} else { + // return cachedData[index.x][index.y][index.z]; + //} } void main() { diff --git a/projects/fire_works/shaders/voxel.inc b/projects/fire_works/shaders/voxel.inc index 8097da99..9e2c895e 100644 --- a/projects/fire_works/shaders/voxel.inc +++ b/projects/fire_works/shaders/voxel.inc @@ -8,4 +8,11 @@ #define voxel_write(img, pos, value) imageStore(img, pos, uvec4(VOXEL_NORM_VALUE * value)); #define voxel_read(img, pos) imageLoad(img, pos).r / float(VOXEL_NORM_VALUE); +// https://stackoverflow.com/questions/51108596/linearize-depth +float linearize_depth(float d,float zNear,float zFar) { + return zNear * zFar / (zFar + d * (zNear - zFar)); +} + +#define voxel_pos(pos) vec3((pos.xy + vec2(1.0f)) * 0.5f, linearize_depth(pos.y, 0.1f, 50.0f)) + #endif // VOXEL_INC \ No newline at end of file diff --git a/projects/fire_works/shaders/voxel_particle.comp b/projects/fire_works/shaders/voxel_particle.comp index 301c4c9d..12b68eed 100644 --- a/projects/fire_works/shaders/voxel_particle.comp +++ b/projects/fire_works/shaders/voxel_particle.comp @@ -43,7 +43,7 @@ void main() { } vec3 ndc_pos = cs_pos.xyz / cs_pos.w; - vec3 pos = (ndc_pos + vec3(1, 1, 0)) * vec3(0.5f, 0.5f, 1.0f); + vec3 pos = voxel_pos(ndc_pos); if ((any(greaterThanEqual(pos, vec3(1.5f)))) || (any(lessThanEqual(pos, vec3(-0.5f))))) { return; diff --git a/projects/fire_works/shaders/voxel_smoke.comp b/projects/fire_works/shaders/voxel_smoke.comp index f399eba7..de216ab2 100644 --- a/projects/fire_works/shaders/voxel_smoke.comp +++ b/projects/fire_works/shaders/voxel_smoke.comp @@ -52,7 +52,7 @@ void main() { } vec3 ndc_pos = cs_pos.xyz / cs_pos.w; - vec3 pos = (ndc_pos + vec3(1, 1, 0)) * vec3(0.5f, 0.5f, 1.0f); + vec3 pos = voxel_pos(ndc_pos); if ((any(greaterThanEqual(pos, vec3(1.5f)))) || (any(lessThanEqual(pos, vec3(-0.5f))))) { return; diff --git a/projects/fire_works/shaders/voxel_trail.comp b/projects/fire_works/shaders/voxel_trail.comp index 667e402c..56971a17 100644 --- a/projects/fire_works/shaders/voxel_trail.comp +++ b/projects/fire_works/shaders/voxel_trail.comp @@ -73,7 +73,7 @@ void main() { } vec3 ndc_pos = cs_pos.xyz / cs_pos.w; - vec3 pos = (ndc_pos + vec3(1, 1, 0)) * vec3(0.5f, 0.5f, 1.0f); + vec3 pos = voxel_pos(ndc_pos); if ((any(greaterThanEqual(pos, vec3(1.5f)))) || (any(lessThanEqual(pos, vec3(-0.5f))))) { continue; -- GitLab