Categories
OpenGL

OpenGL notes(1)

有关Framework。

今天遇到一个问题。某个例程里面用了#include 调用了Mac OS X自带的OpenGL库,编译正常。在尝试用贴图渲染3D物体时,NeHe教程里用了AUX_RGBImageRec来储存读入的图片,而这个类型是包含在glaux库里的,这个库又是windows only的。Apple给的官方说明给了一些选项来完成mac中的相同任务,一是用Cocoa的NSView类,二是用Quartz的image source,三是直接从解压的文件里读入Raw数据。当然,我选了第二个。系统的ApplicationServices/CoreGraphics.framework/CGImage.h里面定义了Quartz的图像数据类型CGImageRef,所以,我得把这个头文件include进去。可是导入了ApplicationServices Framework到工程里,在头文件里用#include 却总是报错,no such file or directory。而在工程浏览器里CGImage.h明明在ApplicationServices下面……后来翻Xcode的文档才发现,涉及深层次的问题。

Mac下面的Framework都是用bundle的形式提供的,一个bundle里面可以共存多种版本,保证了对旧版本程序的支持。为了为特定的应用环境提供必需的编程接口,Apple在标准的Framework之外还提供了Umbrella Framework。照我的理解,UF顾名思义应该是期望用伞架的结构,讲分散在各个Standard Framework里的subframework虚拟的链接起来,形成针对某种特定应用的新的framework。与Standard Framework不同,UF并不把它的subframeworks里的头文件都包括进来,而仅仅包含那个framework的master header file,也就是与framework同名的那个。因此,在调用UF的时候,只需要include这个头文件即可。这样也带来一个好处,就是如果Apple对某个framework里的东西进行了修改,开发者并不需要对他们的代码做改动,因为那个master header file总是不会改变的。

好了,废话这么多,最终结论就是,只需要#include 就可以。

Categories
Tech

OpenGL之纠结

今天开始配OpenGL的编译环境。

目前,根据我的理解,OpenGL并没有提供统一的SDK,所以有GLUT, freeglut之类的东西并存,安装之后,它们就能提供OpenGL编译所需要的一系列接口。

首先试了Mac OS X。其实没多想就放弃了。这姑娘长得那么漂亮,就没个编程的氛围……

然后就开Parallels拿Ubuntu 8.04出来。很轻松的apt-get install一下,就装上了libglut和freeglut等4个包。网上抄了一段测试代码,写好makefile,编译,通过,跳出来一个渲染后的窗口。但是console里很显眼的报错:freeglut: unable to create direct context rendering for window ‘xx’。google了一下,问题在于显卡的硬件加速没有发挥作用。从跳出来的窗口上也可以感觉到确实有些不顺畅。于是,找了nvidia的驱动来装。估量着Pro的显卡还是比较新的,8600M GT,所以装了nvidia-glx-new(-dev)。而且这个new的东西也确实是为8.04的新内核而生的。

但是,装完之后又出现新问题,连运行都不能了。编译、链接通过,运行直接报错:freeglut: OpenGL GLX extension not supported by display ‘:0.0’。再google,说是freeglut,libglut的库和nvidia驱动自带的库不能共存。!×·&……#¥×(!……#

之后看到有一篇文章,面对这种情况时,某人用mesa编译了库来用软件加速,直接无视nvidia的东西。于是照猫画虎,我也弄了mesa来编译。不见起色……怀疑是nvidia还在的缘故,于是又删了驱动,重装freeglut & libglut,重启,又弄出来新的问题,找不到-lGL。手动跑了一次ldconfig,还是死样。又把驱动装回来,编译过了,运行又是unable to create……回到原点。这时候真是严重的心烦意乱,懒得再折腾LIBRARY_PATH啥的了,估计是用虚拟机跑的时候显卡驱动比较土吧。

最后收拾收拾,还是回到Mac下了。正好翻到NeHe的OpenGL教程,里面居然有专门针对OS X的说明!OS X里也有自带OpenGL Framework。nnd。。。正好之前也装了Xcode,就下了一段sample code来。结果……一下通过……运行顺利……出现了一个可爱的红色三角形……

叹,虽然是绕了个大圈,花了大半天时间,最后的结果还是成功的,不仅可以动手写东西了,而且能舒服的呆在Mac下享受漂亮的界面而不必忍受Parallels上面奇怪的Linux(btw, Parallels跑Linux居然不能与OS X之间copy/paste,官方的解释也是无能为力。这叫人怎么用……)。

发泄完毕。