2013年11月7日木曜日

OpenGLで超簡単なオフスクリーンレンダリング

やりたい事

やりたい事はタイトルの通り。 GLUTを使うとOpenGLを簡単に扱える反面、glutMainLoop()に全部制御を持って行かれてしまう。 FBO(frame buffer object)のような難しいものは触りたくない。 ウィンドウを表示せずにOpenGLで描いた画像を取得する方法を探しても意外と見つからなかったのでここにメモしておく。 要は、glutCreateWindow()関数を呼んでウィンドウを作る準備をしておけば、 バッファは利用可能な状態になっているようなので、 実際にウィンドウが表示されなくても描画したり、描画したものを画像として取得したりできるということ。 この方法だと複数のウィンドウも可能だけど、1つのウィンドウを表示してもう一つのウィンドウは表示しないということは出来ないかも。

サンプルコード

#include <gl/glut.h>
#include <opencv2/opencv.hpp>
 
void main(int argc, char *argv[])
{
    int w = 256;
    int h = 128;
    cv::Mat_<uchar> image(h, w);
    glutInit(&argc, argv);
    glutInitWindowSize(w, h);
    glutCreateWindow(argv[0]);
 
    //描画
    glClearColor(0.1, 0.1, 0.1, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glutSolidCube(0.5);
    glFlush();
 
    glReadPixels(0, 0, w, h, GL_RED, GL_UNSIGNED_BYTE, image.data);
 
    cv::imwrite("test.png", image);
}

出力画像