gpuUpdateParticles.vertex.fx 1.3 KB

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