----
#contents
----

*Fl_Gl_Windowの派生クラスによるOpenGL描画 [#pcc129c1]
OpenGLを描画するウィンドウを作成したい場合は,
[[Fl_Gl_Window:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html]]
の派生クラスを作り,draw関数をオーバーライドしてOpenGL描画命令を記述すればよい.
キーボードやマウス入力を扱う場合はhandle関数をオーバーライドする
(こちらは[[Fl_Gl_Windowでのキーボード・マウス入力]]参照).

***インクルードとライブラリファイル [#af4cdbcf]
インクルードファイルは以下.
 #include <FL/Fl_Gl_Window.H>
ライブラリファイルは,Releaseの場合,
 fltkgl.lib
Debugの場合,
 fltkgld.lib

***Fl_Gl_Window派生クラスの生成 [#z9d51cc1]
Fl_Gl_Windowを派生したクラス(ここではrxFlGLWindowとする)を作る.
#code(C){{
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:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#a2250b48ed4de1541aac6253b3e02a3d6]]関数, 
[[Fl_Gl_Window::resize:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#aff3bb62b9ce1d0c35c3df085bb21da92]]関数をオーバーライドしている.
それぞれ,ウィンドウ再描画時,ウィンドウリサイズ時に呼ばれるイベントハンドラである.
そして,public関数のInitGL,Resize,Displayはそれぞれ,OpenGL初期化,視体積設定,描画を行う関数で,draw,resize関数から呼ばれる.

[[draw:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#a2250b48ed4de1541aac6253b3e02a3d6]]関数の例は以下,
#code(C){{
void rxFlGLWindow::draw(void)
{
	if(!context_valid()) InitGL();
	if(!valid()) Resize(w(), h());

	Display();	// OpenGL描画
}
}}
[[context_valid():http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#af928eefbfe4244068ef1e2c41256cac9]]
はOpenGLコンテキストの生成フラグを返す.
OpenGLコンテキストが生成されたときにフラグが0となり,draw関数が呼ばれた後に自動的に1に設定される.
フラグは以下のように手動で設定することもできる.
 context_valid(1);
context_valid()の値をチェックして,OFF(=0)ならばOpenGL初期化を行う.

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

[[resize:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#aff3bb62b9ce1d0c35c3df085bb21da92]]関数の例は以下,
#code(C){{
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引数を取り,ウィンドウリサイズ時に呼ばれる.
リサイズ処理をこちらに書いても良い.

***エントリ関数 [#vca1faf2]
main関数の例は以下,
#code(C){{
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:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#a39e19bba95c76952c14c5981e52b5722]]関数によりOpenGL capabilityを設定している
(OpenGL capabilityの設定は[[ここ:http://www.slis.tsukuba.ac.jp/~fujis/cgi-bin/wiki/index.php?FLTK#u751a447]]参照).
(OpenGL capabilityの設定は[[ここ>FLTK#u751a447]]参照).


***再描画/フレームバッファ関連の関数 [#e877a76a]
再描画のための関数は以下.これらの関数は基本的にはdraw関数外で使われる.
-[[Fl_Widget::redraw:http://www.fltk.org/doc-1.3/classFl__Widget.html#aa63ce68cbf4620cf8750b868368ea02b]] : 
ウィジットの再描画がスケジューリングされる.つまり,glutPostRedisplay()と同じ役割.redraw()が呼ばれた関数が終了後,再描画される.
-[[Fl_Gl_Window::redraw_overlay:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#ae761ac18430e9e172ca5550c0e0d963a]] : 
オーバーレイ描画用のredraw

draw関数内で用いるフレームバッファ処理関数は以下.
-[[Fl_Gl_Window::flush:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#afc1f3b65a2d872fd21049749179a8f2f]] : 
フレームバッファの強制フラッシュ(フレームバッファの内容をウィンドウに描画)
-[[Fl_Gl_Window::swap_buffers:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html#a087a8ce705b389453188207ee0487677]] : 
ダブルバッファ時のフロント,バックバッファの入れ替え


***ソースコード [#qbaaa04e]
上記例のソースコードは以下(Viual Studio 2010用プロジェクトファイル含む).
#ref(fltk_simple_opengl.zip)

実行結果は以下.
#ref(fltk_opengl_window2.jpg,,50%)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS