更新:
自Gtk+-3.16
not 以来,请使用以下任何一种!
如果您想使用当前的技术,顶点/像素着色器,您应该使用最新的gnome,并依赖它的上限:
广泛覆盖在https://www.bassi.io/articles/2015/02/17/using-opengl-with-gtk/中
好吧,我在过去的两个小时里读了很多,我的结果是:
- gtkglext将用OpenGL完全取代后端,这不是我的意图。
- 杂波将所有本机gl调用装箱到对象中,并且根本不支持本机gl调用,尽管它提供了许多经过改进的筛选器和有趣的内容。
- gtkglarea看起来很好,它的设计很可爱。它在Qt中具有与QGLWidget相同的用法风格(据我所知) gtkglarea的简单演示:
# #include #include int init (GtkWidget *小部件){ if (gtk_gl_area_make_current (GTK_GL_AREA(小部件){ glViewport(0,0,小部件->分配高度);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0,100,100,0,-1,1);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}返回TRUE;} int绘图(GtkWidget *小部件,GdkEventExpose *事件){ if (事件->计数> 0)返回真;if (gtk_gl_area_make_current (GTK_GL_AREA(小部件){ glClearColor(0,0,0,1);glClear(GL_COLOR_BUFFER_BIT);glColor3f(1,1);glBegin(GL_TRIANGLES);glVertex2f(10,10);glVertex2f(10,90);glVertex2f(90,90);glEnd();gtk_gl_area_swap_buffers (GTK_GL_AREA(小部件));}返回真;} int重塑(GtkWidget *小部件,GdkEventConfigure *事件){ if (gtk_gl_area_make_current (GTK_GL_AREA(小部件) glViewport(0,0,小部件->分配宽度,小部件->分配高度);返回真;} int main (int argc,char **argv) { GtkWidget *窗口,*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)返回0;window = gtk_window_new (GTK_WINDOW_TOPLEVEL);gtk_window_set_title (GTK_WINDOW(窗口),"Simple");gtk_container_set_border_width (GTK_CONTAINER(窗口),10);g_signal_connect (窗口,"delete_event",G_CALLBACK (gtk_main_quit),NULL);/*,您应该在退出之前删除gtk_gl_area小部件,否则GLX上下文就会被删除,这可能会在某些系统中造成问题(=core )。对象的销毁方法不会在退出时自动调用。您需要手动启用此功能。对所有顶级窗口执行gtk_quit_add_destroy(),除非您确信它们通过其他方式获得破坏信号。*/ gtk_quit_add_destroy (1,GTK_OBJECT(窗口));glarea = GTK_WIDGET(gtk_gl_area_new (吸引表));gtk_widget_set_size_request (GTK_WIDGET(glarea),100,100);gtk_widget_set_events (glarea(Glarea),GDK_EXPOSURE_MASK \ GDK_BUTTON_PRESS_MASK);g_signal_connect (glarea,"expose_event",G_CALLBACK(draw),NULL);g_signal_connect (釉区,"configure_event",G_CALLBACK(重塑),空);g_signal_connect (釉区,“实现”,G_CALLBACK(init),空);gtk_container_add (窗口),GTK_WIDGET(釉区);gtk_widget_show (釉区);gtk_widget_show (GTK_WIDGET(窗口));gtk_main ();返回0};
注意: gtkglarea仍然存在一些问题,比如出口处的堆芯(至少1.99)。
Note2:版本2.0.1修复了这个问题
编辑:对于那些只寻求2D的人来说,开罗似乎是最合适的。