diff --git a/projects/fire_works/shaders/generation.comp b/projects/fire_works/shaders/generation.comp
index 83b0167779bc6bc1836c52642359bc8419be5152..445c8f492d221cabaca855ff533817ca609af86c 100644
--- a/projects/fire_works/shaders/generation.comp
+++ b/projects/fire_works/shaders/generation.comp
@@ -148,7 +148,7 @@ void main() {
 
     {
         const uint tid = atomicAdd(trailIndex, 1) % trails.length();
-        const uint trailLen = 16; // 64 + int(randomData[(tid + id) % randomData.length()] * 32);
+        const uint trailLen = 64 + int(randomData[(tid + id) % randomData.length()] * 32);
 
         const uint startIndex = atomicAdd(pointIndex, trailLen) % points.length();
 
diff --git a/projects/fire_works/shaders/trail.geom b/projects/fire_works/shaders/trail.geom
index ce0c66ac36a339604d1594cd3546d31150830cf0..39ab595a98f78e9d85d3906a83a591667729cebc 100644
--- a/projects/fire_works/shaders/trail.geom
+++ b/projects/fire_works/shaders/trail.geom
@@ -2,8 +2,11 @@
 #extension GL_ARB_separate_shader_objects : enable
 #extension GL_GOOGLE_include_directive : enable
 
+#define INSTANCE_LEN (16)
+
 layout(points) in;
-layout (triangle_strip, max_vertices = 32) out;
+layout (triangle_strip, max_vertices = (INSTANCE_LEN * 2)) out;
+layout(invocations = 32) in;
 
 #include "physics.inc"
 #include "point.inc"
@@ -38,14 +41,24 @@ void main() {
     const uint startIndex = geomStartIndex[0];
     const uint useCount = geomUseCount[0];
 
-    if (useCount <= 1) {
+    const uint indexOffset = (gl_InvocationID * (INSTANCE_LEN - 1));
+    const uint instanceIndex = startIndex + indexOffset;
+
+    uint count = INSTANCE_LEN;
+
+    if (indexOffset + INSTANCE_LEN > useCount) {
+        count = indexOffset - useCount;
+    }
+
+    if (count <= 1) {
         return;
     }
 
     vec4 viewPositions [2];
 
     for (uint i = 0; i < 2; i++) {
-        const vec3 position = points[startIndex + i].position;
+        const uint index = (instanceIndex + i) % points.length();
+        const vec3 position = points[index].position;
 
         viewPositions[i] = view * vec4(position, 1);
     }
@@ -55,11 +68,13 @@ void main() {
 
     const float trailFactor = mediumDensity / friction;
 
-    for (uint i = 0; i < useCount; i++) {
-        const float u = float(i + 1) / float(useCount);
+    for (uint i = 0; i < count; i++) {
+        const float u = float(indexOffset + i + 1) / float(useCount);
+
+        const uint index = (instanceIndex + i) % points.length();
 
-        const vec3 position = points[startIndex + i].position;
-        const float size = points[startIndex + i].size;
+        const vec3 position = points[index].position;
+        const float size = points[index].size;
 
         vec4 viewPos = view * vec4(position, 1);