做游戏与搞图形学有什么联系?
⽂/杨⼒骁
本⽂⾸发于知乎。
明确两点:
1. 游戏开发只是借助了电脑和图形学,没有这两个,⼀样可以开发游戏。
2. 图形学是为了在电脑⾥模拟物体⽽形成的⼀门研究领域。
⽬前,游戏公司偏重于成熟稳定的框架,这样更有利于快速开发游戏,毕竟根本是为了赚钱。只有很少⼀部分⼤公司需要⾃⼰去搞游戏引擎,只有当开发或者定制游戏引擎的时候,才会⽤到⼀点图形学的知识,不过总的来说,游戏只⽤到了很少⼀部分图形学知识。更多的图形学知识,会⽤于建模/电影之类的。如果你感兴趣于游戏,那么图形学会让你⾛的更远,不过短期来看并没有什么卵⽤,不如踏踏实实把⼀款游戏引擎⽤好,这样游戏公司⼤部分的⼯作才适合你。
上⾯全是废话,下⾯才是我想说的:
⾸先,⽆论外部环境如何艰难,作为⼀个有志于游戏开发的程序员,你都不该⾃暴⾃弃,学习更⾼深的东西,有百利⽽⽆⼀害。同时,作为社会⼈,你需要提供⾼质量的服务,这是你应该承担的责任。下⾯主要是针对对游戏开发和图形学有兴趣,却不知如何下⼿的同学的⼀些⼩⼩的建议。
游戏⼯程
在中国,游戏在很⼤程度上是服务业,不是制造业。⼀款游戏更多的是内容驱动(美⼯,策划),程序员反⽽成了辅助,为游戏的实现⽽提供技术⽅案。
1.游戏顾名思义是为了娱乐⽽制定的⼀套规则,它的可玩性⾼于⼀切。可玩性是游戏施加给玩家的挑战组合,⼀个游戏如果能让玩家觉得有⽆限的可能性,那么就说明这个游戏可玩性⽐较⾼。⼀个规则可能很简单,但是当多个规则组合起来,就会产⽣不可预测的结果,这就是游戏的魅⼒,More is Different。可以试试⽤编程来玩玩⽣命游戏。还有⼀个梗,如果计算机在⼀个游戏中⽆法战胜玩家,那么就说明这个游戏有很⾼的可玩性。
2.游戏是⼀场赌博,⽐如游戏中的⽣物,如果它们的属性都千篇⼀律,是不是很⽆聊,⽽如果仅仅是加⼊了⼀点随机,会让玩家感觉这个游戏更真实,更有想玩的冲动。计算机的出现,让游戏开发变得更加学科化,因为计算机可以代替⼈脑来执⾏规则。这意味着,作为程序员,你就是秩序的象征,你就是上帝。
建议:
0.如果只想写游戏逻辑,只⽤熟悉框架,熟悉语⾔。客户端框架推荐unity3d,unreal4,cocos2d,这些框架都有完整的⼯具链(脚本,资源管理,编辑器),可以让你快速上⼿,同时社区也⽐较⽕热,不⽤担⼼遇到问题没地⽅问。服务端不太了解,每个公司都有⾃⼰的服务端引擎吧,我⽐较看好⼀款叫kbengine的开源引擎和云风⼤哥的skynet(不过是c写的,⾥⾯有很多trick,我没敢去看,-。-),希望朋友们可以推荐⼀下还有哪些开源的游戏⽹络引擎对初学者⽐较友好。
1.如果觉得引擎不符合你的要求,你想⾃⼰定制,做⼀个引擎geek。那么ogre是个很好的选择(虽然有⼈说它过分设计,但是你如果很厉害,还是可以改的嘛)。另外,龚⼤⼤(叛逆者)的klayGE很优秀,我喜欢龚⼤⼤这样的⼈0.0。
2.如果想本科毕业后从事更为核⼼的设计。学好线代/信号系统/数学分析/概率统计(重要程度由⾼到低)很重要,然后去⼀些图形学初期的论⽂看看,主要是理解别⼈的意思。线代不⽤说了,游戏中的各种变换都依赖于线代提供的数学⼯具。信号系统提供的思路,如何从不同的基来表达信号,很⼤程度会改变你的世界观,对,世界观,然后游戏中的pre/postprocess很多⽤到信号系统(本科的同学Oppenheimer懂得吧)。数学分析,会培养你的数学演绎能⼒,这点在数学建模,特别是游戏这样⼀个理想国⾥,是⾮常有⽤的。概率统计,AI不能多说。
unity3d入门
3.⼤学期间,如果想开发游戏证明⾃⼰,绝对不要要求太⾼。如果你能到⼀个美⼯同学,那么跟他/她⼀起成长再好不过。千万别因为想⾃⼰做⼀款游戏⽽⾛偏了⽅向。我就因为想做游戏⽽⾃学了建模,在youtube上下载了将近200G的
过。千万别因为想⾃⼰做⼀款游戏⽽⾛偏了⽅向。我就因为想做游戏⽽⾃学了建模,在youtube上下载了将近200G的blender教程,到最后,可以做⼀些基本的物体,调⼀些动作,做⼀些纹理,⽽且全是⽤⼀个⿏标完成,⾄今不会⽤数字板。这些⼯作你可以投⼊⼀些时间,但是这些时间你可以⽤来做更有意义的事情,⽐如成为⼀个编程⾼⼿。
4.可以考虑实现⼀个软渲染器,很多⼈推荐,虽然我没去做过,不过应该收益蛮⼤。它可以让你对渲染的本质有所理解,同时增加你的代码掌控⼒。推荐《3d游戏编程⼤师》,理解核⼼即可。
5.电⼦游戏开发,需要各⽅⾯学科的能⼒,c++/directx(问我为什么不写opengl),软件架构,编译原理,⽹络,数据库。都要尝试动⼿去做(⽐如学操作系统,你就可以试着给⼀些简单的cpu写个系统,不要是x86架构,因为你还只是个学⽣;数据库的话,你可以先尝试写keyvalue型的数据库;⽹络的话,可以⾃⼰试试写个⽹络库(推荐@陈硕⼤哥的muduo,因为有书可以配合理解,另外陈硕⼤哥的c++很厉害);编译原理,⼀个简单的脚本语⾔;这些你都可以去尝试,⽐你考⾼分有⽤的多)。这句话我想说三遍。
6.gamedev/stackover,希望你常去看看。
7.记得把你作品保留下来,然后不断对它迭代,如何把它保留下来是门学问,我就因为太关注于本⾝能⼒的修炼⽽忽略了这个。⼤四之前写过的代码和硬盘因为⼀杯咖啡全送进了回收站Forever。如果你是⼀个有⼼的⼈,那么⼀份游戏相关的⼯作完全不是问题。
8.紧接着上⾯的⼀点。学会使⽤github,⾃⼰写个博客。很重要,不要嫌⿇烦。⾎泪教训。
9.说到图形学与游戏的关系。不得不谈到⼀个⼈,也是我最崇拜的⼀个⼈。3D游戏引擎之⽗-john carmack。关于他的逸闻趣事有许多。最出名的是那个开根号的magicnumber,0x5f3759df,让游戏中最常⽤的函数快了4倍!也是那本《doom启⽰录》让我对图形学和游戏开发更加神往。
10.上⾯说了点⼯程⽅⾯的,更多是围绕游戏领域。然⽽在图形学这个领域中,有许多细⼩的分⽀更值得关注。具体的⼀些见硕⿏酱的答案。我的答案会更偏向于保守经典的领域。
图形学
图形学作为⼊门,我挑了⼏个经典有趣核⼼的⽅⾯说说。
0.Physic中的Deformable Body。这是我⽐较喜欢的⼀个⼦领域。它主要是研究物体的物理性质,如何
模拟物体的受压形变及其恢复过程。⽐如⼀个植物,你将它折弯,松开,它会摆动,如何在计算机中表⽰这些摆动呢?有两个可选⽅案,
1.Mass Spring System.是将物体受压运动看成由很多⼩弹簧共同震动产⽣的。我记得我刚读⼤学的时候就拜读了Milo Yip⼤神在⿇辣马《爱丽丝梦游魔镜》中关于头发的建模(如果我记得没错,就是MY⼤神写的吧?关于MY⼤神同时感谢他翻译的《游戏引擎架构》,质量⾮常⾼),那篇⽂章算是DBody的⼀个⼊门吧。
2.有限元⽅法。
关注:游戏陀螺(shouyoushouce),定时推送,游戏⾏业⼲货分享、爆料揭秘、互动精彩多。