Gtk+ 和 OpenGL 绑定 [英] Gtk+ and OpenGL bindings

查看:50
本文介绍了Gtk+ 和 OpenGL 绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

简单而简短:最先进的 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆