游戏引擎开发入门教程(C语言编程网)_第1页
游戏引擎开发入门教程(C语言编程网)_第2页
游戏引擎开发入门教程(C语言编程网)_第3页
游戏引擎开发入门教程(C语言编程网)_第4页
游戏引擎开发入门教程(C语言编程网)_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

游戏引擎开发入门教程C语言编程网目录TOC\h\h游戏引擎开发入门教程(C语言编程网)\h游戏引擎是什么?\h我对游戏引擎的一些看法\h典型游戏开发团队的结构是怎样的?\h有哪些著名的游戏引擎?\h开发引擎是否一定要依托于游戏?\h游戏逻辑编程和游戏引擎编程\h游戏引擎开发涉及到的数学知识\h游戏引擎中的OpenGL和DirectX\h3D游戏引擎的原理和架构\h游戏引擎开发的学习路线游戏引擎开发入门教程(C语言编程网)游戏引擎是什么?什么是游戏引擎?其实这很难给出明确的定义。在很多游戏的宣传中,我们会听到对游戏引擎的推崇。绚丽的特效,流畅的体验,似乎都是游戏引擎的功劳。在游戏玩家看来,游戏画面的表现力越好,游戏场面的震撼程度越大,游戏体验的真实感越强,底层的游戏引擎就可能越强大。我们不妨来看看业界给出的一些定义:游戏引擎是指一些已编写好的可编辑计算机游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地写出游戏程序而不用从零开始。

大部分游戏引擎支持多种操作平台,如Linux、MacOSX、Windows。游戏引擎包含渲染引擎(即“渲染器”,含二维图像引擎和三维图像引擎)、物理引擎、碰撞检测系统、音效引擎、脚本引擎、电脑动画引擎、人工智能引擎、网络引擎以及场景管理引擎。根据上述定义,在很多人看来,游戏引擎负责把很多已有的零部件组装起来,如同组装手机,CPU、屏幕、摄像头、主板等都是别人生产的,手机厂商按照自己喜欢样式组装一下就好了。下面再看看GameEngineArchitecture(中文书名《游戏引擎架构》)是怎么说的:通常,游戏和其引擎之间的分界线是很模糊的。一些引擎有相当清晰的划分,一些则没有尝试把二者分开。

在一款游戏中,渲染代码可能特别“知悉”如何画一只妖兽(Orc);在另一款游戏中,渲染引擎可能只提供多用途的材质及着色功能,“妖兽”可能完全是用数据去定义的。没有工作室可以完美地划分游戏和引擎。

这不难理解,因为随着游戏设计的逐渐成形,这两个组件的定义会经常转移。似乎游戏界引擎专家也无法真正给引擎下一个明确定义,虽然大家都知道什么是游戏引擎,却很难用三言两语把它表述出来。游戏引擎VS汽车发动机在这里我们打个形象的比喻介绍3D游戏引擎——以汽车的发动机为例。

图1:汽车引擎驱动汽车在公路上行驶的是发动机引擎,汽车发动机引擎是驱动汽车行驶的动力源。不论是油箱还是驱动轴等,都要受发动机的控制,换句话说,发动机就相当于一个控制模块,控制所有其他设备运行。发动机的性能也决定了汽车的性能,围绕发动机引擎可以制造出多款不同型号的汽车。3D游戏引擎的原理与汽车发动机引擎的原理是类似的,游戏的逻辑模块也是在游戏引擎的基础上实现的,游戏开发者只要调用引擎提供的接口编写逻辑。引擎的渲染效率直接影响游戏运行效率,引擎的渲染品质直接决定了游戏的渲染品质。当然,用同一款引擎可以做出许许多多款游戏,最直观的就是商业引擎,比如Unity和虚幻引擎,使用它们研发的产品种类非常多。游戏引擎是如何诞生的?十多年前,笔者刚踏入游戏公司做研发时,公司当时并没有3D游戏引擎,公司研发游戏都是在上款己研发好的产品基础上进行修改的,换句话说就是“换皮”。做的时间久了会遇到相同的代码逻辑在不同的游戏项目里面重复出现的现象,行业里面俗称“重复的造轮子”,开发者在开发产品时通常的做法就是复制粘贴,导致项目出现Bug的概率非常高,大大降低了研发效率。为了改变这种现状,公司安排专人尝试着把游戏里面常用的代码抽离出来,重新做一个新工程编译成静态库LIB或动态库DLL,这样3D引擎的雏形开始形成了。随着工程的代码量不断增加完善,久而久之,3D游戏引擎就形成了。开发3D游戏引擎目的是简化游戏制作的复杂度,缩短游戏开发周期,降低产品制作成本,因为封装好的引擎可开发多种类型的产品。游戏引擎的艺术数千年以来,艺术家们通过文学、绘画、雕塑、建筑、音乐、舞蹈、戏剧等传统艺术形式充实人类的精神层面。自20世纪中叶,计算机的普及派生出另一种艺术形式——电子游戏。

图2:颇具艺术性的游戏画面游戏结合了上述传统艺术以及近代科技派生的其他艺术(如摄影、电影、动画),并且完全脱离了艺术欣赏这种单向传递的方式——游戏必然是互动的,“玩家”并不是“读者”、“观众”或“听众”,而是进入游戏世界、感知并对世界做出反应的参与者。基于游戏的互动本质,游戏的制作通常比其他大众艺术复杂。商业游戏的制作通常需要各种人才的参与,而他们则需要依赖各种工具及科技。游戏引擎便是专门为游戏而设计的工具及科技集成。之所以称为引擎,如同交通工具中的发动机,提供了最核心的技术部分。因为复杂,研发成本高,人们不希望制作每款游戏(或车款)时都重新设计引擎,重用性是游戏引擎的一个重要设计目标。然而,各游戏本身的性质以及平台的差异,使研发完全通用的游戏引擎变得极困难,甚至不可能。市面上出售的游戏引擎,有一些虽然已经达到很高的技术水平,但在商业应用中,很多时候还是需要因应个别游戏项目对引擎改造、整合、扩展及优化。因此,即使能使用市面上最好的商用引擎或自研引擎,我们仍需要理解当中的架构、各种机制和技术,并且分析及解决在制作中遇到的问题。我对游戏引擎的一些看法在IT业界里,与一些程序员聊天时,可能聊到一些游戏的画面如何好看。对于不开发游戏的程序员来说,他们很可能会认为主要由美工在三维软件里创建资源,然后放进所谓“游戏引擎”的黑盒中,就能得到这些结果。但这个黑盒到底做了些什么才能把图形画出来?除了我们肉眼看到的图形之外,游戏引擎还做了什么工作,因而才被称为游戏引擎而不是图形引擎?不开发游戏的程序员可能很难想象出来。甚至由于近年闭源的Unity引擎在商业上的成功,即便是游戏程序员对于这个黑盒的了解程度也比较有限。从软件开发的角度来说,抽象通常是好事。我们一般不需要了解每个CPU的半导体制作工序,不用知悉某操作系统的文件系统采用了哪种数据结构。那为什么巿面上有这么成熟的游戏引擎,多数国际游戏开发商所制作的顶级游戏会采用自研游戏引擎?我认为,一般商用游戏引擎以通用性、易用性为目标,但游戏是多元化的,不同类型的游戏有不一样的需求,同时顶级游戏会尝试研发更前沿、更极致的体验,易用性对于专业团队来说反而是次要的。自主研发游戏引擎,不仅需要大量资金,还需要专业技术人员。你需要找到最好的游戏引擎开发人员,然后让他们长期投入这样的技术建设,而不是开发一些短期能赚钱的项目。我相信,这种长期投资对于国内游戏业的发展非常重要。前些年国内手游的井喷式爆发,导致每款游戏的开发周期从以年计算缩短至以月计算,自研引擎难以跟上这种研发节奏。Unity的成功也促进了游戏公司在商业上的成功,但同时我感到业界的技术人才也出现了严重的断层,新入行的游戏程序员在面对黑盒时大部分情况下只能靠猜,对性能的敏感度也在降低。我个人认为,即使使用通用的游戏引擎,了解游戏引擎的原理和实现对于技术成长也非常重要。知道黑盒的原理和实现,一方面能在使用时更得心应手,另一方面可以针对项目的特殊需求去扩展游戏引擎的功能。近年EpicGames对移动平台的投入,以至提供UnrealEngine的源代码,吸引了不少项目采用。总之,了解游戏引擎的理论和实现已经成为游戏项目中的技术关键之一。游戏引擎技术在国外发展十分迅速,根本原因在于国外的从业者有很扎实的基础,每一代引擎都是根据游戏迭代而来的。国内游戏行业起步相对较晚,再加上从业者有时急于求成,引擎的人才积累远远不如国外,导致国内的自研引擎企业寥寥无几。学习游戏引擎开发的门槛很高,不具备一定知识是很难自学的,这就让很多想学习引擎的人觉得遥不可及。典型游戏开发团队的结构是怎样的?在开始钻研游戏引擎之前,先简单介绍一下典型游戏团队的人员配置。游戏工作室(gamestudio)通常由5个基本专业领域的人员构成,包括工程师(engineer)、艺术家(artist)、游戏设计师(gamedesigner)、制作人(producer)及其他管理/支持人员(市场策划、法律、信息科技/技术支持、行政等)。每个专业领域可细分为多个分支,以下逐一介绍。工程师工程师设计并实现软件,使游戏及工具得以运行。有时候,工程师分为两类:运行时程序员(runtimeprogrammer)和工具程序员(toolprogrammer)。运行时程序员制作引擎和游戏本身;工具程序员制作离线工具,供整个团队使用,以提高团队的工作效率。运行时/工具两方面的工程师都各有专长:有些工程师在职业生涯里专注单一的引擎系统,诸如渲染、人工智能、音效或碰撞/物理;有些工程师专注于可玩性(gameplay)和脚本编程(scripting);也有一些工程师喜欢系统层面的开发,而不太关心游戏实际上怎么玩;还有些工程师是通才(generalist),博学多才,能应付开发中不同的问题。资深工程师有时候会被赋予技术领导的角色。比如,首席工程师(leadengineer)通常仍会设计及编写代码,但同时协助管理团队的时间表,并决定项目的整体技术方向。从人力资源的角度来说,首席工程师有时候也会直接管理下属。有些公司设有一位或多位技术总监(technicaldirector,TD),负责从较高层面监督一个或多个项目,确保团队能注意到潜在的技术难点、业界走势、新技术等。某些工作室可能还有一个和工程相关的最高职位,这就是首席技术官(chieftechnicalofficer,CTO)。CTO类似整个工作室的技术总监,并履行公司的重要行政职务。艺术家游戏界有云:内容为王(contentisking)。艺术家肩负制作游戏中所有视听内容的重任,而这些内容的品质能够决定游戏成败。下面来了解一下艺术家的不同分工。概念艺术家(conceptartist)通过素描或绘画,让团队了解游戏的预设最终面貌。概念艺术家的工作始于游戏开发的概念阶段,一般会在项目的整个生命周期里继续担任美术指导。游戏成品的屏幕截图常会不可思议地贴近概念艺术图(conceptart)。三维建模师(3Dmodeler)为游戏世界的所有事物制作三维几何模型。这类人员通常会再细分为两类:前景建模师(foregroundmodeler)及背景建模师(backgroundmodeler)。前景建模师负责制作物体、角色、载具、武器及其他游戏中的对象,而背景建模师则制作静态的背景几何模型(如地形、建筑物、桥梁等)。由于人物建模和其他物体或场录的建模在技术及工作方式上有很大分别(例如前者需和动画师紧密合作),所以很多公司打独立的角色建模师(charactermodeler)或称为角色艺术家(characterartist)。纹理艺术家(textureartist)制作称为纹理(texture)的二维影像。这些纹理用来贴附于三维模型之上,以增加模型的细节及真实感。灯光师(lightingartist)布置游戏世界的静态和动态光源,并通过颜色、亮度、光源方向等设定,加强每个场景的美感及情感。动画师(animator)为游戏中的角色及物体加入动作。如同动画电影制作,在游戏制作过程中,动画师充当演员。但是,游戏动画师必须具有一些独特的技巧,以制作符合游戏引擎技术的动画。游戏和动画电影的主要不同之处在于,游戏的角色能回应玩家的输入。这种互动性需要各个动画片段能互相结合,所以其制作过程也和动画电影有所不同。动画捕捉演员(motioncaptureactor)提供一些原始的动作数据。这些数据经由动画师整理后,置于游戏中。音效设计师(sounddesigner)与工程师紧密合作,制作并混合游戏中的音效及音乐。配音演员(voiceactor)为游戏角色配音。作曲家(composer)为游戏创作音乐。如同工程师,资深艺术家有时候会成为团队的领导。一些游戏有一位或多位艺术总监(artdirector),他们是资深的艺术家,负责把控整个游戏的艺术风格,并维持所有团队成员作品的一致性。游戏设计师游戏设计师(gamedesigner)负责设计玩家体验的互动部分,这部分一般称为游戏性。不同种类的游戏设计师,从事不同细致程度的工作。有些(一般为资深的)游戏设计师在宏观层面上设定故事主线、整体的章节或关卡顺序、玩家的高层次目标。其他游戏设计师(又称作关卡设计师,leveldesigner)则在虚拟游戏世界的个别关卡或地域上工作,例如设定哪些地点会出现敌人、放置武器及药物等补给品、设计谜题元素等。其他游戏设计师会在非常技术性的层面上和游戏性工程师(gameplayengineer)紧密合作。部分游戏设计师是工程师出身,他们希望能更主动地决定游戏的玩法。有些游戏团队会聘请一位或多位作家(writer)。游戏作家们的工作范畴很宽,例如,与资深游戏设计师合作编制故事主线,以至于编写每句对话。如同其他游戏专业领域,有些资深游戏设计师也会负责管理团队。很多游戏团队设有游戏总监(gamedirector)一职,负贵监督游戏设计的各个方面,帮助管理时间表,并保证每位游戏设计师的设计在整个游戏中具有一致性。资深的游戏设计师有时候会转行为制作人。制作人在不同的工作室里,制作人(producer)的角色不尽相同。有些游戏公司,制作人负责管理时间表,并同时承担人力资源经理的职责。有些游戏公司里,制作人主要做资深游戏设计师的工作。还有些游戏工作室,要求制作人作为开发团队和商业部门(财政、法律、市场策划等)之间的联系人。有些工作室甚至是完全没有制作人。例如在顽皮狗(NaughtyDog)公司,几乎所有员工,包括两位副总裁,都直接参与游戏制作,工作室的资深成员分担了团队管理工作及公司事务。其他工作人员游戏开发团队通常需要一支非常重要的支持团队,包括工作室的行政管理团队、市场策划团队(或一个与市场研究公司联系的团队)、行政人员及IT部门。IT部门负责为整个团队釆购、安装及配置软硬件,并提供技术支持。发行商及工作室游戏的市场策划、制造及分销,通常由发行商(publisher)负责,而非开发游戏的工作室本身。发行商通常是大企业,例如艺电(ElectronicArts,EA)、THQ、维旺迪(Vivendi)、索尼(Sony)、任天堂(Nintendo)等。很多游戏工作室并不隶属于个别发行商,这些工作室把他们制作的游戏,卖给出最好条件的发行商。还有一些工作室让单一发行商独家代理他们的游戏,其形式可以是签署长期发行合同,或是成为发行商全资拥有的子公司。例如:THQ的游戏工作室都是独立运作的,但THQ拥有这些工作室,并对它们有最终的控制权。艺电更进一步,直接管理其下属工作室。另外,第一方开发商(first-partydeveloper)是指游戏工作室直接隶属于游戏主机生产商(索尼、任天堂、微软)。例如,顽皮狗是索尼的第一方开发商。这些工作室独家为母公司的游戏硬件制作游戏。有哪些著名的游戏引擎?从卡马克的时代开始,国外就有了关于游戏引擎的概念。根据游戏需求的不同,游戏厂商要么自己开发引擎,要么购买商业引擎。但真正的商业引擎不但必须有规范的开发流程,以便于定制化,而且要有后续的技术支持来帮助购买引擎的人解决遇到的各种问题,以保障购买者能够实现想要的功能。但能真正实现商业化的引擎也仅有少数几款。商业引擎数量少,加之每款引擎的授权费用高昂,所以很多团队更愿意自己开发引擎。而几乎每一款知名游戏都有自己的引擎,比如育碧的《刺客信条》、EA的《战地》、科乐美的《实况足球》。但自家的引擎同样需要不断迭代,以保证跟上时代的发展,否则落后的游戏引擎终究会被淘汰。在国内曾经技术匮乏的那个年代,Gamebryo和Ogre算是最早的两款引擎,Gamebryo是用得最多的商业引擎,Ogre是用得最多的非商业引擎。现如今,除了传统大厂商在自己迭代引擎之外,大部分厂商选择了商业引擎。国内厂商更是如此,在3D游戏引擎的选择上都很明确,手机端用Unity,PC端用UnrealEngine。这些引擎不同于以往特定类型的游戏引擎,它们耦合性很低,通用性更好。那些年风光的引擎如下图所示。

图1:那些年风光的游戏引擎游戏引擎曾经百花齐放,如今则大局已定。那么自研引擎是否已是明日黄花了呢?其实这个问题没有明确的答案。如果你的团队有实力,时间相对充足,已经成功开发出游戏,那么迭代自研发当然可以;但如果项目时间紧,要开发的游戏类型与团队已有的引擎类型大相径庭,改动成本高于学习其他商业引擎的成本,那么不妨使用相对成熟的商业引擎。开发引擎是否一定要依托于游戏?开发一款游戏引擎,是否必须要依托于游戏本身呢?开发过游戏引擎的人,或多或少地想过这个问题。传统的游戏引擎都是依托游戏一代一代迭代发展起来的。对于游戏企业来讲,最终目的是做出游戏,所以游戏引擎的目标是为专属游戏服务。游戏需要什么特性,引擎就提供什么功能。商业引擎也是如此,如果一款游戏引擎没有支撑过任何成功游戏作品,大家是不敢去用的。毕竟使用游戏引擎的人一般不是专业引擎开发人员,出现问题后很难快速解决底层问题。就连UnrealEngine这样的引擎也要靠自己的《虚幻竞技场》来撑门面。目前,大部分引擎在内部使用,毕竟谁写的谁清楚,出了问题也能第一时间解决。但是国外游戏引擎的开发氛围要好于国内,游戏引擎技术并没有完全被游戏牵着鼻子走,引擎技术也在反过来逐步推动游戏的发展。游戏引擎的开发者希望能持续地专注于引擎技术的开发,不会因过度依赖游戏而把引擎自身搞得一团糟。不过到目前为止,还没有哪款引擎是能够满足以下几点要求的真正的万能架构:适合所有类型的游戏、所有的游戏功能;可以简单实现游戏设计者想到的各种离奇古怪的想法;极高的效率——事实证明,优化最好的引擎都是针对游戏本身的。引擎开发者心目中的理想引擎或者说许多游戏企业的自研引擎目标是:底层维护分离,具有统一的架构,可以通过底层为不同游戏提供不同的支持。为此,引擎技术人员尽最大可能把游戏需要的技术都完好地集成到引擎中,做到一款引擎可以服务多款不同类型的游戏。然而,理想和现实往往有一定的距离,大部分引擎是为了一款游戏而生的,最根本的原因就是人的成本;这里成本是指技术人员能力、管理者能力、设计游戏能力、招聘、营销等与人的价值有关的东西。国外UnrealEngine算是做得比较好的,UnrealEngine3是比较成功的游戏引擎,用它开发的各种类型的游戏有许多。UnrealEngine算是人力成本相对较低的引擎,国外开发人员的经验积累使他们大多能把控UnrealEngine3,而国内由于开发人员的能力差异,很少人能把控UnrealEngine3(这里不谈市场因素)。所以理想引擎的开发不得不依赖游戏。但事无绝对,Unity传奇般地解决了人的问题,传奇般地实现了当时很多大企业不敢做的事情。抛开Unity易用性不说,它真正实现了引擎架构的组件化。更重要的是,许多人在为它开发功能,使用终极方式解决人的成本问题。这其实不是一个技术问题,即使有人曾经想过让很多人一起开发引擎,但谁又会想过这会成为现实呢?Unity自己没有耀眼的游戏。现在你几乎可以在网络上找到任何想要的内容,比如体素地形网格化、水流方向映射、反向动力学(InverseKinematics,IK)、材质树、技能编辑器,甚至大量的特效、模型、贴图、动画资源,铺天盖地的论坛、教程。Unity只提供底层的基础功能,大部分强大的功能是世界各地的人帮助它完成的,在它自己获益的同时,开发者也在获益。Unity的出现几乎改变了整个商业引擎的格局,它的开放,它的易用性,它的开发流程,都完全超过当时人们的认知,导致一些设计观念陈旧的商业引擎加速地消亡。有能力转变的也只有UnrealEngine,虽然其庞大的代码库让它不能一下子实现转变,但它以快速的迭代不断追赶。Unity更强大的地方在于扩展,所有人都可以给它定制功能,这逼迫UnrealEngine不得不开源。开源的好处会让更多人关注它,为它定制更多的功能插件,许多问题可以轻松地在互联网上搜索到解决方案,这让它的社区也更加壮大。游戏逻辑编程和游戏引擎编程既然要开始游戏编程,首先要选择语言工具,C和C++是开发游戏引擎的首选。游戏编程广义上讲可以分成游戏逻辑编程和游戏引擎编程。然而,它们两者之间的边界往往又没有那么泾渭分明。游戏逻辑开发是指集中力量开发游戏中的剧情和玩法,要决定的是什么时候显示什么内容,什么时候播放什么声音,什么时候通过网络传输什么数据,什么时候这个物体或者人物做某个动作。至于图像如何显示,声音如何处理,数据如何传输,物体动作如何实现,游戏逻辑开发者其实并不用关心,这些归游戏引擎来处理。所以说游戏逻辑负责游戏核心玩法方面的内容,游戏引擎负责底层方面的处理。有人可能会有疑问:“既然你解释了做什么和怎么做,那么可不可以理解为,我想开发一个已经写好了剧本的游戏,既然内容确定了,游戏引擎就应该能给我马上做出来,至于怎么做,我可以不关心吗?”是的,没错,只要你选择的游戏引擎足够强大。成功的游戏是以好的游戏逻辑为基础的,虽然引擎并不是一款游戏成败与否的决定性因素,但好的游戏内容通过好的游戏引擎来实现,会给人一种全新的视觉和听觉感受,会更加震撼人心,这就好比传统的2D电影与3D乃至4D电影的效果对比。游戏逻辑就像电影的剧本,至于能否拍摄出预期的效果,不但取决于导演对剧本的理解和演员的演绎,还取决于拍摄的技术和后期的特效处理。游戏引擎开发涉及到的数学知识数学可以说是引擎的根基,它的作用是不言而喻的。不但开发引擎需要数学知识,而且开发游戏逻辑也需要,所需知识基本覆盖了大学里与数学相关的所有课程——《高等数学》《线性代数》《概率与数理统计》。很多人可以把这些课程学得很好,但能创造性地应用在游戏引擎中的人寥寥无几,能把论文中高深的技术在游戏中真正实现出来的人更是凤毛麟角。加入游戏引擎里的数学算法,大多是已经非常成熟的技术,并且已经被标准程序库化,会有效地使用它们其实已经足够。另外,本教程提及的大部分数学知识是一些基础的数学知识,也是引擎中最常用到的。下面列出的都是我们需要掌握的基本内容。强烈推荐《3D数学基础:图形与游戏开发》这本书。1.向量向量(也称矢量)是指具有大小(magnitude)和方向的量。这是图形学和物理学中经常用到的概念,希望读者能了解2D、3D、4D向量的含义,标量和点的含义。在游戏中,3D向量既可以表示一个方向,也可以表示一个点。读者还要了解向量之间的运算以及对应的含义,包括向量与标量的加减乘除、向量长度、向量点积、向量叉乘、向量单位化、向量加法、向量减法等。2.矩阵矩阵也是图形学中最常用的概念,它的一个作用就是空间变换。对于没有学过线性代数的人来说,矩阵可能有些难以理解,不过也没关系,引擎中最常用的就是3×3矩阵和4×4矩阵。不过这里还要了解关于矩阵的一些特性,包括矩阵的维度、矩阵的逆、矩阵的转置、单位矩阵、方阵、标量和矩阵相乘、矩阵和矩阵相乘、矩阵和向量相乘、向量和矩阵相乘(不同顺序得到的结果也不一样)、正交矩阵、向量与基向量的关系等。3.四元数关于四元数,需要了解的包括四元数的定义以及四元数的模、单位四元数、四元数的逆、四元数的共轭、四元数的点乘和叉乘等,相关的内容在网上非常容易查到。4.几何体引擎中的几何体基本是用来做碰撞检测和相交检测以及求相互距离的。所有的几何体都以参数化方式表示。我们需要弄清楚的是直线、射线、线段、圆、三角形、矩形、平面、球体、立方体、胶囊体等。我们需要用到的是它们之间的相交检测以及点到它们的距离。5.欧拉角欧拉角和坐标轴的指向没什么关系,它是按照方位来定义的,是以前向量(Roll)、右向量(Pitch)、上向量(Yaw)作为旋转轴得到的角度。按不同顺序旋转得到的结果是不一样的,一般有两种旋转顺序,分别为Roll→Pitch→Yaw和Yaw→Pitch→Roll。读者要深刻了解欧拉角、矩阵、四元数之间的相互转换关系。1)分别绕z轴、x轴、y轴旋转AngleZ、AngleX、AngleY角度的矩阵和构建欧拉角的矩阵一样。Matrix(zAxis,AngleZ)*Matrix(xAxis,AngleX)*Matrix(yAxis,AngleY)=Matrix(Roll_AngleZ,Pitch_AngleX,Yaw_AngleY)2)分别绕z轴、x轴、y轴旋转AngleZ、AngleX、AngleY角度的四元数和构建欧拉角的四元数一样。Quaternion(zAxis,AngleZ)*Quaternion(xAxis,AngleX)*Quaternion(yAxis,AngleY)=Quaternion(Roll_AngleZ,Pitch_AngleX,Yaw_AngleY)3)欧拉角到四元数和矩阵的转换并不一定可逆,前提是AngleZ、AngleY的范围是[−π,π],AngleX的范围是[−π/2,π/2]。至于为什么是这样,这里不做过多解释,读者可以根据公式自己推导。游戏引擎中的OpenGL和DirectX很多人听过OpenGL和DirectX这两个名词,其实它们是函数库,这两个函数库用于完成一些与底层打交道的基本工作。DirectX还提供了一些常用的3D函数库。微软在DirectX中做了很多二次开发,用这些二次开发提供的功能来开发小游戏还是不错的,但用来直接支持大型游戏开发则还差得很远。下面主要讨论与底层打交道那部分工作。DirectX与OpenGL的最大功劳在于充分调动和发挥了显卡的性能,把显卡的特性用接口的形式提供,它们各自都有自己的管理层次、管理方法和管理管线。当使用与显卡资源相关的API时,要仔细看这个函数中各个参数的说明,它会根据我们的设定来管理显卡。它管理的只是一部分工作,还有很大一部分工作需要引擎自己处理。如果我们不想自己写驱动或者调用驱动程序接口,但还想控制显卡,则要用到这些API。D3D(DirectX中主要处理3D的API)和OpenGL在使用上还是有很大不同的,学习它们也要花费一些时间。如果不了解3D渲染流程,D3D学起来特别困难。然而,如果先学习制作“软引擎”(用CPU来实现显卡提供的硬件功能),然后回来再学D3D,就容易许多了。3D游戏引擎的原理和架构随着IT产业的蓬勃发展,越来越多的幵源3D引擎、商业3D引擎都涌现出来了,其中最具代表性的有用于移动端开发的Unity3D、用于PC端开发的虚幻4(UnrealEngine4,UE4)以及幵源图形学引擎OGRE。Unity引擎在市面上比较流行,相信大多数IT开发者都使用过,先以Unity3D引擎为例介绍引擎的原理,Unity3D引擎提供了一个功能非常强大的编辑器供用户开发使用。支撑编辑器运行的是许多己经封装好的DLL文件,读者可通过其安装目录查看许多DLL动态库文件,这些封装的DLL动态库就是Unity3D引擎底层封装提供的。游戏开发者在使用其开发游戏写具体逻辑时,也需要利用C#脚本调用动态库DLL封装的函数接口,从而能够执行引擎底层的代码,实现想要的效果。接口的使用可通过查看Unity帮助文档获取,它的底层代码的实现对用户来说是不可见的,但这不妨碍使用者开发项目,因为使用者只要知道函数的功能就可以了。3D引擎本身也是一种3D软件,主要负责处理游戏虚拟世界的渲染,3D引擎架构设计其实非常复杂,用到的知识点非常多,比如设计模式、多线程编程、算法、GPU编程等,但是不管多么复杂,其最基本架构思想还是模块化开发,就比如打篮球一样,不论采用哪种战术跑位,最基本的还是挡拆战术。继续模块思想的讨论,以模块化思想设计的3D引擎便于扩展,可以有效地减少模块之间的耦合性。开发3D游戏引擎时,切记面面倶到;换句话说,3D游戏引擎的主要功能是渲染。在这方面做得比较好的是开源的Ogre图形学引擎及商业引擎UE4,它们核心功能只是负责3D渲染,做3D引擎该做的事情。对于Unity3D引擎,它在3D引擎渲染的基础上还增加了网络库等功能,对于引擎来说显得过于臃肿;当然这里不是说Unity3D引擎不好,只是其功能太多,对开发者来说并不一定是好事情。这种做法对引擎自身来说也不一定是好事情,因为这样引擎的功能失去了重点,所以一提到Unity3D引擎,大家的第一印象是其跨平台功能,与引擎核心功能渲染不搭边,而对于UE4引擎,大家的第一印象是渲染,UE4在渲染这方面做得非常专一,结果就是UE4引擎渲染功能比Unity3D引擎更强大。当然Unity3D引擎的优点也是非常多的,比如引擎的架构设计使用了组件的理念,使用脚本写逻辑,可以跨多个平台等,而且对于初学者上手非常快,这也是它能快速普及的一个主要原因。如果要开发一款引擎具体如何做?引擎由哪些主要模块组成?游戏引擎涵盖的模块非常多,它是一个处理游戏所有逻辑的系统。引擎渲染功能是否强大,决定了游戏渲染品质的高低,以及游戏渲染运行的流畅度。下面简单介绍一下通用的3D游戏引擎架构,如图1所示。

图1:通用的游戏引擎架构游戏逻辑是最顶端的,也就是所说的游戏产品,一般的游戏开发者都是开发这层的逻辑。3D引擎包括了很多功能模块,图1-1所列举的只是比较核心的引擎模块,引擎最终会编译成动态库DLL或者静态库LIB,方便游戏逻辑幵发者调用其函数接口。当然引擎模块内容对用户是不可见的,就像一个黑匣子一样,它里面封装了游戏开发用到的所有模块,比如图1-1所示的声音模块、渲染模块、内存管理、输入系统、物理系统等。游戏引擎的渲染模块会选择使用微软的DirectX库或者开源跨平台的OPENGL、OPENGLES图形库,图1-1所示的是传统的引擎架构图。市面上很多公司研发的跨平台3D引擎,都是基于OPENGLES图形库开发的,比如网龙、网易、腾讯、蜗牛、完美等知名IT公司都有自己研发的引擎,引擎的研发也代表着一个公司的研发实力。对于程序员来说,掌握了3D引擎开发技术,就等于掌握了游戏的核心技能,在国内研发3D引擎的人毕竟是少数,所以3D游戏引擎研发市场缺口很大。所以作为程序员来说,应该努力去掌握3D引擎研发技能,这样在IT激烈的竞争中才能立于不败之地。当然对于个人开发者来说,开发一款功能很强大的引擎是不现实的,其涉及的模块太多,一个人无法在短期之内完成。游戏引擎开发的学习路线很多游戏幵发者认为自己能写逻辑就等于掌握了游戏开发技术,引擎对自己来说无足轻重,这种想法是有问题的。首先你写逻辑是在引擎的基础上写的,其次如果你对引擎一无所知,非常不利于你去深入理解逻辑开发。相反,如果你对引擎有深入的研究,你调用引擎提供的接口时可以很清楚地知道其内部是如何实现的,这样有助于写一些引擎的辅助功能算法,提升自己的编程能力。我以前在xxx公司工作时,项目组就有一位逻辑程序员在做功能时,需要在原有引擎接口的基础上增加一些算法编程以满足游戏玩法,当时他并没有求助引擎组的同事,而是自己写出来了,因为他自己平时就喜欢钻研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引擎要具备哪些条件?网络上有许多这方面的解答,我经过多年对3D游戏引擎的开发研究和实践经验,在此主要总结了以下六点供大家学习参考。1)首先必须掌握主流幵发语言C语言、C++、Java或C#至少一门编程语言。2)编程离不开数据结构,大学课程里面学的数据结构对于游戏开发非常重要,数据结构在游戏开发中主要用于数据存储及内存管理,开发3D引擎常用数据结构有数组、链表、哈希表等,以及常用的一些查找算法:快速排序、二叉树查找、二分査找等,对于常用的数据结构要重点掌握。为引起读者重视,在此再重点强调一下,数据结构对于游戏开发非常重要。3)线性代数对于开发同样非常重要,掌握线性代数的目的是在游戏开发中灵活地运用向量、矩阵、四元数,以及欧拉角这些基本的数学运算解决问题。3D固定流水线中的坐标变换和可编程流

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论