簡體   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