代码之家  ›  专栏  ›  技术社区  ›  drahnr

Gtk+和OpenGL绑定

  •  5
  • drahnr  · 技术社区  · 14 年前

    简洁明了: GTK+最高级的OpenGL绑定是什么?

    注意:我偶然发现了gtkglext、gtkglarea和clart。我读到前两篇有缺点/严重的问题。

    1 回复  |  直到 14 年前
        1
  •  6
  •   genpfault    8 年前

    更新:

    Gtk+-3.16 有什么事吗 使用下面的任何一个!

    如果要使用当前最先进的顶点/像素着色器,应使用最新的gnome并依赖其caps:

    广泛覆盖 https://www.bassi.io/articles/2015/02/17/using-opengl-with-gtk/


    好吧,我读了过去两个小时的内容,结果是:

    • gtkglext公司 将完全取代OpenGL的后端,这不是我的意图
    • 完全 ,尽管它提供了许多预滤波和 有趣的东西
    • 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)

    编辑:为那些只寻求二维 开罗 似乎最合适。