gpuUpdateParticles.vertex.fx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #version 300 es
  2. uniform float currentCount;
  3. uniform float timeDelta;
  4. uniform float generalRandom;
  5. uniform mat4 emitterWM;
  6. uniform vec2 lifeTime;
  7. uniform vec2 sizeRange;
  8. uniform vec4 color1;
  9. uniform vec4 color2;
  10. uniform vec3 gravity;
  11. uniform sampler2D randomSampler;
  12. // Particles state
  13. in vec3 position;
  14. in float age;
  15. in float life;
  16. in float seed;
  17. in float size;
  18. in vec4 color;
  19. in vec3 direction;
  20. // Output
  21. out vec3 outPosition;
  22. out float outAge;
  23. out float outLife;
  24. out float outSeed;
  25. out float outSize;
  26. out vec4 outColor;
  27. out vec3 outDirection;
  28. vec3 getRandomVec3(float offset) {
  29. return texture(randomSampler, vec2(float(gl_VertexID) * offset / currentCount, 0)).rgb;
  30. }
  31. void main() {
  32. if (age >= life) {
  33. // Create the particle at origin
  34. outPosition = (emitterWM * vec4(0., 0., 0., 1.)).xyz;
  35. // Let's get some random values
  36. vec3 randoms = getRandomVec3(generalRandom);
  37. // Age and life
  38. outAge = 0.0;
  39. outLife = lifeTime.x + (lifeTime.y - lifeTime.x) * randoms.r;
  40. // Seed
  41. outSeed = seed;
  42. // Size
  43. outSize = sizeRange.x + (sizeRange.y - sizeRange.x) * randoms.g;
  44. // Color
  45. outColor = color1 + (color2 - color1) * randoms.b;
  46. // Direction
  47. outDirection = 2.0 * (getRandomVec3(seed) - vec3(0.5, 0.5, 0.5));
  48. } else {
  49. outPosition = position + (direction + gravity) * timeDelta;
  50. outAge = age + timeDelta;
  51. outLife = life;
  52. outSeed = seed;
  53. outColor = color;
  54. outSize = size;
  55. outDirection = direction;
  56. }
  57. }