在 X11 中实现 GTK+ 3 的 OpenGL 支持
最近,开始思考 GTK+ 3.0 的 OpenGL 支持的问题。由于 GtkGLExt 现在还不支持 GTK+ 3.0,其维护者对此没有任何表示。现在最务实的办法是使用 clutter-gtk 库,通过 Clutter 的底层库 Cogl(OpenGL 的面向对象封装)在 GTK+ 3 的 Widget 中绘制 OpenGL 图形。但是,目前 Cogl 功能尚不完善,例如不支持用户自定义帧缓存格式,缺乏光照支持,以及图形渲染方式过于单调,仅支持顶点缓存(Vertex Buffer)渲染。考虑到 GTK+ 在 X11 是通过封装 xlib 实现的,而 xlib 可通过 GLX 实现 OpenGL 支持[1]。因此,通过 xlib 与 GLX 结合的途径,理论上必然可实现 X11 环境中 GTK+ 3.0 的 OpenGL 支持。
矩形选择
本来是灵机一动,考虑在 gtkglext widget 上使用 cairo 在窗口中动态绘制一个矩形框表示所选的 OpenGL 三空间中的局部区域,然后将这个矩形框映射到 OpenGL 三维空间中得到三维选区,并将 OpenGL 的视景体调整为这个三维选区,从而实现 OpenGL 图形的放大效果。可惜,这个灵机一动没成功,cairo 所绘制的矩形框被 gtkglext 的双缓冲区里的图形淹没了。
尽管如此,我还是要将这个 cairo 效果拿出来展展,用于揭示虽然我一直都喜欢 gtk+,但是这实际上是我第一个具有现实意义的 gtk+ 程序 :)
Linux 桌面可以这样开启 N 卡的 FSAA
Linux 里开启 FSAA 的事情在“给 GtkGLExt 打上支持 OpenGL 多重采样的补丁”一文中略略提了一句。
虽然可以通过对 GtkGLExt 库打上多重采样补丁来解决 gtk + opengl 的抗锯齿问题,但是对于那些不知道如何进行源码编译安装以及如何为源码打补丁的用户而言,远水难解近渴。
事实上,如果你是 N 卡用户,如果你安装了 nvidia-settings 程序(最好是有图形界面),那么开启 FSAA 就变的很简单了,只需按照“给 GtkGLExt 打上支持 OpenGL 多重采样的补丁”文中所介绍的 FSAA 设置界面启用 FSAA 覆盖应用程序设置(Override Application Settings)模式,并将 nvidia-settings 的设置保存为 ~/.nvidia-setting-rc 文件。
然后在 ~/.xinitrc 之类的文件中添加:
nvidia-settings -l
这样,每当重启桌面时,nvidia-settings 便会自动开启 FSAA。
按 Nvidia 的官方文档中的记载,可以通过设定 __GL_FSAA_MODE 这一环境变量来开启 FSAA。我测试的结果是不能用。