gtkmm und opengl
-
Moin moin!
Habe mich jetzt schon eine gewisse Zeit in Gtkmm eingearbeitet und komme auch schon gut zurecht damit. Jetzt würde ich gerne OpenGL mit verwenden. Habe auch schon alles installiert wie gtkglext und gtkglextmm. Ich finde bloß keine geeigneten Beispiele für Anfänger. Kann mir einer bitte ein einfaches Beispiel geben. Z.B. wie man ein Dreick zeichnet! Dann könnte ich mir das mal anschauen. Würde mir sehr weiterhelfen.
Gruß!
shorty
-
Bitte sehr:
#include <gtkmm.h> #include <gtkglmm.h> #include <GL/gl.h> #include <GL/glu.h> class SimpleGLScene : public Gtk::DrawingArea, public Gtk::GL::Widget<SimpleGLScene> // Unser eigenes Widget mit dem OpenGL-Zeugs. { public: SimpleGLScene(); private: void on_realize(); bool on_configure_event(GdkEventConfigure* event); bool on_expose_event(GdkEventExpose* event); }; SimpleGLScene::SimpleGLScene() { Glib::RefPtr<Gdk::GL::Config> glconfig = Gdk::GL::Config::create( Gdk::GL::MODE_RGBA | // 32 bpp Gdk::GL::MODE_DEPTH | // Z-Buffer Gdk::GL::MODE_DOUBLE); // Doublebuffering if(!glconfig) // Etwas ist schiefgelaufen throw std::runtime_error("Cannot create visual"); set_gl_capability(glconfig); } void SimpleGLScene::on_realize() // Diese Funktion wird einmal am Anfang aufgerufen { Gtk::DrawingArea::on_realize(); // Die Funktion von der Gtk-Drawing-Area muss aufgerufen werden. Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); // Wir bekommen das Fenster auf dem wir zeichnen können if(!glwindow->gl_begin(get_gl_context())) // Beginnt mit OpenGL-Zeugs. return; glClearColor(1.0, 1.0, 1.0, 1.0); // Die Hintergrundfarbe auf weiß setzen glClearDepth(1.0); // Den Z-Buffer leeren glViewport(0, 0, get_width(), get_height()); // Den Viewport so verstellen, dass er die größe der DrawingArea hat. glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, static_cast<float>(get_width() / get_height()), 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glwindow->gl_end(); } bool SimpleGLScene::on_configure_event(GdkEventConfigure* event) // Diese Funktion wird z.B. beim Größe-Ändern aufgerufen { Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); if(!glwindow->gl_begin(get_gl_context())) return false; glViewport(0, 0, get_width(), get_height()); glwindow->gl_end(); return true; } bool SimpleGLScene::on_expose_event(GdkEventExpose* event) // Kann man vergleichen mit DrawGLScene von NeHe { // Wird aber nur aufgerufen wenn notwendig. std::cout << "." << std::flush; Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); if(!glwindow->gl_begin(get_gl_context())) return false; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -6.0f); glColor3ub(0,0,0); glBegin(GL_TRIANGLES); glVertex3f( 0.0f, 1.0f, 0.0f); // Top glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right glEnd(); glwindow->swap_buffers(); // Backbuffer zeichnen glwindow->gl_end(); return true; } class Simple : public Gtk::Window { public: Simple(); private: void on_button_quit_clicked(); Gtk::VBox m_VBox; SimpleGLScene m_SimpleGLScene; Gtk::Button m_ButtonQuit; }; Simple::Simple() : m_VBox(false, 0), m_ButtonQuit(Gtk::Stock::QUIT) { set_title("Simple"); set_reallocate_redraws(true); add(m_VBox); m_SimpleGLScene.set_size_request(200, 200); m_VBox.pack_start(m_SimpleGLScene); m_ButtonQuit.signal_clicked().connect(sigc::mem_fun(*this, &Simple::on_button_quit_clicked)); m_VBox.pack_start(m_ButtonQuit, Gtk::PACK_SHRINK, 0); show_all(); } void Simple::on_button_quit_clicked() { Gtk::Main::quit(); } int main(int argc, char** argv) { Gtk::Main kit(argc, argv); Gtk::GL::init(argc, argv); // gtkglextmm Simple simple; kit.run(simple); }
Compilieren geht mit:
g++ main.cpp `pkg-config gtkmm-2.4 gtkglextmm-1.2 --libs --cflags`
Der gtkglextmm-Code ist aus dem Simple-Example was beilag, der OpenGL-Code von NeHe.
mfg.
-
super sache!
danke dir!
wow, bin sprachlos! vielen vielen dank. sogar mit erklärungen.
das werde ich mir jetzt mal reinziehen!
nochmals danke!