Fl_Gl_Windowの派生クラスによるOpenGL描画

OpenGLを描画するウィンドウを作成したい場合は, Fl_Gl_Window の派生クラスを作り,draw関数をオーバーライドしてOpenGL描画命令を記述すればよい. キーボードやマウス入力を扱う場合はhandle関数をオーバーライドする (こちらはFl_Gl_Windowでのキーボード・マウス入力参照).

インクルードとライブラリファイル

インクルードファイルは以下.

#include <FL/Fl_Gl_Window.H>

ライブラリファイルは,Releaseの場合,

fltkgl.lib

Debugの場合,

fltkgld.lib

Fl_Gl_Window派生クラスの生成

Fl_Gl_Windowを派生したクラス(ここではrxFlGLWindowとする)を作る.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
class rxFlGLWindow : public Fl_Gl_Window
{
public:
    //! コンストラクタ
    rxFlGLWindow(int x_, int y_, int w_, int h_, const char* l) 
        : Fl_Gl_Window(x_, y_, w_, h_, l)
    {
    }
    
public:
    void InitGL(void);
    void Resize(int w, int h);
    void Display(void);
 
private:
    void draw(void)
    void resize(int x_, int y_, int w_, int h_);
};

Fl_Gl_Window::draw関数, Fl_Gl_Window::resize関数をオーバーライドしている. それぞれ,ウィンドウ再描画時,ウィンドウリサイズ時に呼ばれるイベントハンドラである. そして,public関数のInitGL,Resize,Displayはそれぞれ,OpenGL初期化,視体積設定,描画を行う関数で,draw,resize関数から呼ばれる.

draw関数の例は以下,

  1
  2
  3
  4
  5
  6
  7
void rxFlGLWindow::draw(void)
{
    if(!context_valid()) InitGL();
    if(!valid()) Resize(w(), h());
 
    Display();    // OpenGL描画
}

context_valid() はOpenGLコンテキストの生成フラグを返す. OpenGLコンテキストが生成されたときにフラグが0となり,draw関数が呼ばれた後に自動的に1に設定される. フラグは以下のように手動で設定することもできる.

context_valid(1);

context_valid()の値をチェックして,OFF(=0)ならばOpenGL初期化を行う.

一方, valid() はOpenGLコンテキストリサイズフラグを返すため, valid()の返値をチェックして,OFF(=0)ならばリサイズ処理(OpenGL視体積設定など)を行う. valid()はOpenGLコンテキストが生成されたとき,および,リサイズされたときにフラグOFF(返値が0)となり, draw関数が呼ばれた後に自動的にフラグON(返値が1)になる. フラグは以下のように手動で設定することもできる.

valid(1);

resize関数の例は以下,

  1
  2
  3
  4
  5
void rxFlGLWindow::resize(int x_, int y_, int w_, int h_)
{
    Fl_Gl_Window::resize(x_, y_, w_, h_);
    //Resize(w_, h_);    // リサイズ処理はこちらにおいてもよい.
}

ウィンドウ位置x,y, サイズw,hの4引数を取り,ウィンドウリサイズ時に呼ばれる. リサイズ処理をこちらに書いても良い.

エントリ関数

main関数の例は以下,

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
int main(int argc, char *argv[])
{
    Fl::scheme("gtk+");
    Fl::visual(FL_DOUBLE | FL_RGB);
    Fl::get_system_colors();
 
    glutInit(&argc, argv);    // GLUTを初期化(glutSolidTeapotを使うため)
 
    rxFlGLWindow *window = new rxFlGLWindow(100, 100, 480, 480, "FLTK + OpenGL");
    window->mode(FL_RGB | FL_ALPHA | FL_DOUBLE | FL_DEPTH);
    window->end();
    window->show(argc, argv);
    return Fl::run();
}

rxFlGLWindowウィンドウを生成した後, mode関数によりOpenGL capabilityを設定している (OpenGL capabilityの設定はここ参照).

再描画/フレームバッファ関連の関数

再描画のための関数は以下.これらの関数は基本的にはdraw関数外で使われる.

  • Fl_Widget::redraw : ウィジットの再描画がスケジューリングされる.つまり,glutPostRedisplay()と同じ役割.redraw()が呼ばれた関数が終了後,再描画される.
  • Fl_Gl_Window::redraw_overlay : オーバーレイ描画用のredraw

draw関数内で用いるフレームバッファ処理関数は以下.

  • Fl_Gl_Window::flush : フレームバッファの強制フラッシュ(フレームバッファの内容をウィンドウに描画)
  • Fl_Gl_Window::swap_buffers : ダブルバッファ時のフロント,バックバッファの入れ替え

ソースコード

上記例のソースコードは以下(Viual Studio 2010用プロジェクトファイル含む).

実行結果は以下.

fltk_opengl_window2.jpg

添付ファイル: filefltk_opengl_window2.jpg 1093件 [詳細] filefltk_simple_opengl.zip 1045件 [詳細]

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