学习3D引擎架构技术概述_二三维引擎-程序员宅基地

技术标签: 算法与游戏  图形学编程  3D引擎  

      近期对3D引擎的架构设计做了一个梳理总结,现在开发游戏都离不开引擎,这些引擎包括Unity引擎,虚幻引擎,Cocos2dx引擎,自研引擎等等。很多开发者只会利用他们写逻辑,遇到优化问题就束手无策了,遇到Shader编程以及优化就感到头疼,长此以往对自己技术提升非常不利的。要改变现有的状态,就必须要系统的学习相关3D引擎技术,这样才能在使用引擎开发产品时得心应手。本篇博客从三个方面给读者做讲解,一是学习3D引擎;二是选择引擎开发产品,三是如何学习一款引擎,下面先从学习3D引擎开始。

学习3D引擎

   经历过多年的引擎研发和引擎使用,在此我先把学习引擎以及相关技术模块给读者列出来,技术框架图如下所示:


在上述框架图中共分为七部分,每一部分所包含的技术点并不局限于图中所列,在此一一给读者解释一下:

第一部分内容:是告诉读者学习3D引擎架构知识的前提,就是要掌握引擎的编写语言和引擎使用的图形库API接口,以及图形学渲染也就是GPU编程使用的Shader语言,基础知识是必须要掌握的。学习时可以参考这些API提供的Demo,把执行流程搞清楚,自己调试一下就可以了。

第二部分内容: 3D基础知识,比如一个3D模型要在二维屏幕上显示出来,这中间要经历一些矩阵变换才能将其在二维屏幕上显示出来,这种变换过程通常称为固定流水线,就是告诉读者它的显示是按照固定流程,它的计算都是在CPU中完成的;对应的就是可编程流水线,也就是在GPU中完成,其实就是将矩阵变换放到GPU中计算了。

第三部分内容:3D游戏引擎的技术点,在掌握了第二部分内容后,再开始学习第三部分内容,该部分内容针对的是DX的SDK或者OpenGL的SDK,二者都提供了Demo供读者学习,我们要把这些基础的3D引擎技术掌握,最好的方式是自己用手把代码敲一遍,调试一下。

第四部分内容:需要一定的数学知识,引擎的开发或者游戏的开发离不开算法的支持,当然大家也不用对其产生畏惧心理,学习任何事情都不是一蹴而就的,循序渐进的,先从基本的数据结构入手,逐步深入,图中列出的几种算法是引擎中常用的算法,四叉树或者八叉树可以用作地形的绘制,插值算法可以用于实现刀光拖尾等等,A*算法比较经典是寻路使用的,另外还有后处理算法实时阴影的网上都有很多现成的案例。

第五部分内容:这部分内容是核心的架构设计,图中所显示的是组成引擎的各个模块,场景管理模块,该模块非常重要,地形的加载通常是通过分块的方式处理的,比如魔兽地图,显示的是9块,在缓冲中的是16块,随时提供加载,场景中少不了水的渲染,这个也体现了引擎的技术层次,大家可以看看虚幻水的渲染,达到了一个顶级水准。模型插件也是必须的,Unity和现在开源的虚幻使用的都是AutoDesk提供的FBX模型,AutoDesk提供了FBX的API可以直接使用,当然自己也可以开发适用于自己引擎的模型插件,自定义格式。AI模块这里主要是指行为树算法,各种各样的灯光模块也是必须的,对应的就是相机模块,比较常用的是透视摄像机和正交摄像机,特效和UI也是引擎的组成部分,剩下最重要的是物理引擎模块,碰撞检测处理,常用的碰撞算法:Mesh碰撞,球体碰撞,胶囊体碰撞,立方体碰撞,这些碰撞算法的核心是OBB或者AABB算法,当然还有肉体碰撞处理,另外,引擎很重要的部分是关于内存管理,这部分内容将在后面的博客中介绍。

第六部分内容:3D引擎中的GPU编程,这个是令大部分程序员头疼的问题,不同的引擎使用的渲染算法是不一样的,它们主要区别还是在细节贴图方面的区别,以UE4为例,他渲染一个物体使用的材质相比Unity多一些,通过它们渲染的物体就可以看出来。快速的学习GPU编程,网上都有对应的Shader代码,可以直接在此基础上修改。还有可以直接使用Shader编辑器用于Shader的编写,调Shader效果我们可以参考Max或者Maya模型工具中的渲染效果,Max或者Maya中都有渲染Shader,它们功能很强大,引擎是无法与其攀比的,只能与其无限靠近。而且Max和Maya可以为我们提供使用了哪些Shader。该部分内容主要是针对模型的材质渲染。

第七部分内容:主要是针对引擎的后处理渲染,常用的有PSSM,HDR,Blur,Deferred等等,这些效果是在游戏的每帧图像显示之前再进行一遍后处理渲染,然后显示出来,这就是后处理渲染效果。

上图只列举了七部分内容,还有一个技术点,开发者要掌握——设计模式,与引擎开发相关的设计模式比如:单例模式,工厂模式,观察者模式,状态模式等等吧,只要能熟练掌握这些就足够了。上面框架图是给想学习引擎的读者推荐的,作为游戏开发者来说,学习引擎对自己技术提升帮助还是非常大的,不要只局限于逻辑的编写,要想成为主程,技术经理,技术总监必须要学习引擎技术。

以上是关于读者自己学习引擎的内容,现在网上有很多开源引擎,比如:Ogre引擎,虚幻引擎。。。。。

面对这么多开源引擎,作为读者如何去选择一款适合自己产品研发的引擎至关重要。

选择适合项目的引擎

  开发产品首先要做的事情是选择引擎,市面上很多引擎供读者使用,游戏产品从大的方面说是页游,端游,手游;从表现形式来说有2D,3D之分。不同的产品设计对应着不同的引擎选择,现在H5游戏逐步出现了,相关的H5引擎也跟着出来了,比如:白鹭,layaBox,cocos-js。2D引擎目前还是cocos2dx引领,3D引擎的选择有Unity3D引擎和虚幻引擎,二者最大的区别是一个开源,一个不开源,当然掌握难度要看不同的人使用。选择引擎首先要考虑的问题是:

一、是该引擎是否有对应的上线产品出来,可以去下载玩玩,体验一下。

二、与该引擎相关的工具是否完备,比如场景编辑器,特效编辑器。。。。

三、该引擎上手是否比较快,这个也是重点考量的;

四、该引擎相关的文档是否完整或者详细,另外对应的论坛或者社区是否能够快速响应;

五、不同的机型适配性是否满足项目需求;

六、功能扩展性,这个涉及到代码的开源了,有第三方库并且支持第三方库开发;

七、对引擎支持的场景面数以及骨骼动画,特效做一个压力测试;

选择引擎一定要根据自身项目需求来定,这个也关系到项目成败,比如做一些3D仿真项目,要求品质比较高,这个就要考虑虚幻引擎了,当然使用的人必须具备C++编程能力,否则即使你选择对了引擎,但是项目组的人不会用也是不行的。

3D手游开发,这个选择Unity引擎开发,Unity引擎的优点这个大家都知道,就不介绍了,当然缺点也比较明显。

选择好了引擎,如何学习一款引擎,因为你不能保证项目组的每一个人都会使用。

学习一款引擎

 选择好了引擎后,下面就要开始学习了,学习一款引擎可以从先整体后部分,或者说先粗后细的原则。

首先,看一下这款引擎的文档,它主要能解决啥问题。

其次,引擎的架构设计图,从整体上对整个引擎有所了解,以及类层次关系。

以上是粗看,目的是至少做到对引擎有个整体的概念。下面就是细看了,

先从引擎提供的官方Demo入手,把整个执行流程通过调试的方式学习一下,在此过程中也能了解引擎使用的坐标系以及模型格式,模型插件等等吧。而且能对场景的加载处理都有所了解,通过调试的方式可以深入到引擎内部,假设该引擎提供了源代码。下一步再demo的基础上尝试做一些修改,加一些功能,加深对引擎的理解。

对于程序开发者来说,市面上比较常用的引擎技术都是相通的,深入理解了一款引擎,再学习其他引擎就很容易了。我以前是做端游开发的,端游开发的经验对我开发手游帮助很大,我自己也写过引擎,自研引擎的经验对于使用Unity引擎和虚幻引擎这些成熟引擎开发产品就非常容易了。

  开发者在学习引擎时,可以先从Ogre引擎入手,该引擎对与渲染做的比较好,而且该引擎没有其他杂七杂八的东西,比较干净非常有助于开发者学习。以前用Ogre引擎开发过比较著名的端游是《天龙八部》,效果也是不错的,证明该引擎可以用于商业开发,本篇博客只是从大的方面给读者聊了聊3D引擎技术,下一篇给读者介绍关于GPU编程优化的问题。




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jxw167/article/details/80236054

智能推荐

DELL戴尔服务器Windows Server 2008 2012 操作系统安装指导-U盘安装_戴尔s150阵列卡驱动2012_dell s150阵列-程序员宅基地

文章浏览阅读815次,点赞10次,收藏17次。4.2.如果是server2008,那么首先检查RAID是否配好,然后准备另外一个U盘,我们命名为U盘2,把阵列卡驱动放到U盘2中,插在服务器上,此时服务器插着两个U盘,一个是启动盘,一个是U盘2,在看到以上提示时,我们点击Load driver,然后如下图,点击浏览Browse,然后找到阵列卡驱动路径,一般是一个EXE可执行文件,选好后,下一步即可。2.以防步骤1中硬盘与服务器连接有问题,那么在服务器完全关机且切断电源的情况下,需要将硬盘拔下清理灰尘,在重新插上,然后上电开机。配置,而要 Import!_dell s150阵列

Qt/C++开发经验小技巧206-210_设置插件的目录还可以通过在main函数最前面写 qputenv("path", qstring("%-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏19次。有时候需要对文本进行分散对齐显示,相当于无论文字多少,尽可能占满整个空间平摊占位宽度,但是在对支持对齐方式的控件比如QLabel调用 setAlignment(Qt::AlignJustify | Qt::AlignVCenter) 设置分散对齐会发现没有任何效果,这个时候就要考虑另外的方式比如通过控制字体的间距来实现分散对齐效果。QString text = "测试分散对齐内容";//计算当前文本在当前字体下占用的宽度QFont font = ui->label->font();i._设置插件的目录还可以通过在main函数最前面写 qputenv("path", qstring("%1;%2").

数据结构预算法(六) 数组和矩阵(1)_构造一四行五列的二维数组-程序员宅基地

文章浏览阅读412次。数组:抽象数据类型:数组的操作:1.存值 get(index)2.取值 set(index, value)这两个操作定义了抽象数据类型arrayc++数组的索引,且数组时c++的标准数据结构行主映射和列主映射 :数组的应用需要将数组的元素序列化,按照一维排列,因为数组元素一次只能输出或者输入一个。因此必须确定一个输入输出的顺序(即映射关系)。不规则的..._构造一四行五列的二维数组

mac关闭向日葵客户端自启动的方法_mac sunloginclient_desktop 后台自动启动-程序员宅基地

文章浏览阅读5.5k次。自动装了远程控制工具->向日葵客户端后,虽然给我带来了便利,但是也给我带来了个困扰,每次开机,向日葵的客户端都会自启动,去官网问了客服和搜索了很多帖子,方法都不试用,最后经过很长一段时间的摸索,发现了正确的关闭方式。1、首先打开一个 访达窗口2、在访达窗口的右上角搜索框内, 输入:sunlogin 搜索 搜索到如下几个文件: com.oray.sunlogin.agent.plist com.oray.sunlogin.startup.plist ..._mac sunloginclient_desktop 后台自动启动

RabbitMQ-集群模式简介_rabbitmq有哪些集群模式-程序员宅基地

文章浏览阅读3.5k次。文章目录1. 主备模式2. 远程模式3. 镜像模式(现企业中常用模式)4. 多活模式(实现异地数据复制的主流模式)1. 主备模式主备模式:用在并发和数据量不高的情况下,主备模式也称为Warren模式。当主节点宕机时,备用节点会充当主节点的角色,提供服务。主备和主从的区别:主备模式:是读写都在主节点上,备用节点是不进行任何的读写操作的。主从模式:写在主节点,从节点提供读操作。H..._rabbitmq有哪些集群模式

让ubuntu18.04中python命令指向python3_ubuntu设置软链将python指向python3.6-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏7次。发现新装的ubuntu18.04版本中默认安装了python3.6,位置是/usr/lib/python3.6。$python --version 显示没有$python3 --version 显示有3.6版本其实在/usr/lib目录下也有python2.7版本,不知道是没安装或没建立连接反正我的python显示没有该..._ubuntu设置软链将python指向python3.6

随便推点

LINE、SDNE和struc2vec图嵌入算法学习笔记_line 图嵌入-程序员宅基地

文章浏览阅读1.3k次。真实世界的信息网络中,能观察到的直接链接仅占很小的比例,大部分链接都因观察不到而缺失。比如社交网络中,很多线下的关系链并没有百分之百同步到线上。如果顶点vvv和uuu的链接发生缺失,则其一阶邻近度为0,即使实际上它们关系非常密切。因此仅仅依靠一阶邻近度不足以描述网络的全局结构,我们需要寻找方法来解决这种因为大部分链接缺失导致的网络稀疏问题。一阶相似性网络中的一阶相似性是两个顶点之间的局部点对的相似度。对于有边uv(u,v)uv连接的每对顶点,该边的权重WuvW_{uv}Wuv​。_line 图嵌入

自定义View,有这一篇就够了-程序员宅基地

文章浏览阅读7.5w次,点赞176次,收藏668次。我的简书同步发布:自定义View,有这一篇就够了为了扫除学习中的盲点,尽可能多的覆盖Android知识的边边角角,决定对自定义View做一个稍微全面一点的使用方法总结,在内容并没有什么独特,其他大神们的博客上面基本上都有讲这方面的内容,如果你对自定义View很熟了,那么就不用往下看啦~。如果对自定义View不是很熟,或者说很多内容忘记了想复习一下,更或者说是从来没用过,欢迎跟我一起重温这方面的知识_自定义view

iOS 数据存储之keychain_ios 数据存到keychain-程序员宅基地

文章浏览阅读275次。自己参照网上写了个,注意一定要用真机调试_ios 数据存到keychain

element-plus2.5.10版本el-table树形数据设置自定义展开收起图标与插槽图标-第一级才设置索引_element-plus里的tree遍历怎么使用插槽-程序员宅基地

文章浏览阅读4.1k次,点赞6次,收藏17次。el-table树形数据,设置自定义展开收起图标与插槽图标-第一级才设置索引_element-plus里的tree遍历怎么使用插槽

5分钟学会js上传图片校验图片格式、大小、尺寸宽高_js检验图片格式-程序员宅基地

文章浏览阅读3.2k次,点赞4次,收藏6次。js上传图片校验图片格式、大小、尺寸宽高一、前言 js上传图片校验图片格式、大小、尺寸宽高。 在此记录下,分享给大家。二、代码<input type="file" id="imgFile" name="imgFile" onchange="checkImag..._js检验图片格式

Sharding-Proxy——分库分表+读写分离_shardingproxy 分库分表+读写分离-程序员宅基地

文章浏览阅读1.1k次。一、简介sharding-proxy定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前先提供MySQL/PostgreSQL版本,它可以使用任何兼容MySQL/PostgreSQL协议的访问客户端(如:MySQL Command Client, MySQL Workbench, Navicat等)操作数据,对DBA更加友好。向应用程序完全透明,可直接当做MySQL/PostgreSQL使用。适用于任何兼容MySQL/PostgreSQL协议的的客户端_shardingproxy 分库分表+读写分离

推荐文章

热门文章

相关标签