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とする)を作る.

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関数の例は以下,

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関数の例は以下,

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関数の例は以下,

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 1787件 [詳細] filefltk_simple_opengl.zip 1562件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-03-08 (金) 18:06:03