---- #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%)