Help us understand the problem. What is going on with this article?

マルチウィンドウ間で映像を共有する

More than 3 years have passed since last update.

更新履歴
10/24:文言のアップデート

 openFrameworksのv0.9.0から、マルチウィンドウが標準機能で実装できるようになりました。さらに、マルチウィンドウにおいて、ofFboのテクスチャを共有することが可能です。

マルチウィンドウについては以下のExampleをチェック

  • events/multiWindowExample
  • events/multiWindowOneAppExample

ofFboのテクスチャを共有するには

 さて、テクスチャ共有は簡単です。ウィンドウのセッティングに一行追記するだけで実現できます。
以下のソースは、GUIウィンドウとメインウィンドウを作成。GUI側で読み込んだmovファイルをメインウィンドウ側でも描画したものです。

マルチウィンドウ設定

サブウィンドウにsettings.shareContextWith = mainWindow;を追記

main.cpp
int main( ){

    ofGLFWWindowSettings settings;

    settings.width = 1280;
    settings.height = 720;
    settings.setPosition(ofVec2f(600, 0));
    settings.resizable = true;
    shared_ptr<ofAppBaseWindow> mainWindow = ofCreateWindow(settings);

    settings.width = 640;
    settings.height = 360;
    settings.setPosition(ofVec2f(0,0));
    settings.resizable = false;
    settings.shareContextWith = mainWindow;
    shared_ptr<ofAppBaseWindow> guiWindow = ofCreateWindow(settings);

    shared_ptr<ofApp> mainApp(new ofApp);
    shared_ptr<GuiApp> guiApp(new GuiApp);
    mainApp->gui = guiApp;

    ofRunApp(guiWindow, guiApp);
    ofRunApp(mainWindow, mainApp);
    ofRunMainLoop();
}

サブウィンドウ側

サブウィンドウ側では、映像ファイルをロードしfboに格納

guiApp.h
    ofVideoPlayer layer;
    ofFbo fbo;
guiApp.cpp
void GuiApp::setup(){
    layer.load("clips/01.mov");
    layer.play();
    fbo.allocate(1280, 720, GL_RGB32F_ARB);
}

void GuiApp::update(){
    layer.update();
    fbo.begin();
    layer.draw(0, 0, 1280, 720);
    fbo.end();
}

void GuiApp::draw(){
    fbo.draw(0, 0, 128, 72);
}

メインウィンドウ側

 メインウィンドウ側からfboのテクスチャーを呼び出し描画

ofApp.cpp
void ofApp::draw(){
    gui->fbo.getTexture().draw(0, 0, ofGetWidth(), ofGetHeight());
}

 サブウィンドウにGUIとFboのテクスチャ、メインウィンドウ側でFboのテクスチャを読み出します。

 これで、サブウィンドウでソースを確認しつつ、メインウィンドウ側のmovファイルの透明度を操作するということが可能になります。
out.gif

y_UM4
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away