Your fallback code draws the basic starlanes but no supply lines, no fleet supply lines and no fleet movement.
Well, yes... It wasn't intended to be the final version / to do everything.
Before I discovered the possibility to cheat with the GL version I started to write fallback code myself.
I'd rather have a portable solution than one that only works for OSX or that assumes there will be a software fallback GL implementation available.
Since InitStarlaneRenderingBuffers already collects the necessary data in temporary variables I created a template class derived from GLBuffer (GLClientBuffer<???>) that can store the collected data. I also moved all the GL version dependent stuff into class methods.
I like the overall idea. Would you be able to finish these changes?
The useAs2DVertexBuffer and useAsRGBAColorBuffer functions could use some reworking though, as (I think?) they make assumptions about the type or size of the contents of the c_data vector that doesn't get validated with the template type or what's actually been stored.
Might it be better to do a non-template versions of the float and unsigned char version of these classes, each of which only provide "useAs" functions that are compatible with their internal type...?
Also, why do you have the asBase function, rather than just doing public inheritance?
I have various other minor comments regarding the code, but they're not important yet...
I think the same method could be used to render the galaxy gas, too, but I have no idea how much performance that would cost.
Galaxy gas rendering can always be turned off the options if it gives poor frame rates.