Page 1 of 1

A Short Post About Particle Systems

Posted: Sun Jan 20, 2019 2:28 pm
by kim
Big post about particle systems! First off, if you've ever wanted to make a full particle management system beyond a specialized demo, you may find this post of mine helpful:

I've worked on fx systems for three fantasy MMOs now, for context.Far from perfect and is a couple years old now (and CPU-focused), but it is quite detailed, and the major concepts translate to GPU systems too. I came back to it recently after writing a new GPU particle manager for ESO to sit alongside the previous one. Mostly aged well haha.

I'll also add here some miscellaneous tips and tricks that I found over the last few years, when you're working with proprietary tech and don't have a fully developed solution already from a commercial engine:Separate your color control from your alpha control. Artists hate having to keyframe their color graphs with alpha together as a single entity. Separating them saves a lot of hassle and increases their control. Many particle editors make this mistake in my experience (self incl).

Allow artists to be able to animate as many controls as is possible/reasonable. Pick pretty much any particle feature - the artists will want to animate that. Keyframes, curves, whatever, they want it. There's a delicate balance with performance here though.Don't go third party (however appealing) for your primary solution. Rapid iteration in-engine/in-game is absolutely essential. Build your own, then supplement it with desired third party tools to enhance what artists can do. Relying exclusively on third party will trap you.Favor component-based editors to data spreadsheets. Many particle solutions are basically excel docs of properties and it's harder for artists to work with. The data behind it can be whatever you want, just visualize it better than that.

Indirect dispatch compute-sim/draw is not the only option. You can also cleanly separate your sim from your render by building particle verts at the end of your sim and stuffing them into a big raw (byte address) buffer which you can bind once for all particle rendering.A good way I found to do gpu emitters with events (eg to spawn child emitters) is to write a CPU semi-sim with particles seeded the same as the GPU ones. Their properties can be used to drive events rather than needing expensive readback or other complicated solutions.

Thanks for Reading @longbool