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!


Anmelden zum Antworten