今天我折腾了半天,终于能在Macbook上快乐地写起OpenGL程序了,吼吼。网上有关OpenGL的教程基本是在Windows平台运行的,在OSX上面的教程实在是不多,即使是Apple官方的文档也有很多地方没有说清楚。从开始折腾到最后顺利运行走了不少弯路,真是一把辛酸泪...
但是作为一个辛劳而且忙碌的蘑菇,在这里我就不把所有的步骤都详细地写出来了,只把思路和注意事项记一记,道上的旁友如果看到有用的信息,自然是乐事一件。如果大家都觉得看了没有收获,那我只好安慰自己说,等我老年痴呆的时候又想捡起OpenGL玩时,这篇笔记总会派上用场的。
原料
扯远了,首先我把这道菜的原料(啥)列出来在下面。
1 OpenGL Book
这是一篇我目前觉得最好的入门读物,虽然是Windows平台的,但是因为OpenGL本身与平台无关,所以读这个可以很好地入门。我在OSX里尝试实现的也是这里的例子。
2 Apple官方文档
怎么港,虽然文档有点过时,但是还是很有借鉴意义的。Apple里面推荐的GUI是Cocoa,而不是FreeGlut。此外,GLUT和GLEW都集成在系统里了,这下什么也不用自己装。所以看看文档,怎么用这些现成的工具搭起一个环境,还是很必要的。
3 大牛教你Modern OpenGL
一个国内开发游戏的大牛,Zenny Chen(虽然孤陋寡闻的我,在这之前也是不知道的……)。这里介绍了怎样在NSOpenGLView里面获取3.2版本以上的OpenGL Core Context。
不过我要说一下,如果想在Storyboard里面直接加NSOpenGLView,Context肯定是不能在initWithFrame里面创建了。那就放在awakeFromNib的方法里面也可以,也是来得及的。
4 Context访问控制 线程锁
唔,本来前3个看起来就挺不错的了,但是你会发现生成的图像,它,它不会动啊……这怎么用来画动画?
要让程序自动刷新界面,还需要调用OSX的显卡驱动的API,叫DisplayLink,让它在刷新界面时调用OpenGL的绘制。但是因为调用的时候会并发许多线程来访问Context,然后就会互相冲突访问资源,就需要在绘制之前加上线程锁。这个文档里也没讲清楚,但是sample code里面是有的,我在stack overflow里看到的。
5 计算时间的鬼trick
不造Apple怎么弄的系统,c语言的timer.h基本是不能用的。算出来的动画就忽快忽慢,我想是为了节约CPU资源的trick。
入乡随俗,老老实实用NS的objective c的库计算时间吧。
实现思路
1 就先建个Cocoa
2 就继承一个NSOpenGLView,然后重载一些初始化函数,包括reshape, drawrect, prepareOpenGL 什么什么的
3 在storyboard里面把view加到界面里,另外钩上随着窗口尺寸缩放,不然任你拽来拽去它都不会甩你的
4 在awakeFromNib里加上获取酷炫高端亚克西的Core Context的代码
5 然后如果要动画那么就加上Display link callback,不要忘了线程锁
最后
一切才刚刚开始。
虽然已经可以一边吃瓜一边看着demo傻笑了,但是纹理呀,光源呀,shader呀,好玩的还在后面呢。
没有下集预告,但是如果顺利的话,防老年痴呆笔记还是会慢慢更新的。
那么就先这样吧!