面向 GTK+ 3 的 GtkGLExt 现状
自 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.h
与gdk/gdkglwin32.h
。我删除了那部分自动生成的扩展接口。如果你想使用 OpenGL 扩展,可以通过 GLEW 或 GLee。原有的扩展接口是很糟糕的设计而且也浪费了一些内存。在 X11 上,GtkGLExt 库的大小从 880 KB 缩减为 73 KB。用于查询扩展字串和符号地址的基本接口依然是保留着。
此外,我还清理了环境的设定代码。
GdkGLDrawable
中的gdk_gl_drawable_gl_begin
与gdk_gl_drawable_gl_end
函数现在被替换为gdk_gl_conext_make_current
与gdk_gl_context_release_current
。这些新的函数所作的工作与旧函数相同,但是将来它们可以支持 GLX 1.4 中的绘图对象。与GdkGLDrawable
相关的一些函数也被我删掉了。GTK+ 的控件现在包含了一个辅助函数
gtk_widget_begin_gl
与gtk_widget_end_gl
。这些函数可以处理 GL 环境以及 GTK+ 控件的绘图模型,也支持双缓冲。下一阶段我要作的是让 GtkGLExt 支持 GLX 1.4,实现这一目标大概要一到两个周。
转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com