You'll want to look at SpriteBatchSpriteBatch
then which basically involves deferring any actual GPU draw calls until all the drawing has been completed and ready to be flushed to the GPU bugger. This is a very common approach to draw 100s or even 1000s of sprites on a screen at once without negative implications on the frame rate. There's a lot of different ways to implement SpriteBatching so I'll leave the exact implementation in OpenGL to you, but in a lot of implementations I've seen (MonoGame, Direct X ToolkitDirect X Toolkit) the 'Begin'Begin
function of the SpriteBatchSpriteBatch
will take a transform view matrix (which will translate, rotate and scale the sprites). iI suggest you look at the implementations I've linked to and derive your own. MonoGame has OpenGL components which will probably be of use to you.