Nothing dramatic has happened here since vertex shaders came around in OGL2. You don’t have to do the skinning on the CPU anymore. In OGL2 you could upload your bones into a [icode]uniform mat4[64] array[/icode] or something like that to get access to it. In OGL3+ you can upload as many skeletons as you want to a single buffer using a (supposedly) faster glMapBufferRange() call and then access it from your vertex shader as a texture buffer object. That means that you can do instancing and skinning at the same time, which is pretty neat.