2010-09-28 59 views
4

簡單和短:什麼是最先進的OpenGL的GTK +綁定? 我寧願使用類似於QGLWidget的小部件。GTK +和OpenGL綁定

注:我偶然發現gtkglext,gtkglarea和混亂。我讀了前兩個有缺點/嚴重問題。

+1

他們似乎都被activly發達,發佈在2009年和2010年,而最近的活動(http://git.gnome.org/browse/gtkglext/,http://git.gnome.org/browse/gtkglarea /)哪一個更喜歡,但我不能判斷 - 但我不會判斷它是如何最近一個版本.. – nos 2010-09-28 18:50:43

+0

gtkglext有一個專門的方面,告訴我這是2006年。也許這是谷歌谷歌-voodoo從被覆蓋的位保留刪除的一面。 QUestion編輯相應。 – drahnr 2010-09-28 18:57:12

回答

4

更新:

由於Gtk+-3.16任何超越做使用任何的下方!

如果你想用藝術的當前狀態,頂點/像素着色器,你應該使用最新的GNOME和依靠其上限:

廣泛報道了https://www.bassi.io/articles/2015/02/17/using-opengl-with-gtk/


好,我經歷了2小時以來讀取幾乎和我的結果是:

  • gtkglext將完全地替代由OpenGL的後端,這不是我的本意
  • 雜波有盒裝入對象的所有本地GL電話和不支持本機GL在所有來電,雖然它提供了許多predifened過濾器和有趣的東西
  • gtkglarea顯得精緻,它的設計是可愛的。它在Qt的用法相同風格QGLWidget來繪圖(只要我能說的)simple demo of gtkglarea

    #include <math.h> 
    #include <gtk/gtk.h> 
    #include <GL/gl.h> 
    #include <gtkgl/gtkglarea.h> 
    
    int init (GtkWidget *widget) 
    { 
    if (gtk_gl_area_make_current (GTK_GL_AREA(widget))) 
        { 
        glViewport(0,0, widget->allocation.width, widget->allocation.height); 
        glMatrixMode(GL_PROJECTION); 
        glLoadIdentity(); 
        glOrtho(0,100, 100,0, -1,1); 
        glMatrixMode(GL_MODELVIEW); 
        glLoadIdentity(); 
        } 
    
    return TRUE; 
    } 
    
    int draw (GtkWidget *widget, GdkEventExpose *event) 
    { 
    if (event->count > 0) return TRUE; 
    
    if (gtk_gl_area_make_current (GTK_GL_AREA(widget))) 
        { 
        glClearColor(0,0,0,1); 
        glClear(GL_COLOR_BUFFER_BIT); 
        glColor3f(1,1,1); 
        glBegin(GL_TRIANGLES); 
        glVertex2f(10,10); 
        glVertex2f(10,90); 
        glVertex2f(90,90); 
        glEnd(); 
        gtk_gl_area_swap_buffers (GTK_GL_AREA(widget)); 
        } 
    
    return TRUE; 
    } 
    
    int reshape (GtkWidget *widget, GdkEventConfigure *event) 
    { 
    if (gtk_gl_area_make_current (GTK_GL_AREA(widget))) 
        glViewport(0,0, widget->allocation.width, widget->allocation.height); 
    
    return TRUE; 
    } 
    
    int main (int argc, char **argv) 
    { 
    GtkWidget *window, *glarea; 
    
    int attrlist[] = { 
    GDK_GL_RGBA, 
    GDK_GL_RED_SIZE,1, 
    GDK_GL_GREEN_SIZE,1, 
    GDK_GL_BLUE_SIZE,1, 
    GDK_GL_DOUBLEBUFFER, 
    GDK_GL_NONE }; 
    
    gtk_init (&argc, &argv); 
    if (gdk_gl_query() == FALSE) return 0; 
    
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title (GTK_WINDOW(window), "Simple"); 
    gtk_container_set_border_width (GTK_CONTAINER(window), 10); 
    g_signal_connect (window, "delete_event", 
    G_CALLBACK (gtk_main_quit), NULL); 
    
    /* You should always delete gtk_gl_area widgets before exit or else 
        GLX contexts are left undeleted, this may cause problems (=core dump) 
        in some systems. 
        Destroy method of objects is not automatically called on exit. 
        You need to manually enable this feature. Do gtk_quit_add_destroy() 
        for all your top level windows unless you are certain that they get 
        destroy signal by other means. */ 
    
    gtk_quit_add_destroy (1, GTK_OBJECT(window)); 
    
    glarea = GTK_WIDGET(gtk_gl_area_new (attrlist)); 
    gtk_widget_set_size_request (GTK_WIDGET(glarea), 100, 100); 
    
    gtk_widget_set_events (GTK_WIDGET(glarea), GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK); 
    
    g_signal_connect (glarea, "expose_event", G_CALLBACK(draw), NULL); 
    g_signal_connect (glarea, "configure_event", G_CALLBACK(reshape), NULL); 
    g_signal_connect (glarea, "realize", G_CALLBACK(init), NULL); 
    
    gtk_container_add (GTK_CONTAINER(window), GTK_WIDGET(glarea)); 
    gtk_widget_show (GTK_WIDGET(glarea)); 
    gtk_widget_show (GTK_WIDGET(window)); 
    
    gtk_main(); 
    return 0; 
    } 
    

注:gtkglarea仍具有退出(至少1.99)

一些問題,如核心轉儲

注2:版本2.0.1修復了此問題

編輯:對於那些只尋求2D的人開羅似乎是最合適的。

+0

小部件自己將通過OpenGL呈現,因爲您可以從http://projects.gnome.org/gtkglext/輕鬆獲取它們 – drahnr 2012-07-10 16:57:02