There seems to be a peak in the current approach to animation. I’m not talking about IK/FK controllers, or animation techniques, or how we translate motion capture to something usable within a game engine. I am talking about the low-level process of animating a group of vertices using transform clusters.
In the beginning, we had baked keyframes and used simple vertex tweens to generate our frame data. Eventually we had the horsepower to animate organic models through a rigid bone structure. This evolved into a multi-weighted animation system, and now we have models that may be affected by 2 to 4 transforms per vertex.
Until the advent of GPU assisted bone animations we had to animate this content on the CPU and render them from client arrays (or system memory buffers, depending on your API). The disadvantage of the CPU approach was an obvious lack of data vectorization and the significant burden on the AGP bus. The GPU approach was an instant success; resolving both of these issues, but at what cost?
Many GPU based approaches have significant disadvantages. Register limitations means that a model was limited in the number of bones that could be used for any one object or scene. Bone indexing schemes are often unsigned bytes, which means a maximum of 255 bones and a limit of only 4 bones per vertex.
Some of the more complicated rigs of today may (sometimes unintentionally) apply 5 or 6 weights to a single vertex or contain hundreds of bones for a large compilation scene, which means invalid or impossible imports of this animation data.
One CPU-based approach to dealing with an arbitrary number of weights is to pre-multiply each vertex by all of the bones that it is bound to; effectively creating multiple partial vertices that eventually will be summed together when a specific frame is being constructed.
Unfortunately without 1-N or N-1 support within a GPU vertex shader, it becomes nearly impossible to repeat this functionality. That kind of support only seems to be available in more advanced API’s such as DirectX 11 (maybe 10). Since there are still games that are being designed for fixed-function pipelines, I am assuming that DirectX 11 will not reach critical mass for some time.
Is there a better way to the current approach to bone animation? It feels like animation has peaked until we reach another generational leap, such as Larabee or some other CPU/GPU hybrid.