Fl_Gl_Window以外のFLTKウィンドウでOpenGLを使う

Fl_Gl_Window以外でもgl_startとgl_finish関数を用いて,OpenGL描画を行うことができる.

手順

まず,gl.hをインクルードする.

#include <FL/gl.h>

GLフォルダに入れてある場合は GL/gl.h.

Fl::visual の代わりに Fl::gl_visual を使ってウィンドウグラフィックスを設定する.

Fl::gl_visual(FL_RGB);

そして,draw関数内で gl_startgl_finish 関数で囲んだ中にOpenGL命令を記述する.例えば,

void draw(void)
{
	gl_start();
	// OpenGLコード
	gl_finish();
}

注意点

  • Fl::gl_visualでウィンドウグラフィックスを設定しなければならない.
  • Fl::gl_visualにはFL_DOUBLEは渡せない.
  • Fl_Double_WindowFl_Overlay_Windowには使えない.
  • Fl_Gl_Windowの描画中にgl_start,gl_finishを呼び出してはならない.

コード例

以下にコード例を示す.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
#ifdef _DEBUG
#pragma comment(lib, "fltkd.lib")
#pragma comment(lib, "fltkgld.lib")
#else
#pragma comment(lib, "fltk.lib")
#pragma comment(lib, "fltkgl.lib")
#endif
 
#pragma comment(lib, "opengl32.lib")
 
 
//-----------------------------------------------------------------------------
// インクルードファイル
//-----------------------------------------------------------------------------
#include "FL/Fl.H"
#include "FL/Fl_Window.H"
 
#include "FL/gl.h"
 
//-----------------------------------------------------------------------------
//! rxTestWindow クラス
//-----------------------------------------------------------------------------
class rxTestWindow : public Fl_Window
{
public:
    //! コンストラクタ
    rxTestWindow(int x_, int y_, int w_, int h_, const char *l_ = 0)
         : Fl_Window(x_, y_, w_, h_, l_)
    {
        resizable(this);    // ウィンドウリサイズを可能に
        end();
    }
 
    //! デストラクタ
    virtual ~rxTestWindow()
    {
    }
 
private:
     //! 再描画イベント処理関数
    void draw(void)
    {
        int w = Fl_Window::current()->w();
        int h = Fl_Window::current()->h();
        
        gl_start();
 
        glViewport(0, 0, w, h);
 
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, 1, 0, 1, -1, 1);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glPushMatrix();
        glDisable(GL_LIGHTING);
 
        glColor3d(0.0, 0.0, 1.0);
        glBegin(GL_POLYGON);
        glVertex2d(0.1, 0.1);
        glVertex2d(0.9, 0.1);
        glVertex2d(0.5, 0.9);
        glEnd();
 
        glPopMatrix();
 
        gl_finish();
    }
 
};
 
//-----------------------------------------------------------------------------
// メイン関数
//-----------------------------------------------------------------------------
/*!
 * メインルーチン
 * @param[in] argc コマンドライン引数の数
 * @param[in] argv コマンドライン引数
 */
int main(int argc, char *argv[])
{
    Fl::scheme("gtk+");
 
    // gl_startを用いる場合はvisualの代わりにgl_visualを使う
    Fl::gl_visual(FL_RGB);
 
    rxTestWindow *window = new rxTestWindow(100, 100, 480, 480, "FLTK + OpenGL");
    window->show(argc, argv);
    return Fl::run();
}

描画結果は以下.

fltk_opengl_window1.jpg

添付ファイル: filefltk_opengl_window1.jpg 1012件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-11-11 (金) 23:22:38 (3189d)