----
#contents
----

**Fl_Gl_Window以外のFLTKウィンドウでOpenGLを使う [#ob0a342b]
Fl_Gl_Window以外でもgl_startとgl_finish関数を用いて,OpenGL描画を行うことができる.

***手順 [#r3175095]
まず,[[gl.h:http://www.fltk.org/doc-1.3/gl_8h.html]]をインクルードする.
 #include <FL/gl.h>
GLフォルダに入れてある場合は GL/gl.h.

[[Fl::visual:http://www.fltk.org/doc-1.3/classFl.html#a6d6deb3d4f76b538d508b36700dfb6b0]]
の代わりに
[[Fl::gl_visual:http://www.fltk.org/doc-1.3/classFl.html#a3d21e87ef889306a7be56e94ea0bda10]]
を使ってウィンドウグラフィックスを設定する.
 Fl::gl_visual(FL_RGB);

そして,draw関数内で
[[gl_start:http://www.fltk.org/doc-1.3/gl_8h.html#a9c922d784b80b39b0e64c8f4cfb5d123]]
と
[[gl_finish:http://www.fltk.org/doc-1.3/gl_8h.html#ae459013025f0e487fa75dee3ff738659]]
関数で囲んだ中にOpenGL命令を記述する.例えば,
 void draw(void)
 {
 	gl_start();
 	// OpenGLコード
 	gl_finish();
 }

***注意点 [#g53e6ba0]
-Fl::gl_visualでウィンドウグラフィックスを設定しなければならない.
-Fl::gl_visualにはFL_DOUBLEは渡せない.
-[[Fl_Double_Window:http://www.fltk.org/doc-1.3/classFl__Double__Window.html]]と
[[Fl_Overlay_Window:http://www.fltk.org/doc-1.3/classFl__Overlay__Window.html]]には使えない.
-[[Fl_Gl_Window:http://www.fltk.org/doc-1.3/classFl__Gl__Window.html]]の描画中にgl_start,gl_finishを呼び出してはならない.

***コード例 [#s94807aa]
以下にコード例を示す.
#code(C){{
#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/Fl.H"
#include "FL/Fl_Window.H"

#include<FL/gl.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();
}
}}



描画結果は以下.
#ref(fltk_opengl_window1.jpg,,50%)

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