经验分享:3D游戏引擎开发研究与实践
很多游戏开发者认为自己能写逻辑就等于掌握了游戏开发技术,引擎对自己来说无足轻重,这种想法是有问题的。首先你写逻辑是在引擎的基础上写,其次如果你对引擎一无所知,非常不利于你去深入理解逻辑开发。相反如果你对引擎有深入的研究,你调用引擎提供的接口时可以很清楚的知道其内部是如何实现的,这样有助于写一些引擎的辅助功能算法,提升自己的编程能力。
我以前在网龙工作时,项目组就有一位逻辑程序员在做功能时,需要在原有引擎接口的基础上增加一些算法编程以满足游戏玩法,当时他并没有求助引擎组的同事,而是自己写出来了,因为他自己平时就喜欢钻研3D游戏引擎,了解引擎接口内部是如何实现的,这本身就证明了他的编程能力。最后将其吸纳到拥有公司最核心技术的引擎项目组,薪酬和职位同时得到了提升。因为在公司里面会写算法或者会GPU编程的人相对来说非常少,如果你掌握了3D引擎开发技术不仅对于逻辑开发更加有利,而且对于你技能提升帮助非常大。
学习3D引擎需要经历一个由浅入深的过程,首先你要了解最基本的一些3D知识,比如固定流水线,可编程流水线,3D模型结构,骨骼动画等这些知识,并且能利用Dirct3D或者OPENGL或者OPENGLES这些图形库中任何一个,做个简单的Demo。通过Demo了解程序运行的原理后,再尝试封装一些简单算法,一些常用函数,利用这个简单封装做一款小的游戏Demo。最后再研究一下GPU编程比如CG、HLSL语言的语法,在GPU编程的基础上再学习一些大型游戏开发中常用的算法,比如PSSM实时阴影算法,Bloom算法等这些与Shader编程紧密相关的后处理渲染算法。
目前各大游戏公司比如网易,腾讯,EA,任天堂等国内外知名的IT公司,还有许多新兴的VR/AR公司非常紧缺3D引擎资深程序或者图形学引擎开发人员,开出了非常诱人的薪水和待遇,从中可以看出目前游戏市场对于这类人才需求还是非常紧缺的。这正是一个学习3D引擎开发的好机会,俗话说,“机不可失,时不我待”。
笔者曾经在国内知名IT游戏公司参与过3D游戏引擎项目组的研发,利用业余时间也开发过3D游戏引擎,从底层算法到架构设计都是一个人完成的,当然开发周期也是比较长的。回到正题,3D引擎这么重要,那作为新手应该如何着手学习?换句话说关于开发3D引擎要具备哪些条件?网络上有许多这方面的解答,笔者经过多年对3D游戏引擎的开发研究和实践经验,在此主要总结了以下四点供大家学习参考。
首先,必须要掌握主流开发语言C、C++、Java或者C#至少一门编程语言,编程离不开数据结构,大学课程里面学的数据结构对于游戏开发非常重要,数据结构在游戏开发中主要用于数据存储以及内存管理,开发3D引擎常用数据结构有数组、链表、哈希表等以及常用的一些查找算法:快速排序,二叉树查找,二分查找等,对于常用的数据结构要重点掌握。为引起读者重视,在此再重点强调一下,数据结构对于游戏开发非常重要。
其次,线性代数对于开发同样非常重要,掌握线性代数的目的是在游戏开发中灵活的运用向量、矩阵、四元数以及欧拉角这些基本的数学运算解决问题。3D固定流水线中的坐标变换和可编程流水线的顶点和像素转换都是使用线性代数运算完成的,运算主要涉及游戏开发中的物体移动、旋转、缩放,以及点乘和差乘等。
再次,现在的3D游戏引擎渲染都是基于DirectX或者是OPENGL、OPENGLES这些图形库完成的,这就需要开发者能够熟练的使用图形库的接口开发程序,在当前移动端跨平台非常火热的情况下,建议大家学习OPENGL图形库。3D引擎的核心功能就是对游戏的嘲渲染和物体的材质渲染,对于材质中有Alpha通道的要做特殊处理,Alpha通道就是说材质有透明的部分。在移动端为了减少透明材质的消耗,会通过GPU编程在Shader中进行处理,比如把有Alpha通道的图片切分成无Alpha通道和有Alpha通道的图片,通过Shader编程将其再合在一起。嘲渲染使用的是后处理渲染效果,比如Bloom、Blur、Ssao、Pssm等等。这些效果实现与GPU编程息息相关,要求大家至少掌握GLSL、HLSL或者CG这些基于显卡GPU编程语言的一种。
最后是图形学算法,游戏要实现一些逼真的效果离不开算法的支持,比如柔体的模拟,刚体碰撞效果以及曲线插值算法等。学习图形学算法,建议大家看一下《算法导论》这本非常经典的书籍,以上说的这些是引擎中比较深层次的知识点。另外在框架设计方面,需要掌握设计模式里常用的比如工厂模式,单件模式,状态模式,MVC模式等。设计模式的使用不是靠死记硬背,需要将其灵活运用到项目开发中,这样才能逐步深入领会其设计精髓。初学者在使用设计模式的过程中会出现一个误区:千万不要为了使用设计模式而使用设计模式,过度的使用会得到适得其反的效果,凡事要把握一个度。以前公司的同事为了使用设计模式,不论设计什么模块都要用设计模式,最后导致在模块扩充时出现了很多问题,举这个例子是告诉读者好东西也不能乱用。笔者从没有在做架构设计时去特意考虑用哪种设计模式,都是顺其自然的使用,真正的用剑高手,可以做到手中无剑,心中有剑的境界。
以上四点是笔者对3D游戏引擎开发的心得体会,建议大家循序渐进的学习,优先掌握第一、第二点,其次第三点,最后是图形学算法,由易到难的学习。希望读者通过本书的学习,能够对引擎开发有更深入的理解,写出更好的3D游戏引擎或者更好的渲染算法。
游戏开发最核心的技术是算法,在游戏开发中占非常大的比重,也可以说是引擎核心中的核心,以笔者亲身开发项目经历给大家分享一下,希望起到抛砖引玉的效果。近期与高校科研机构合作研发了一款海水渲染3D引擎,可以逼真的模拟真实海浪,以及海浪在不同的天气实现不同的效果,模拟船在海中随海浪上下浮动和直升机在海浪上空悬停风力与海浪的作用效果等。在实现的过程中使用了很多算法比如Perlin噪音算法,弗洛伊德算法,以及物理算法等。
技术的学习掌握不是一朝一夕能够完成的,关键在于坚持,首先要做的是打好基础,在真正掌握了基础知识后,再提升是非常快的。做游戏引擎也是知识积累的过程,虽然现在的3D引擎非常多,自己开发游戏引擎已经不现实,但是要想真正的深入学习游戏开发核心技术,至少应该知道引擎的底层是如何实现的,换句话说就是其工作原理要搞清楚,这对于开发者来说非常重要。不要再把自己局限于代码操作工简单的写写逻辑,这对自己的技术提升没有任何帮助的。
要做到对游戏开发知其然知其所以然,就必须学习3D引擎开发技术,特别是对刚踏入游戏行业的从业者,每天坚持不断的学习,如果你能持续不断的坚持10000个小时学习,你肯定会成为3D引擎高手。这就跟锻炼身体一样,其实锻炼身体非常能够磨练一个人的心性,锻炼一个人的意志力。自己尝试开发一款小的游戏引擎,即使不能成功但是过程也是非常重要的,你从中可以学习到很多知识,经验的积累对自己的发展帮助非常大,这也是为什么游戏公司招聘,首要的条件是应聘者要有实际开发项目工作经验。