запилил за пол дня супер легковесный 2д движок на опенгл 2 контексте, без матриц (как тебе нужно), можно вращать, правда на цпу. Еще можно выводить отдельные части текстуры (атлас), еще батчи есть.
Репо
https://bitbucket.org/pozitiffcat/ste
Умеет только TGA со сжатием или без. Можно расширять своими классами для загрузки файлов и конвертирование изображений. Так сказать движок открыт для расширений.
Делал для себя (вчера понял что надо сделать), чтоб легко писать под ios, android. Собирается на mac и linux посредством cmake
есть скрипт сборки для линукса. Соберет статически либу и тестовое приложение.
В убунте нужно sudo apt-get install freeglut3-dev
Библиотека работает на контексте, тоесть можно собрать без GLUT и внедрять в любой контекст, Qt, Android, iOS, SDL и т.п.
пример кода:

#include "steGlutApp.h"
#include "steRender.h"
#include "steImage.h"
#include "steFileStream.h"
#include "steTGAImageLoader.h"
#include "steDrawImageData.h"
#include "steBatch.h"
class MyApp : public ste::GlutApp
{
public:
virtual void onInit()
{
m_render = createRender();
m_render->setScreenSize(240, 320);
m_render->setClearColor(0.3f, 0.4f, 0.5f);
m_imageLoader = new ste::TGAImageLoader();
m_stream = new ste::FileStream("test_c.tga", ste::FileOpenReadMode);
m_image = m_render->createImage(m_imageLoader, m_stream);
}
virtual void onFrame()
{
m_render->clear();
static float r = 0;
r += 0.01;
ste::Batch batch;
ste::DrawImageData data;
data.frame = ste::rect(0.5 ,0.5, 0.5, 0.5);
data.size = ste::vec2(100, 100);
data.position.x = 50;
data.position.y = 100;
data.center.x = 0.5;
data.center.y = 0.5;
data.centerIsDrawPoint = true;
data.rotation = r;
batch.addImage(data);
data.frame = ste::rect(0 ,0.5, 0.5, 0.5);
data.position.x = 50;
data.position.y = 200;
data.center.x = 0.0;
data.center.y = 0.0;
data.rotation = 0;
batch.addImage(data);
m_render->drawImage(m_image, &batch);
}
virtual void onClose()
{
delete m_render;
delete m_image;
delete m_imageLoader;
delete m_stream;
}
private:
ste::Render *m_render;
ste::Image *m_image;
ste::TGAImageLoader *m_imageLoader;
ste::FileStream *m_stream;
};
int main()
{
MyApp app;
app.init(240, 320);
app.start();
return 0;
}