I have used transform feedback to render trails.
some old works: inkfall and waterfall for teamlab.
I’m not sure whether you are going to render the trails as line or just particles,
but here is what I did:
2 VBOs to hold all vertex data (for pingpong);
2 BufferTexture referring to the same vertex data, so that you could access all vertices in the update shader;
1 VBO storing index data(which was static in my case): I render lines with GL_LINES_ADJACENCY_EXT format, so that I could separate vertices into multiple lines.
So these structure will be like:
position vbo: line1[vert1, vert2, vert3, vert4, vert5, vert6], line2[vert1, vert2, vert3, vert4, vert5, vert6]
segment vbo: line1[0,1,2,3, 1,2,3,4, 2,3,4,5], line2[6,7,8,9, 7,8,9,10, 8,9,10,11]
so that when you render, you will have 2 lines in this case.
To find the corresponding index of predecessor vertex, you probably need another VBO to store index of each vertex in the specific line, like in the above case, it would be: line1[0,1,2,3,4,5], line2[0,1,2,3,4,5].
Hopefully this makes sense to you…
I also think if you don’t mind losing support for OS X,
using compute shader would probably give you more freedom when updating trails.