PulseAudio 跨网络应用
用鱼鱼换掉了 bash

面向 GTK+ 3 的 GtkGLExt 现状

Garfileo posted @ 2012年2月21日 10:36 in Linux 的世界 with tags GLX gtkglext gtk+ , 6664 阅读

自 GTK+ 3.0 发布后,GtkGLExt 一直没有支持它,并且这个项目已沉寂了很久。最近 GtkGLExt 邮件列表中 Thomas Zimmermann 的三封邮件,让这件事情看上去有了一些眉目。

第一封邮件

大家好!

这个周末我将 GtkGLExt 向 GTK+3 进行了初步的移植。你可以通过以下命令获取代码:

$ git clone git://github.com/tdz/gtkglext.git

这份代码我已在 Fedora 15 中测试了,没有发现什么大问题。

在屏(On-screen)窗口当可以工作,不过目前只支持 X11 后端。由于 GTK+ 3 移除了 GdkDrawable,导致 GdkGLWindow 不再是可绘制对象,不过这不是什么问题。实际上这一变故将 GdkGLExt 向 GLX 层面更加靠近。当然,你依然可以从 GdkGLWindow 中获取 GdkWindow,在它上面绘制图形。

离屏(Off-screen)渲染目前尚不支持。在 GDK 3 中,离屏渲染是通过 GDK_WINDOW_TYPE_OFFSCREEN 类型的窗口实现的。未来,GtkGLExt 的离屏渲染需要基于这种类型的窗口进行实现。

颜色索引(Color-index)被我扔掉了。因为 GDK 3 没有为操纵窗口的颜色表提供所需接口,因此很难在 GtkGLExt 中保留这一功能。另外,OpenGL 3 也已经移除了颜色索引,因此现在丢弃这一功能可能不会造成太大的损失。原来颜色索引渲染所解决的问题现在可以通过片段着色器(Fragment shader)来完成。

现在 GtkGLExt 的构建系统可以生成单个包含了多个渲染后端的库。这是 GDK3 所具备的一项功能,>我认为 GdkGLExt 也应当仿效它。不过,现在只是改动了构建系统,实际的源码还不支持这一功能。

原来的 GtkGLExt 所带的大部分示例都可以运行通过。我删除了一部分示例,因为它们依赖于原来存在于 GtkGLExt 后来被我丢弃的功能。

对于这份代码的后续开发,我有一些想法。X11 后端应当基于 GLX 1.4 重写,这样可以增加一些新功能并且让代码看起来更简洁。增加离屏渲染功能应该很简单,Pbuffer 的支持也应当很容易实现。

其他的窗口系统也应当再次获得支持。不过,我没有 Macintosh 机器,这就需要由其他人来完成了。

现在,GtkGLExt 中有许多自动产生的函数,它们是用于查询 OpenGL 扩展的。这些函数应当封装成一个一般性的函数。

一旦那些最重要的问题解决了,我会将这份代码反馈给上游开发者并发布。欢迎参与其中!

第二封邮件

在 Fedora 15 中,通过 mingw 32,我进行了 Win32 渲染后端的的初步移植,在编译源代码时,需要在编译环境配置阶段使用 --enaable-win32-backend --disable-x11-backen --host=i686-pc-mingw32。Win 32 后端与 X11 后端存在着同样的缺陷,无颜色索引与离屏渲染。示例程序中有些 Bug,但是它们之前就有,也可能是 GTK+ 自身的问题。

我也增加了多个渲染后端的支持,以单一库的形式,是基于显式测试或者函数指针实现的。我怀疑同时使用多个渲染后端也是可行的,看这个例子:

glXMakeCurrent(glx_context);
wglMakeCurrent(wgl_context);

glXGetCurrentContext() == ?;

由于每个线程仅有一个 GL 环境,因此 OpenGL 实现不得不确定任何时刻只能有一个后端持有活动的 GL 环境。在上面的示例中,一个安全的 GL 实现应当为 glXGetCurrentContext 返回 NULL 指针。

下周,我会将代码重构一下,使之贴合 GTK+ 3 的风格与约定。此外,我还要清理一些 API,并简化 GDK 接口。

第三封邮件

现在我将 GtkGLExt 的 GTK+ 3 移植版本的最新变动提交到我的代码仓库中了,你可以使用以下命令获取副本:

$ git clone git://github.com/tdz/gtkglext.git

我用了大约一周半的时间按照 GTK+ 3 的约定对 GtkGLExt 的代码进行了清理。例如,现在只需要包含 gdk/gdkgl.h 单一的头文件,或者包含平台特定头文件 gdk/gdkglx.hgdk/gdkglwin32.h

我删除了那部分自动生成的扩展接口。如果你想使用 OpenGL 扩展,可以通过 GLEW 或 GLee。原有的扩展接口是很糟糕的设计而且也浪费了一些内存。在 X11 上,GtkGLExt 库的大小从 880 KB 缩减为 73 KB。用于查询扩展字串和符号地址的基本接口依然是保留着。

此外,我还清理了环境的设定代码。GdkGLDrawable 中的 gdk_gl_drawable_gl_begingdk_gl_drawable_gl_end 函数现在被替换为 gdk_gl_conext_make_currentgdk_gl_context_release_current。这些新的函数所作的工作与旧函数相同,但是将来它们可以支持 GLX 1.4 中的绘图对象。与 GdkGLDrawable 相关的一些函数也被我删掉了。

GTK+ 的控件现在包含了一个辅助函数 gtk_widget_begin_glgtk_widget_end_gl。这些函数可以处理 GL 环境以及 GTK+ 控件的绘图模型,也支持双缓冲。

下一阶段我要作的是让 GtkGLExt 支持 GLX 1.4,实现这一目标大概要一到两个周。

转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter