datamosh.glsl 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #[compute]
  2. #version 450
  3. // Invocations in the (x, y, z) dimension
  4. layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
  5. layout(rgba16f, set = 0, binding = 0) uniform image2D color_image;
  6. layout(rg16, set = 1, binding = 0) uniform image2D velocity_image;
  7. layout(rgba16f, set = 2, binding = 0) uniform image2D previous_image;
  8. // Our push PushConstant
  9. layout(push_constant, std430) uniform Params {
  10. ivec2 size;
  11. int time;
  12. } params;
  13. float nrand(float x, float y) {
  14. return fract(sin(dot(vec2(x, y), vec2(12.9898, 78.233))) * 43758.5453);
  15. }
  16. // The code we want to execute in each invocation
  17. void main() {
  18. float time = params.time;
  19. ivec2 size = params.size;
  20. ivec2 uv = ivec2(gl_GlobalInvocationID.xy);
  21. ivec2 uvr=ivec2(vec2(uv)/10.0)*10;
  22. float n = nrand(time,uvr.x*uvr.y);
  23. //float n = nrand(time,uvr.x+uvr.y*size.x);
  24. vec4 color_vel = imageLoad(velocity_image, uvr);
  25. color_vel=max(abs(color_vel)-round(n/1.4),0)*sign(color_vel);
  26. ivec2 uv2 = ivec2(gl_GlobalInvocationID.xy + (color_vel.rg*size));
  27. uv2 = min(uv2, size-10);
  28. uv2 = max(uv2, 0);
  29. if (n > 0.1) {
  30. if (n < 0.95) {
  31. vec4 color = imageLoad(previous_image, uv2) * 1.0;
  32. color += imageLoad(color_image, uv) * 0.0;
  33. imageStore(color_image, uv, color);
  34. }
  35. } else {
  36. vec4 color = imageLoad(previous_image, uv);
  37. imageStore(color_image, uv, color);
  38. }
  39. //imageStore(color_image, uv, color_vel * -10.0);
  40. //imageStore(color_image, uv, vec4(vec2(uv2)*0.001, 0.0, 1.0));
  41. }