particles_copy.glsl 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #[compute]
  2. #version 450
  3. VERSION_DEFINES
  4. layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
  5. struct ParticleData {
  6. mat4 xform;
  7. vec3 velocity;
  8. bool is_active;
  9. vec4 color;
  10. vec4 custom;
  11. };
  12. layout(set = 0, binding = 1, std430) restrict readonly buffer Particles {
  13. ParticleData data[];
  14. }
  15. particles;
  16. layout(set = 0, binding = 2, std430) restrict writeonly buffer Transforms {
  17. vec4 data[];
  18. }
  19. instances;
  20. #ifdef USE_SORT_BUFFER
  21. layout(set = 1, binding = 0, std430) restrict buffer SortBuffer {
  22. vec2 data[];
  23. }
  24. sort_buffer;
  25. #endif // USE_SORT_BUFFER
  26. layout(push_constant, binding = 0, std430) uniform Params {
  27. vec3 sort_direction;
  28. uint total_particles;
  29. }
  30. params;
  31. void main() {
  32. #ifdef MODE_FILL_SORT_BUFFER
  33. uint particle = gl_GlobalInvocationID.x;
  34. if (particle >= params.total_particles) {
  35. return; //discard
  36. }
  37. sort_buffer.data[particle].x = dot(params.sort_direction, particles.data[particle].xform[3].xyz);
  38. sort_buffer.data[particle].y = float(particle);
  39. #endif
  40. #ifdef MODE_FILL_INSTANCES
  41. uint particle = gl_GlobalInvocationID.x;
  42. uint write_offset = gl_GlobalInvocationID.x * (3 + 1 + 1); //xform + color + custom
  43. if (particle >= params.total_particles) {
  44. return; //discard
  45. }
  46. #ifdef USE_SORT_BUFFER
  47. particle = uint(sort_buffer.data[particle].y); //use index from sort buffer
  48. #endif
  49. mat4 txform;
  50. if (particles.data[particle].is_active) {
  51. txform = transpose(particles.data[particle].xform);
  52. } else {
  53. txform = mat4(vec4(0.0), vec4(0.0), vec4(0.0), vec4(0.0)); //zero scale, becomes invisible
  54. }
  55. instances.data[write_offset + 0] = txform[0];
  56. instances.data[write_offset + 1] = txform[1];
  57. instances.data[write_offset + 2] = txform[2];
  58. instances.data[write_offset + 3] = particles.data[particle].color;
  59. instances.data[write_offset + 4] = particles.data[particle].custom;
  60. #endif
  61. }