Gtk+ 和 OpenGL 绑定 [英] Gtk+ and OpenGL bindings
问题描述
简单而简短:最先进的 GTK+ OpenGL 绑定是什么?我更喜欢一个小部件,它允许我像 QGLWidget 一样使用它.
Simple and short: What is the most advanced OpenGL binding for GTK+? I would prefer a widget which allows me to use it similar to QGLWidget.
注意:我偶然发现了 gtkglext、gtkglarea 和 clutter.我读过前两个有缺点/严重问题.
Note: I stumbled upon gtkglext, gtkglarea and clutter. I read the first two have shortcomings/ serious issues.
推荐答案
更新:
自 Gtk+-3.16
以后,不要使用以下任何一种!
Since Gtk+-3.16
any beyond do not use any of the below!
如果您想使用当前最先进的顶点/像素着色器,您应该使用最新的 gnome 并依赖其大写:
If you want to use the current state of the art, vertex/pixel shaders you should use the latest gnome and rely on its caps:
在 https://www.Bassi.io/articles/2015/02/17/using-opengl-with-gtk/
好的,我在过去的 2 个小时里读了很多,我的结果是:
Ok, I read pretty much through the last 2 hours and my results are:
- gtkglext 将完全用 OpenGL 替换后端,这不是我的本意
- 杂乱将所有原生 gl 调用封装到对象中,并且根本不支持原生 gl 调用,尽管它提供了许多预定义的过滤器和有趣的东西em>
gtkglarea 看起来不错,它的设计很可爱.它与 Qt 中的 QGLWidget 具有相同的使用风格(据我所知)gtkglarea 的简单演示:
- gtkglext will completly replace the backend by OpenGL, this was not my intention
- clutter has all native gl calls boxed into objects and does not support native gl calls at all, though it provides many predifened filters and funny stuff
gtkglarea seems fine, its design is lovely. It has the same usage style as QGLWidget in Qt (as far as I can say) 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)
Note: gtkglarea has still some problems like core dump on exit (at least 1.99)
注 2:2.0.1 版修复了这个问题
Note2: Version 2.0.1 fixes this issue
对于那些只寻求 2D 的人来说 cairo 似乎是最合适的.
For those seeking for 2D only cairo seems to be most suitable.
这篇关于Gtk+ 和 OpenGL 绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!