繁体   English   中英

Gtk +和OpenGL绑定

[英]Gtk+ and OpenGL bindings

简单明了: GTK +最先进的OpenGL绑定是什么? 我希望有一个小部件,它允许我像QGLWidget一样使用它。

注意:我偶然发现gtkglext,gtkglarea和混乱情况。 我读到前两个有缺点/严重的问题。

更新:

因为Gtk+-3.16任何超越使用任何的下方!

如果要使用最新的顶点/像素着色器,则应使用最新的gnome并依靠其上限:

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


好的,最近两个小时我读了很多东西,结果是:

  • gtkglext将完全用OpenGL替换后端,这不是我的意图
  • 杂波盒装入对象的所有本地来电GL和不支持的所有本地来电GL,虽然它提供了许多predifened过滤器和有趣的东西
  • gtkglarea看起来不错,它的设计很可爱。 它具有与Qt中的QGLWidget相同的用法风格(据我所知) 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的人,仅开罗似乎是最合适的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM