【openFrameworks】GPUが適切なときだけ立体視用にQuadBufferStereo対応のglfwWindowを生成する

サンプルプロジェクト

GitHub: stereoWindowExampleOf

  • macで実行する場合はmacOS上でProjectGeneratorを使ってimportして、Xcodeプロジェクトを生成しビルドしてください

目的

  • openFrameworksライブラリを使って、立体(Stereoscopic)表示のためのウィンドウを生成する。
  • その上で、GPUがQuadBufferStereoに非対応の場合も、エラーで終了させずに単眼用のウィンドウを生成する。

環境

  • 立体視対応テスト環境
    • OS: Windows 10 Education
    • oF: of_v0.9.8_vs_release
    • GPU: Quadro 410
    • メガネ: 3D Vision
    • モニタ: 120Hz駆動できるもの
  • 立体視"非"対応テスト環境
    • OS: macOS 10.12.6(16G1114)Sierra
    • 機体: MacBookPro 13,3 (Late 2016)
    • oF: of_v0.9.8_osx_release
    • GPU: AMD Radeon Pro 460 (Intel HD Graphics 530)

コード

  • main.cpp
#include "ofMain.h"
#include "ofApp.h"

std::shared_ptr<ofAppGLFWWindow> getStereoGLFWWindow(ofGLFWWindowSettings &s) {

    auto glfwWindow = shared_ptr<ofAppGLFWWindow>(new ofAppGLFWWindow());

    ofLogNotice() << "Try to setup STEREO-mode window";
    s.stereo = true;
    glfwWindow->setup(s);
    //if get error, setup MONO-mode window
    if (glfwWindow->getWidth() == 0) {
        ofLogNotice() << "Try to setup MONO-mode window";
        s.stereo = false;
        glfwWindow->setup(s);
    }

    //add window to main loop for polling events
    ofGetMainLoop()->addWindow(glfwWindow);

    return glfwWindow;
}

//========================================================================
int main() {

    ofGLFWWindowSettings s;
    s.setPosition(ofVec2f(0, 0));
    s.width = 1280;
    s.height = 720;

    //get stereo-activated window if possible.
    auto glfwWindow = getStereoGLFWWindow(s); 

    std::shared_ptr<ofApp> app(new ofApp());

    ofRunApp(glfwWindow, app);
    ofRunMainLoop();
}

glGetBooleanv()でGL_STEREOを調べればよくない?

そうしたい気持ちもわかるし私もそれを先にやりました。
が、このglGetBooleanv()には落とし穴があって、実はglfwCreateWindow()を呼んだ後(GLコンテキストを生成した後?)でないと正しく機能しません(たしか)。

つまり、立体視機能を有効にしたウィンドウを生成すべきかどうか調べるには、ウィンドウを生成しなくてはならないという。。。
ウィンドウ生成前に判定したい今回のようなケースでは使えないということですね。

投稿者: hikatech