[Closed] Hardware Skinning – How difficult to do?
Hi all,
I find the skinning performance being really bad in Max (Maya and XSI are not doing better there also). Actually I’m wondering how today’s animators are dealing with the high poly count while keeping a reasonable framerate to animate with. Yes there is a way to workaround these issues. You can build low poly versions or rigid body proxies to enhance the framerate, but is this really the way to go? I don’t think so because it takes time to do that and you will also not have the exact same result in the final version. So there has to be a better way.
Actually what I really don’t understand is how game engines are performing with hardware skinning while 3d applications like Max, Maya and XSI are still stucked on the same old level using the CPU only to perform the skinning. There is so much potential in getting much higher framerates when using hardware skinning.
So why not create a way using the GPU for skinning performance? I think some kind of “TurboSkin” Modifier for Max would be a great deal. This modifier could adopt the skin weights created in the Skin Modifier (so the Skin Modifier is not being changed at all and still used for skinning creation) and perform hardware skinning which results in much better viewport performances and framerates.
What do you think about that idea and how difficult would that be to achieve?
Well depends which skinning you are looking for. Linear skinning is a fairly easy algorithm. The problem why it slows down in Max and other DCCs is due to the poly count. Most engines (take our CryEngine for example) use only 4 bones/vert weight limit. Also, keep in mind, that if you are doing high-poly characters, you need lots and lots of helper joints to create good and believable deformations. Not to mention possible uses of skinWrap, Skin morphs, etc etc. Most game characters are only around 20k/30k polygons, which also reduces the skin calculations. The difficulty in writing a hardware skinning tool is probably pretty serious as you would need to REALLY know what you are doing. I would say, stick to the current tricks in the industry as most of them have been tested for quite a while. New technologies (such as this one, even being a plugin, and not a whole engine) take a seriously long time to develop, test, and make fully usable. I would suggest strongly against it.
I’m looking for linear skinning only, no morphs, no extra deformations, not anything more. We are creating all extra deformations and secondary motion with bones only, so linear skinning is just right.
I am aware of the upcoming problems when adding more and more details. But 20.000 to 30.000 polys for a game character sound pretty much to me. I don’t know any game character that uses more than 15.000 polys actually. Even the main character of Gears of War has only about 12.000 polys. This is also our maximum poly count for game characters now, but in cutscenes with 4 or 5 characters, the framerate can slow down to 12 fps or lower which is a headache for an animator.
So you have been talking about using the current tricks in the industry. Is there any trick I’m not aware of besides low poly versions, rigid body proxies, point caching and of course a good computer?
To quote Richard Diamant from his interview from here “All of the main characters are in the 25k to 30k range. The pirates and other secondary characters max out at around 15k.”
In terms of tricks, it seems the main ones you already know, so I can’t really suggest much. But if you want to, and you are profficient in writing plugins in C++ for Max, there are quite a few papers online for the linear skinning algorithm. Shouldn’t be overly hard, maybe contact Autodesk and see if they will give your company their Skin source code to modify for your own needs. But then if you get that far, I would be researching more interesting skinning solutions such as Spherical and Dual Quaternion Skinning. But those are pretty damn difficult to implement, so I don’t know what you are looking forward to in terms of the challange. I would in no way attempt to do it on my own during a project. As a home project, maybe, but I don’t really know C++ yet (just started learning it).
Well, I can’t do C++ either, rather hoping that Autodesk will implement such a feature sometime, or maybe a plugin developer will get the idea.
About the “Uncharted” characters, I think 30.000 polys for a game character is exaggerated for today’s games. In my opinion the characters in Uncharted don’t look so good, and that’s just because of the high poly count. The problem is the more polys you take, the more artifacts and ugly areas you’ll get. Handling these issues with a real-time engine today is almost impossible to do. Furthermore, often there are other more important things unconsidered like nice shadows, believable animation and depth. There is the trend that people think they’ll get more realistic characters by adding more polys, which is not true in my opinion. Even the opposite is true in most cases and with the current techniques. I mean what’s the deal about having 30.000 polys but ugly elbow and shoulder deformations and lighting issues like in “Uncharted”?
Anyway, the 30.000 poly count make me even more wondering how they deal with that. I would expect to have a good framerate in a cutscene with 3 or 4 12.000 poly characters in Max.
Well to be honest with you, I do not agree. Uncharted is a really nice looking game, and they use plenty of awsome set-ups for the deformation issues. The lighting is also pretty decent, and the less polys, the less problems theory is excellent, untill you need actually good dynamics simulations, facial anims, etc. I see uncharted anims as a great achievement in their game as well. And I do not understand what you find wrong with their chars??? They have a really nice look to them.
I greatly appreciate your thoughts. I also think there are nice shots from Uncharted.
However, maybe these screenshots are not up-to-date, but it’s what I’ve found in google:
Here you can see skin deformations that don’t look so wrong, but the lighting does a good job in making them to look ugly. On the ground there are important shadows missing. Some areas look like a game 10 years old. The overall lighting shows artifacts that kill the overall impression.
Lots of artifacts and lighting issues on her. Often there are little areas that are shining like the inside of the mouth, teeth or nostrils. That’s because there are so many polys that receive lighting and fill the character with ugly artifacts.
Crappy shadows and ugly cloth deformations. Also the pose and expression of the characters looks wrong.
The game is full of those issues. In my opinion they kill the overall look of the characters. Plastic look is a good point here also. The use of specular maps and complex shaders is nice, but you need to know how to use them. If not, it will just look wrong and no better at all.
I have seen all these issues in other today’s games as well like Mass Effect and Oblivion. Have a look at Mafia for example. It’s an old game but the overall impression of the characters, the sympathy, look and feel is much better than in most other games today. And they are using a fraction of the poly count.
Yea, I can deffinately see what you are getting at. But I would rather blame the engine processing on that rather then the poly count. It seems that their rendering and lighting systems are just not doing everything they way that should. When I played it a bit, I did notice some REALLY weird artifacts. I think some were still gone, compared to what you found on google, but yea, some still were there. But still, their animation and acting was excellent in my opinion. Really really cliche, but still very nice.
I have to agree with Dimich, the biggest hit is game dev at the minute is shaders. Unreal can push around several 100,000 polys in the scene, but having lots of shaders and textures can kill the pipe to any engine. I’ve looked at implementing spherical blend skinning in max, and the math is pretty tricky – also the only real way it could be done unless you use c++ is a pass that ‘fixes’ the linear skining pops. But this then turns your mesh in a delta essentially. Remember its all a trick, making something looking old and dirty is going to hide a lot of the common bugs. Something space age is going to be more critical. Remember too that your sending a mesh thats skinned in max to an engine – that is trying to aproximate that skinning as close as possible. This disparidgement will alway cause problems. GPU skinning is great for one character – but if you have 30 it just wont work. Its the hardest battle in the end – making the engine look like the same result your getting in your toolset. Its why a lot of toolsets are infact the engine – there viewport is the engine viewport.
In theory if you wanted max to get a close as possible you’d have to make a viewport engine that is your game engine – so what you see in your toolset is what you get in engine.
That is the point. Where a big issue in game development is lighting and shaders, it is also the polycount at the same time. They are effecting each others in terms of the overall look. Using a large amount of polys while not handling the lighting and shaders correctly will produce artifacts like seen in Uncharted. So either you fix the lighting issue or you use fewer polys to have better control over your meshes.
The problem is like seen here (Mass Effect):
The more definition you give to your character, the less imagination the player will have. So the character design has to be pretty much perfect, which is nearly impossible to do with the current techniques. Today most characters in games look like puppets. In earlier games, you couldn’t call them puppets because they have not been something specific, it rather took your imagination to push the character in the direction it was meant to be, like a rough silhouette where you recognize a person you know. So they have had more sympathy. I think the way most characters in highend-games like Mass Effect, Gears of War, any Unreal 3 Engine title or Oblivion look like is not very attractive for non-gamers or even casual gamers.
I’m not looking for a wysiwyg viewport, actually I’m already having one with oFusion. I’m just looking for a better performance while animating cutscenes in Max.
eek, what do you mean with “GPU skinning is great for one character – but if you have 30 it just wont work”?