简单和短:什么是最先进的OpenGL的GTK +绑定? 我宁愿使用类似于QGLWidget的小部件。GTK +和OpenGL绑定
注:我偶然发现gtkglext,gtkglarea和混乱。我读了前两个有缺点/严重问题。
简单和短:什么是最先进的OpenGL的GTK +绑定? 我宁愿使用类似于QGLWidget的小部件。GTK +和OpenGL绑定
注:我偶然发现gtkglext,gtkglarea和混乱。我读了前两个有缺点/严重问题。
更新:
由于Gtk+-3.16
任何超越做不使用任何的下方!
如果你想用艺术的当前状态,顶点/像素着色器,你应该使用最新的GNOME和依靠其上限:
广泛报道了https://www.bassi.io/articles/2015/02/17/using-opengl-with-gtk/
好,我经历了2小时以来读取几乎和我的结果是:
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的人开罗似乎是最合适的。
小部件自己将通过OpenGL呈现,因为您可以从http://projects.gnome.org/gtkglext/轻松获取它们 – drahnr 2012-07-10 16:57:02
他们似乎都被activly发达,发布在2009年和2010年,而最近的活动(http://git.gnome.org/browse/gtkglext/,http://git.gnome.org/browse/gtkglarea /)哪一个更喜欢,但我不能判断 - 但我不会判断它是如何最近一个版本.. – nos 2010-09-28 18:50:43
gtkglext有一个专门的方面,告诉我这是2006年。也许这是谷歌谷歌-voodoo从被覆盖的位保留删除的一面。 QUestion编辑相应。 – drahnr 2010-09-28 18:57:12