diff --git a/projects/fire_works/shaders/add.comp b/projects/fire_works/shaders/add.comp index 365919852135ca0cfb2e6803e524a5468b5ba103..737a1f3fd69e237f7692be8a6b36b1e14f1fd50a 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 fc382f33866ae101a1ce94fa29a0176b7ce55f0c..076a280739e542c0579a7b80eaeaf4993df13edf 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 8097da994756313328509eb9ce0ccfbb12cb733b..9e2c895e4a0c688262de7404039aefe6650191bd 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 301c4c9d4fb0b6715dae61bd7625688fe8dd8584..12b68eed09746f38286a5b1f1b4e9e56d4bfe105 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 f399eba77efcf4e4745076dcca6807d67f1e9f12..de216ab29a6671e1547600d072edaf510b775154 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 667e402c9077a51d481bc72e6d3bead2638d8230..56971a1719075e0dd9a6a5bb6b52e89c11f8489c 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;