时间过的真快,这一年晃晃悠悠就这么结束了,回头看看,这一年收获还真不小,尤其是下半年。对于我来说,2013是个转折点,我的某些选择必然会对我的未来造成很大影响。虽然不知道影响是好是坏,但是至少我努力去做了。有句话我很喜欢:
The best way to predict the future is to create it.
—Alan Kay
方向:重回图形学
早在3年前,记得那个时候我还是大四,是一只快乐的保研猪。当时特别想做游戏,或者去研究游戏引擎,所以跟了教我们DirectX选修课的老师,在毕设的时候也小有成果。可惜好景不长,由于老师是按照项目走的,而且考虑如何短、平、快的出成果,自然不会按照正常的树形知识体系架构来指导(姑且不论是否有指导能力)。时间就这样晃晃悠悠的过去了,我的方向从做游戏->研究引擎->体感开发->研究体感算法。研究引擎的那一步走的实在不顺,由于缺乏理论知识,导致根本看不下去引擎源码(想看引擎的童鞋先看《Real-Time Rendering 3》和《Game Engine Architecture》)。不过总算跌跌撞撞的把项目完成了,也学到了不少东西,但都是点上的,而不是面上的。接下来就比较扯淡了,被误导到其他方向了,并且被忽悠去搞传说中毁一生的学历。
从去年年底开始,我仔细思考了下方向,决定重新回到之前的方向(游戏或者引擎),毕竟这是我喜欢的东西,不论最后结果如何,至少我尝试去做了。在之前各种失败经验的积累下,师兄的帮助,网上各种博客(clayman的博客不错,其他的一般),终于理清了初步思路,并且在这一年的过程中不断修正,不断进步。虽然绕了一大圈又回到了图形学,不过失败的经验似乎对这一年的学习起到了很大的加速作用,方向也清晰了很多。
当然,既然决定走自己的路,那就意味着不按导尸的要求来了,这么做是很有风险的。能做好,当然没问题,若是做不好,什么都得不到。不过,都到了这个地步了……我决定赌一把。按照打三国杀优势不挂闪电的原则,现在的局势属于劣势,有闪电肯定得挂上。
迟来的英语
英语一直以来都是一个很棘手的问题,相信不止我一个人有这个问题。由于很多图形学相关的书籍、论文都是英文的,如果英语这关没过,这条路一定是走不通的,所以,从暑假开始加大英语的时间投入,结合之前的基础,总算是小有成果,至少可以比较顺畅的阅读英文版一些专业文献和书籍,不会影响专业方面的学习(高手莫笑)。对于这一点我真的很高兴,学习英语十多年了,终于做到了这一步……虽然来的有点晚,但是终究是做到了。至于英语的进一步提高,那就只能细水长流了,至少现在英语不会成为深入学习图形学的瓶颈了。
个人感觉,要阅读英文文章,有两个难点要克服,第一是专业术语,第二是句子结构。专业术语方面,可以先从中文资料看起,看的过程中熟悉相关的英文,等到没有中文资料的时候,人家给一个陌生的单词,也会有很详细的解释,而且很多时候拿出英文很好理解,翻译成中文反而别扭;句子结构就是单纯的英语方面的功底了,多阅读自然会提高,我的做法是找一些有翻译的书或文章中英文对着看,看的时候注意下句子结构,一段时间以后阅读能力就上去了。至于非专业单词……可以查词典,所以算难点,不过词汇量当然是越大越好了。
图形学——入门到进阶
想要在一开始就定一个很完美的计划是不可能的,毕竟在不同阶段视野不同,想法也会有变化。但是,基础是不会变的,不论后期是什么计划,在前期茫然的时候先打基础肯定是对的。大三的时候三维图形程序设计这门课程用的教材是龙书《DirectX 9.0 3D游戏开发编程基础》,但是由于时间问题,后面半本书的东西没有讲。鉴于龙书是大家公认的入门好书,我觉得有必要把它看完,于是乎我花了几个星期把之前没学的都看一遍,收获还是比较大的,尤其是shader部分,至少入门了。
DirectX的SDK里带了很多不错的例子,早在大三的时候点进去看过,一堆乱七八糟的代码,和天书一样。但是,看完龙书以后再去看,结合微软提供的文档,虽然看着有些吃(毕竟图形学的功底太弱了),但是至少有办法看懂。通过阅读代码,逐渐了解实时渲染中的一些算法。看的时候有种感觉,虽然感觉知识量在扩大,但总是有种只见树木不见森林的感觉。
在学习图形学的过程中,我也通过unity3d的官网教程学习unity3d的使用。当时的想法是如果图形学学不下去了,至少把一门工具用好,以后找工作还是OK的。学习unity3d的过程中,严重感觉到图形学的重要性,尤其是一些优化的技巧。官网的教程确实好,讲的很全面,这里也感谢“unity圣典”提供的翻译。虽然unity3d的教程只是在教如何使用unity3d,但是其中涉及到了很多图形学专业术语,顺着这些专业术语我又得到了一些零散的知识点,并了解了一些优化技巧。
不过,只有零散的知识点是不够的,还需要系统的学习,搭建知识体系架构。虽然DirectX的SDK提供的例子很不错,提供了很多图形学算法的源码,但这是只点上的深入;很多大神的博客很不错,但学习了以后依旧是点上的深入;《GPU GEMS》系列和《ShaderX》系列虽然好,但同样的他们还是点上的深入。想要从入门到进阶,点的突破是不够的,需要通过之前的点建立一个完整的知识体系架构,以这个知识体系架构为基础再进行深入学习,就不会有那种只见树木不见森林的感觉了。
不得不说,《Real-Time Rendering》是本神书,看这本书感觉提高很快。我记得最开始是在clayman的博客里看到的,然后去网上搜了下这本书的电子版,看了下目录,发现这本书似乎就是我一直想找的,于是乎很快就去淘宝买了打印版(原版太贵了,穷学生买不起)。这本书对实时渲染的讲解相当的全面,看的过程中就感觉原先零散的知识点连成一片,形成一个知识体系架构,而且随着学习的深入,这个知识体系架构越来越完善。我一直以来都认为原理性的东西很重要,搞研究一定要做到不仅知其然,还要知其所以然,而如果没有《Real-Time Rendering》,知其所以然这一步很难做到。这本书已经快看完了,总体感觉图形学深入了不少,至少脱离了入门的水平,最重要的是建立了知识体系架构,不会只见树木不见森林了,可以说这是一个很重要的转折点。
当然,由于当时英语水平的限制,加上图形学的专业词汇了解的不是太多,最开始选择了第二版,因为第二版有翻译(虽然翻译的不好,但是有总比没有好,翻译版的叫《实时计算机图形学》)。大概在看了三分之一左右的时候,图形学的专业词汇熟悉了不少,恶补的英语也有了作用,看了看第三版的内容,好像没什么问题,而且感觉第三版也更新了好多东西,那就转到第三版吧。虽然刚开始看的时候鸭梨确实比较大,但是习惯了以后,发现阅读也不是太难。
总结与展望
今年有两个比较大的突破,一个是英语水平提高了,终于可以阅读英文原版书了;另一个突破了图形学的学习瓶颈,搭建知识体系架构,脱离徘徊已久的入门状态。其实这些是我在2年前想做的,可惜由于各方面的原因,绕了一大圈到现在才实现。有了图形学知识体系架构以后,下一步的目标就是游戏引擎或图形引擎了,最好的学习方法肯定是看开源的引擎源码,如OGRE。当然,引擎那么庞大的代码不是那么好入手的,有本神书《Game Engine Architecture》,据说对游戏引擎讲解的相当不错,已经在淘宝买了打印版(原版59刀,买不起),目测看完这本书再看OGRE源码,又会有不小的长进。