tiny dots

裏方の日々

ofThread 内で OpenGL 系の処理をしたい

OpenGL か oF の制約かまだ理解が十分ではないけど、基本 OpenGL コンテキストがメインスレッドに縛られていて、マルチスレッドで画像処理してイベント飛ばして完了通知みたいなことが普通はできない。
うおーっと身悶えていたら世界の比嘉先生が救いの手を差し伸べてくれました。

やりたかったことはアルファチャンネル付きの複数の画像を合成してリサイズするっていう処理だったんですが、お陰様々で事なきを得ました。。
addon 化したのでご自由にお使いください。 ※要 ofxOpenGLContextScope

ofxCompositeImage

こんな感じで使います。

ofImage myImage;

using namespace ofxCompositeImage;

void testApp::setup()
{
    ofImage layer1("layer1.png");
    ofImage layer2("layer2.png");
    ofImage layer3("layer3.png");

    // 出力画像の width / height / backgroundColor
    Setting setting(layer1.getWidth(), layer1.getHeight(), ofColor(255));
    
    // レイヤーごとに x / y / width / height を設定
    Material m1(layer1, 0, 0, layer1.getWidth(), layer1.getHeight());
    Material m2(layer2, 0, 0, 100, 100);
    Material m3(layer3, 200, 50, 100, 100);
    
    vector<Material> materials;
    materials.push_back(m1);
    materials.push_back(m2);
    materials.push_back(m3);
    
    Composer composer;
    ofAddListener(composer.compositionComplete, this, &testApp::compositionComplete);
    
    // Material の配列と Setting をつっこむ
    composer.addLayers(materials, setting);
}

void testApp::draw()
{
    if (myImage.isAllocated())
    {
        myImage.draw(0, 0);
    }
}

void testApp::compositionComplete(ofImage &img)
{
    ofLog() << "composition completed";
    myImage = img;
}

最近少しずつ OpenGL の理解を進めてるけど、まだまだ先が長い、、