当前位置:   article > 正文

剖析虚幻渲染体系(14)- 延展篇:现代渲染引擎演变史Part 1(萌芽期)

剖析虚幻渲染体系

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475
目录* 14.1 本篇概述
+ 14.1.1 游戏引擎简介
+ 14.1.2 游戏引擎模块
+ 14.1.3 游戏引擎列表
- 14.1.3.1 Unreal Engine
- 14.1.3.2 Unity
- 14.1.3.3 CryEngine
- 14.1.3.4 Doom / Quake / ID Tech
- 14.1.3.5 OGRE
- 14.1.3.6 Gamebryo
- 14.1.3.7 BigWorld
- 14.1.3.8 Torque3D
- 14.1.3.9 Source Engine
- 14.1.3.10 Frostbite
- 14.1.3.11 Anvil
- 14.1.3.12 Destiny Engine
- 14.1.3.13 RE Engine
- 14.1.3.14 RedEngine
- 14.1.3.15 RAGE
- 14.1.3.16 PhyreEngine
- 14.1.3.17 Irrlicht
- 14.1.3.18 XNA
- 14.1.3.19 其它引擎
+ 14.1.4 游戏引擎简史
+ 14.1.5 内容概要

14.1 本篇概述

古人有语:以史为鉴,可以知兴替

历史如此,技术亦然。通过研究现代引擎的演变历史,可以更加系统、详细地了解引擎的技术内幕,从而掌握底层原理,挖掘规律,预判技术或行业的未来。恰好这段时间笔者通读了1000多篇各类论文和文献,抽取了其中的数百篇文献,总结归纳成此篇文章,以飨同行。

14.1.1 游戏引擎简介

本节将阐述游戏引擎的定义、功能、模块以及基本框架。

游戏往往有很多共同的功能,将这些功能创建抽象出通用功能的框架,即是游戏引擎(Game Engine)。更准确地说,游戏引擎是一系列模块和接口,使游戏开发团队可以专注于产品游戏内容,而不必关注技术内容。

游戏引擎按照完整性看分为一体式和模块化两种类型。一体式是GameMaker、RPGMaker之类的引擎,模块化的引擎是指UE、Unity之类的引擎。本篇将着重阐述模块化类型的游戏引擎。

游戏引擎是通用游戏所依赖的功能或模块。游戏引擎是一个框架,由一组不同的工具、实用程序和接口构成游戏的各种任务的详细信息。简而言之,游戏引擎可定义为:可扩展的软件,无需重大修改即可用作许多不同游戏的基础。

现代游戏引擎架构的常见模块。

有许多计算机游戏类型,主要有第一人称射击游戏 (FPS)、实时策略 (RTS) 和角色扮演游戏 (RPG)。所有类型都包含单人游戏(其中使用人工智能模拟其他玩家)或多人游戏(其中几个玩家可以通过计算机网络在同一个虚拟世界中互动),或两者兼而有之。而不同的游戏引擎更擅长某些类型的游戏创作。比如Unreal Engine更适合室外的FPS,Unity更适合轻量级的移动端游戏,等等。

大多数现代电脑游戏可以分为三个部分:游戏引擎、游戏逻辑和游戏艺术。游戏引擎是在计算机上运行的主要可执行文件。它提供了一个运行游戏逻辑的环境,以及基本的数学、图形、音频、用户输入和网络功能。游戏逻辑可以采用脚本、虚拟机字节码或库(例如 DLL)的形式。游戏逻辑的任务是控制游戏玩法,并使用引擎适当地展示游戏艺术。游戏艺术包括图片(游戏用语中的纹理)、地图(虚拟世界的布局)、模型(居住在世界上的事物的 3D 表示,例如玩家、武器或花盆)和声音。

游戏和游戏引擎的关系。

游戏、游戏引擎、计算机的抽象分层。

游戏引擎内的常见分层结构和模块。

现代游戏引擎的模块详情。

通过改变游戏逻辑和艺术,可以使用游戏引擎来创建许多不同的计算机游戏。在某些情况下,如果源代码可用(如Quake 2),则可以修改游戏引擎本身。

总之,游戏引擎为游戏创作团队提供游戏开发的方方面面,使得游戏开发者需要更少的编程技能,可以快速、高效地创建出具有专业品质的虚拟内容。游戏引擎的尺寸、模块化和可移植性的增加,以及与之相关的改进工具被认为是从第一款游戏到今天发展的总体趋势。

使用游戏引擎的目的有几个:

  • 灵活性。可以做任何原生 API 让我们做的事情,没有删减功能。
  • 生产率。比原生 API 更易于使用,更少的代码,更少的精神负担。
  • 性能。与手写原生代码类似的CPU帧时间。
  • 简单。保持接口尽可能少而精。


主流商业游戏引擎的部分特性。

利用游戏引擎创作游戏等产品,拥有的好处是:

  • 更少的代码
  • 更高的生产力 = 更少的时间!
  • 可用性(易于使用)
  • 与设计程序的兼容性(集成)
  • 更多工具,更多选择
  • 插件和库
  • 跨平台

当然游戏引擎并非万能,也存在诸多限制,比如:制作与引擎预期不同的类型可能很困难,让引擎做任何意想不到的事情可能很困难,游戏开发者对引擎的弱点会限制游戏的品质和效率。

14.1.2 游戏引擎模块

游戏引擎是游戏或模拟游戏的核心软件,用于描述用于开发游戏的一组代码。在屏幕上看到并在游戏世界或模拟环境中与之交互的一切 均由游戏引擎提供支持。它允许抽象并执行普通游戏的细节或模拟相关的任务(例如渲染、物理、输入),使开发者可以专注于制作他们的游戏的各个方面模拟特性。

典型的游戏引擎组件和类型图。

游戏引擎的设计侧重于灵活性,允许对其功能进行简单扩展,可以很容易地修改以适应受某些因素(如内存等)限制的平台。引擎分为两个不同的部分,称为框架和管理器。框架包含游戏中重复的部分,意味着它们会有多个实例,还包含与主游戏循环的执行有关的项目。管理者是游戏逻辑所依赖的单例。下图说明了组成引擎的不同部分:

游戏引擎最基础的模块必然包含时间更新、场景管理、渲染(图形、绘制)、输入事件等等。

拥有以上基础模块之后,高级一些的游戏引擎,还拥有更多复杂的模块,诸如摄像机、屏幕管理、网络、音频、物理、动画、模型等等。

应用程序维护的屏幕映射表,屏幕可以使用事件或将它们传递到不同的屏幕。

渲染模块是引擎的核心功能,一直以来是游戏引擎的重中之重,也是行业从业人员重点攻克的阵地。一个游戏引擎的成功与否,渲染模块占据非常重要的地位。渲染模块最简单的功能如设置相机、绘制形状、设置形状的材质属性、绘图文本,从而生成标准图形API接口,通过操作系统或(和)驱动程序像GPU发送并执行绘制指令。

高级的游戏引擎往往还有高层的游戏通用模块,如玩家控制、插件体系、编辑器、自动化工具、资产管理等等。游戏引擎还担负着跨平台、图形API、硬件差异等抽象和处理工作。现代游戏引擎往往包含着更加复杂、多样、全面的模块和工具链,可将它们分为低层级、中层级、高层级模块。具体如下:

  • 低层级模块

    • 数据结构
      • 数组、链表、树、图、哈希表
    • 算法
      • 排序、动态规划、并行循环
    • 数学
      • 向量、矩阵、四元数
      • 几何计算
      • 随机数
      • 其它数学模块
    • 内存管理
      • 游戏引擎通常使用自定义内存管理
      • 必须避免碎片化
      • 分层内存管理
      • 寻址
      • 垃圾回收
      • 显卡内存管理
    • 资源和文件IO
      • 快速加载
      • 寻址
      • 解析
      • 文件格式
      • XML
      • 压缩
      • 资源打包
    • 输入设备
      • 控制板、操纵杆
      • 键盘、鼠标
      • 特殊硬件(触觉,6-DOF)
      • 力反馈
      • 麦克风
      • 相机
      • 配置
      • 按钮映射
      • 校准
    • UI
      • 基础控件
      • 事件管理
      • UI动画
    • 性能监测
      • 时间是关键资源
      • 各种硬件,每个都有自己的时序和性能特征:CPU、图形、音频、IO
      • 存在许多复杂的分析器
      • 游戏内预算和警告游戏预算和警告
      • 游戏内绘图 游戏绘图
      • 用于全面分析的调试工具
  • 中层级模块

    • 渲染
      • 详见图形子系统
    • 音频
      • 3D 空间化:平移、多普勒、杜比环绕、HRTF(与头部相关的传递函数)
      • 管理声音优先级(声音)
      • 混响,效果
      • MIDI
      • 音乐
      • 动态音乐
      • 流式传输 CD / DVD(多个流)
      • 语音
    • 文本
    • 碰撞检测
    • 物理学
    • 脚本
    • 联网
    • 角色动画
    • 电影播放
  • 高层级系统

    • 场景管理
    • 用户控制
    • 相机
    • AI(人工智能)
    • 游戏逻辑
    • 游戏流程
    • 灯光、视觉效果
    • 平视显示器
    • 前端(用户界面)
  • 图形子系统

    • 渲染
      • 在硬件之上分层
      • 常用 API:OpenGL、Direct3D、Vulkan、Metal
      • 渲染多边形网格(显示列表)
      • 照明
        • 漫反射、镜面反射、AO、GI、IBL、PBR
      • 图形状态
      • 矩阵和视图转换
      • 着色器
      • 特殊材质
        • 皮肤、头发、眼球、二次元
    • 场景管理
      • 场景图
      • 加速结构:KD树、四叉树、八叉树、Portal、BVH等
      • 贴花
      • AI
      • 碰撞
    • 剔除
    • LOD
    • 地形渲染
    • 角色换肤
    • 粒子引擎
    • 效果(天空、水、植被、雾)
  • 工具

    • 代码开发工具

      • 编译器(Visual C++、SN Systems、CodeWarrior、GNU)
      • 调试器
      • 探查器
      • 编辑
      • 修订控制(CVS、SourceSafe、SVN)
      • 集成开发环境 (IDE)
      • C++、汇编、脚本语言
      • 图形语言:像素和顶点着色器……
      • 设计分析工具
      • 文件、标准
    • 中间件

      • 渲染:RenderWare、NDL、Intrinsic、OGRE、OpenSceneGraph
      • 物理引擎:ODE、Havok、PhysX、牛顿
      • 数学引擎
      • XNA、Bink、FMOD、ScaleForm
    • 艺术制作工具

      • 3D 建模和动画(Maya、3D Studio)
      • 导出导出模块模块
      • 资产管理(AlienBrain)
      • 绘画(2D 和 3D)(Photoshop、Z-Brush、DeepPaint)
      • 扫描(2D、3D)
      • 动作捕捉
      • 游戏内工具和编辑器
    • 音频工具

      • 录音
      • 作曲(ProTools)
      • 音效(原因)
      • 空间音频配置工具
      • 游戏内工具
    • 游戏设计工具

      • 游戏内工具
      • 关卡布局
      • 原型制作工具(Director、Flash)
      • 设计工具
      • 图形用户界面工具
        • CEGUI、NGUI、UMG

    开源渲染引擎OGRE集成的CEGUI编辑器一览。

对于交互,游戏或模拟中的交互游戏或模拟中的交互非常重要,是整体用户满意度的最重要因素。每个游戏/模拟都有自己的要求,具体取决于类型、支持的控件、交互的响应时间、交互响应的真实程度等。每个应用程序的目标群体在很大程度上定义了交互选项。

只要有可能,用户自定义和修改交互参数的能力是必不可少的、至关重要的,例如鼠标移动速度、鼠标移动速度反转、上下轴反转、多上下轴、多模态控制模态控制等。常见的一种游戏执行流程包含处理窗口消息、调度器执行、分发更改、检测执行状态,如下图所示:

通用的场景和物体的关系如下图所示,每个系统包含一个或多个场景,每个场景包含一个或多个物体:

游戏引擎通常由工具套件和运行时组件组成,下图显示了构成典型3D游戏引擎的所有主要运行时组件。像所有软件系统一样,游戏引擎是分层构建的,通常上层依赖于下层,反之则不然。当较低层依赖较高层时,会引发循环依赖。在任何软件系统中都应避免依赖循环,因为它们会导致系统之间出现不良耦合,使软件无法测试,并抑制代码重用,对于游戏引擎这样的大型系统尤其如此。

游戏引擎中常见模块的细节和特性。通常采用了分层架构,上层依赖下层,反之不然,否则会引起不良的循环依赖。(图摘自《Game Engine Architecture Third Edition》)

游戏引擎的工具套件存在多种创作方式,部分工具可能是独立的软件,部分工具可能构建在运行时引擎使用的一些较低层之上,还有一些工具可能内置在游戏本身中。例如,基于Quake和Unreal的游戏都拥有一个游戏内控制台,允许开发人员在运行游戏时输入调试和配置命令。


上:独立的工具架构;下:共享于游戏之间的框架式工具。

游戏引擎分层示意图。

平台相关的模块。

核心系统相关的模块。

游戏逻辑相关的模块。

游戏引擎中涉及的各类管理器如下图所示:

如何识别游戏引擎的通用部分?看待这个问题的一种方法是专注于将游戏引擎定义为除内容之外的所有内容,每个游戏引擎的通用部分将包括:

  • 主循环(或替代结构)
  • 处理游戏数据文件或链接到用代码编写的游戏数据的模块
  • 处理游戏逻辑的模块,可以但不是必须由数据文件指定
  • 从播放器获取输入的模块
  • 将输出呈现给播放器的模块
  • 辅助模块,例如网络和菜单处理

14.1.3 游戏引擎列表

目前市面上的游戏引擎数量达到惊人的上百个,有些是当前风靡全球的商业引擎,有些是研制出很多3A级游戏的游戏公司内部引擎,有些是用于学习或研究的开源渲染器,有些则是曾经流行但现在已经淡出历史舞台的引擎。下面将阐述部分常见的游戏引擎。

14.1.3.1 Unreal Engine

**虚幻引擎(Unreal Engine,UE)**是一款集图形渲染和开发套件的商业引擎,在历经数十年的发展和沉淀,于百擎大战中脱颖而出,成为引领实时渲染领域的全球性的通用商业引擎,广泛应用于游戏、设计、仿真、影视、教育、医学等行业。它出自游戏公司Epic Games,最初由Tim Sweeney负责,从上世纪90年代中期就开始,已经经历了20多年,历经数个大版本迭代。

Unreal Engine 2是一个完整的游戏开发框架,针对当今主流PC、微软的Xbox游戏机和索尼的PlayStation 2。Unreal Engine 2X是Epic自制游戏Unreal Championship 2: The Liandri Conflict中令人瞠目结舌的视觉效果背后的高度优化引擎。

Unreal Engine 3是一个完整的游戏开发框架,适用于下一代游戏机和配备DirectX9的PC,提供顶级游戏开发者所需的大量核心技术、内容创建工具和支持基础设施。虽然Unreal Engine 3对Mod制作者开放程度很高,但使用UE3发布和销售游戏的能力仅限于引擎许可。在2009年11月,Epic发布了一个免费版本的UE3 SDK,称为Unreal Development Kit (UDK),可供公众使用。

Unreal Engine 4相比之前版本有了很大的改进,使之成为一款风靡全球的游戏开发引擎。虚幻引擎是一套完整的构建游戏、模拟和可视化的集成工具。其特性包含但不限于实时逼真渲染、可视化脚本、实时光线追踪、完善的游戏框架、专业动画和过场、完善的工具链等等。

Unreal Engine 5于2020年5月13日发布预览视频,支持所有现有系统,包括次时代游戏主机PlayStation 5和Xbox Series X/S。该引擎的研发工作在发布前约两年就已开始,且在2021年中期发布了Early Access版本的源码,并计划于2022年全面推出。Unreal Engine 5采用了两大核心技术:

  • Nanite:允许将高细节摄影源材料导入游戏的先进技术,可用于处理游戏场景中复杂的几何体;
  • Lumen:用于解决游戏的全局光照细节,并且不依赖于硬件的光线追踪。



从上到下依次是Unreal Engine 1、Unreal Engine 3、Unreal Engine 5的编辑器界面。

早期的Unreal的基于光照图的光照效果。

Unreal Engine作为行业顶级的通用商业游戏引擎,被游戏行业广泛使用,并研制出了许多知名、画面精良的游戏。



用Unreal Engine研发出的游戏截图。从上到下依次是UE3的Batman: Arkham City、UE4的最终幻想7重制版、UE5的黑神话悟空。

有了UE5的Nanite、Lumen等技术的加持,使得实时互动游戏朝着影视级的画质发展,Epic官方放出的黑客帝国演示demo便是最好的例证(下图)。

Epic用UE5研制的黑客帝国互动Demo截图,画质直逼电影,让人无法区分游戏和电影的界限。

除了游戏行业,虚幻引擎还被广泛应用于影视、仿真、设计、广电、科学可视化等领域,并逐渐完善了相配套的工具链和生态社区。

UE用于演习和模拟器中以进行培训。

14.1.3.2 Unity

Unity由Unity Technologies公司研发维护,是一个具有功能强大的编辑器的跨平台游戏引擎,也是最受欢迎的商业引擎之一。在项目中,开发人员可以控制向移动设备、Web浏览器、桌面和控制台的交付。它的功能非常丰富,使用Javascript或C#编写脚本,存在大型社区支持,非常适合跨平台开发。

Unity的第一个版本 (1.0.0)于2005年6月发布,目标是为业余游戏开发者创建一个价格合理的游戏引擎,并为业余游戏开发者提供专业工具,同时“使游戏开发民主化”行业。这三者的灵感来自Apple的Final Cut Pro产品的简单工作流程、简单的资产管道和拖放界面。最初发布时,Unity仅适用于Mac OS X,开发人员只能将他们的作品部署到少数平台。当前版本可以支持Windows 和 Mac OS X等至少十几个目标平台。

Unity早期版本(版本 0.2)的屏幕截图。

早期Unity游戏Gooball截图(2005)。

14.1.3.3 CryEngine

CryEngine系列引擎由德国游戏开发商Crytek设计的游戏引擎,已被用在CryTek的所有游戏中。初始版本在孤岛惊魂中使用,并继续更新以支持他们的游戏的新控制台和硬件。

CryEngine自2004年发布了1代引擎,到目前的版本V,经历了20多年的发展迭代了数个大版本。Ubisoft维护了一个内部的、经过大量修改的原始孤岛惊魂的CryEngine版本,称为Dunia引擎,用于他们后来的孤岛惊魂系列迭代。

CryEngine和其孪生引擎的发展历程。

CryEngine完整的家族树及游戏列表。

CryEngine 1最早于2004年和Far Cry的技术演示一同发布,支持Shader Model 3.0、HDR照明及其它图形特性。游戏代表作有孤岛惊魂、永恒之塔等。

CryEngine的场景和地形编辑器(2004)。

CryEngine的动态光照效果(2004)。

CryEngine的水体、船、人物相互交互的渲染效果和编辑器(2004)。

Far Cry游戏截图。

CryEngine 2于2007年发布,支持HDR照明、实时环境贴图、体积云、动态水体(水面和水下)、景深、运动模糊、动态软阴影、动捕脸部动画、次表面散射、可互动和破坏的环境、可交互植被、绳索物理等特性。代表作有Crysis、Crysis Warhead等。


Crysis游戏截图。

CryEngine 3在2009年发布,相比上一代引擎,引擎支持 DirectX 9、10 和11的开发,新增了许多先进的图形、物理和动画技术以及许多游戏增强功能,比如:实时间接照明的级联光传播体积、软粒子、多核并发、延迟光照、自然光和动态软阴影、雾效果(体积、分层和视距ÿ

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/131675
推荐阅读
  

闽ICP备14008679号