A FX TD usually builds some special technical solutions with some special skills and software combination to do his job. Sometimes, he may create some tools to solve some specific problems by himself. In this article, I introduce several tools I developed many years ago for particle effect to you.
In 2006, I was making FX work in Maya. For particle effect, Maya has a weakness that particle can not be illuminated in viewport. Particle effect must be rendered to check whether it looks good or not. badly, every time of rendering breaks FX artist’s thinking. So the first requirement of making particle effect in Maya is real-time illumination, which the following plug-in privodes.
Cloudy

Its major funciton is caculating particle shadow so that light scatter in particles and get attenuated through it like sunlight scatter into atmosphere. To implement it, every light beam’s attenuation through every particle in its ray path need to be recorded until light brightness becomes to zero, which seems like deep shadow map. Simply, Cloudy could be looked as a extended version of deep shadow map with realtime performance and volume scattering function.
Because three channels of RGB are stored seperately, colorful shadow could be made easily. Making fancy effect like galaxy and magic stream benefits from it.
Furthermore, there is no limit on amount of light. With real-time illuminated effect, fast version iteration, Cloudy makes complex particle effect become true.
For custom requirement, Maya Particle Expression and Ramp Attribute Map also assists in variety of color and transparency.
Huge particle generating tool — hugePoints

Mars Mission, a science fiction movie telling a adventure story about science exploration on Mars, shows a dramatic particle effect. When watching this movie, you will have a intuitive feeling about over 100 million particles. The effect about thousands of particles is totally not a same thing with an effect about hundred millions of particles. Like, there are totally different between a drop of water and ocean. The following video clip gives you a intuitive feeling about so many particles.

When we start FX work, much software and data already occupied memory, such as OS, Maya, the rest size left for particle effect is rare. Tough the size of memory is pretty large today, we still need to make it count. The first thing to make a huge particle effect is designing a compressible data struct to store such much data. A byte saved in one particle data struct means that 100 milions of bytes would be saved in total. So it is important to thrink one particle’s data struct. Having half float, a particle data can be stored within 20 types, including 6 bytes for position, 6 bytes for velocity, 2 bytes for mass, 2 bytes for radius, 4 bytes for RGBA.
Data struct is ready. The next work is coding generating particles’ function. In my experience, the most convientent way making huge particle effect includes just two processes, making a spare version of particle effect and converting it to huge. When artist made a version about thousands of particles and want to have a huge version, he just feed the sparse particle cache into my particle generating tool to get it.


The processes of generating and simulation are simple. In each frame, those particles born in time from previous frame to current frame would be identified and generating function creates particles arround them and inherit their properties, mass, velocity and radius. Then, put them into the existent particles and simulate them together with traction from sparse particles’ motion, gravity, turbulance force and so on.
Rendering such huge particles is the final problem. Huge particles can not be rendered out efficiently as a whole primitve. Sometimes, the rendering process would be blowed because of memory overflow. PRMan has a framework to settle it, which is Delayed Procedural Primitive DSO. By plug a custom DSO, renderer only need to load the piece of particles that are used at current basket and release them immediately after basket rendering. As result, huge data are divided into pieces and they would be loaded into memory by pieces when rendering. The problem got a perfect solution.