游戏引擎的内核与游戏的区别

游戏引擎的内核与游戏的区别

电子邮件:

第 1 部分:游戏引擎简介、渲染和构建 3D 世界

介绍

自《毁灭战士》游戏时代以来,我们已经取得了长足的进步。 《DOOM》不仅是一款伟大的游戏,它还创造了一种新的游戏编程模型:游戏“引擎”。 这种模块化、可伸缩和可扩展的设计理念允许游戏玩家和程序员深入研究游戏的核心,并用新的模型、场景和声音创建新的游戏,或者在现有的游戏素材中添加新的东西。 。 大量新游戏是基于现有游戏引擎开发的,其中大部分是基于ID的Quake引擎。 这些游戏包括《反恐精英》、《军团要塞》、《战术行动》、《打击力量》和《雷神足球》。

Tac Ops 和 Strike Force 都使用 Unreal Tournament 引擎。 事实上,“游戏引擎”已经成为游戏玩家之间交流的标准术语,但引擎到底在哪里停止,游戏从哪里开始呢? 像素的渲染、声音的播放、怪物的思考以及游戏事件的触发。 ,游戏中这一切的背后是什么? 如果您曾经思考过这些问题,并且想了解更多有关游戏驱动因素的信息,那么本文将告诉您这一点。 本文分多个部分来深入剖析游戏引擎的核心,尤其是Quake引擎,因为我最近工作的公司Raven Software已经开发了多款基于Quake引擎的游戏,包括著名的《Soldier》财富。

开始

让我们首先看看游戏引擎和游戏本身之间的主要区别。 许多人将游戏引擎与游戏整体混淆。 这有点像将汽车发动机与整个汽车混淆。 您可以将发动机从汽车中取出,再建造一个外壳,然后再次使用发动机。 游戏也是如此。 游戏引擎被定义为所有非游戏特定的技术。 游戏部分是指所谓的“资产”(模型、动画、声音、人工智能和物理)以及使游戏运行或控制其运行方式特别需要的程序代码,例如 AI - 人工智能。

对于任何了解过《雷神之锤》游戏结构的人来说,游戏引擎就是《雷神之锤》。 exe,游戏部分是QAGame。 dll和CGame.dll dll。 如果您不知道这意味着什么也没关系; 我不知道这意味着什么,直到有人向我解释。 但你会准确地理解它的含义。 本游戏引擎指南分为十一个部分。 是的,从数量上来说,一共有十一个部分! 每部分约3000字。 现在让我们从第一部分开始探索,深入探讨我们玩的游戏的核心。 在这里我们将了解一些基本的东西,为后面的章节铺平道路。 。 。

渲染器

让我们从渲染器开始讨论游戏引擎设计。 我们将从游戏开发者(作者背景)的角度来探讨这些问题。 事实上,在本文的各个段落中,我们会经常从游戏开发者的角度进行讨论,让您像我们一样思考!

什么是渲染器以及为什么它如此重要? 好吧,没有它,你将看不到任何东西。 它将游戏场景可视化,以便玩家/观众可以看到场景,让玩家根据屏幕上看到的内容做出适当的决定。 尽管我们下面讨论的内容可能对新手来说有点吓人,但现在请忽略它。 渲染器有什么作用? 为什么有必要? 我们将解释这些重要问题。

在构建游戏引擎时,您通常要做的第一件事就是构建渲染器。 因为如果您看不到任何东西,那么您如何知道您的程序代码正在运行? 超过50%的CPU处理时间花费在渲染器上; 游戏开发者往往在这一部分受到最严厉的评判。 如果我们在这个部门表现不佳,事情就会变得非常糟糕,我们的编程能力、我们的游戏和我们的公司将在 10 天内成为业界的笑话。 这也是我们最依赖外部供应商和力量的地方,他们将处理最多数量的潜在运营目标。 话虽如此,构建渲染器并不像听起来那么吸引人(确实如此),但如果没有好的渲染器,游戏可能永远不会进入前 10 名。

如今,在屏幕上生成像素涉及 3D 加速卡、API、三维空间数学、对 3D 硬件工作原理的理解等等。 对于主机游戏,需要相同类型的知识,但至少对于主机,您不必尝试击中移动目标。 因为主机的硬件配置是固定的“时间快照”,与PC(个人电脑)不同,在主机的生命周期内,其硬件配置不会发生变化。

一般来说,渲染器的工作就是创造游戏的视觉亮点,但实际上实现这个目标需要大量的技巧。 3D 图形本质上是一种以最小的努力创建最大效果的艺术,因为额外的 3D 处理在处理器时间和内存带宽方面非常昂贵。 这也是一个预算问题,并弄清楚你想在哪里花费处理器时间,以及你宁愿在哪里节省一些时间以获得最佳的整体结果。 接下来我们将介绍这方面的一些工具以及如何更好地使用它们来使游戏引擎工作。

构建 3D 世界

最近,当我与一位从事计算机图形学工作多年的人会面时,她向我透露,当她第一次看到计算机 3D 图像的实时操作时,她不知道那是什么。 目前尚不清楚计算机如何存储 3D 图像。 对于今天街上的普通人来说可能也是如此,即使他们时不时玩电脑游戏、主机游戏或街机游戏。

下面我们将从游戏设计师的角度讨论创建3D世界的一些细节。 您还应该看看 Dave Salvator 的《3D Pipeline 简介》,以全面了解 3D 图像生成的主要过程。

3D 对象(对象)在 3D 世界中存储为一系列点(称为顶点),这些点彼此相关,因此计算机知道如何在世界中的这些点之间绘制线条或填充曲面。 立方体由 8 个点组成,每个角对应一个点。 立方体有 6 个面,分别代表其每个面。 这是 3D 对象存储的基础。 对于一些更复杂的 3D 对象,例如 Quake 关卡,将有数千个(有时是数十万个)顶点和数千个多边形表面。

请参阅上图的线框表示。 本质上类似于上面的立方体例子,它只是一个由许多小多边形组成的复杂场景。 模型和世界的存储方式是渲染器功能的一部分,而不是应用程序/游戏的功能。 游戏逻辑不需要知道对象在内存中如何表示,也不需要知道渲染器如何显示它们。 游戏只需要知道渲染器将使用正确的视野来表示对象,并在正确的动画帧中显示正确的模型。

在一个好的引擎中,渲染器应该可以完全替换为新的渲染器,而无需更改游戏中的一行代码。 很多跨平台的引擎,还有很多自研的游戏机引擎都是这样,比如Unreal引擎。 比如这个游戏的GameCube版本的渲染器就可以随意更换。

让我们再看一下内部表示——除了使用坐标系之外,还有其他方法可以在计算机内存中表示空间中的点。

从数学上讲,您可以使用方程来描述直线或曲线并获得多边形,并且几乎所有 3D 显卡都使用多边形作为其最终渲染图元。 图元是可以在任何显卡上使用的最低级别的绘图(渲染)单元。 几乎所有硬件都使用具有三个顶点的多边形(三角形)。 新一代的 nVidia 和 ATI 显卡允许您以数学方式进行渲染(称为高阶表面),但由于这不是所有显卡的标准3D角色,因此您还不能依赖它作为渲染策略。

从计算角度来看,这通常有点昂贵,但它通常是新实验技术的基础,例如陆地表面的渲染或物体上锐利边缘的柔化。 我们将在下面的补丁部分更详细地介绍这些高阶曲面。

剔除概述

问题来了。 我现在拥有一个由数十万个顶点/多边形描述的世界。 从第一人称视角来看,我站在我们的 3D 世界一边。 世界上的一些多边形在视野中是可见的,而另一些则不可见,因为某些物体(例如可见的墙)遮挡了它们。 即使是最好的游戏编码员也无法在当前 3D 显卡的视野中处理 300,000 个三角形,同时仍保持 60fps(主要目标)。 显卡无法处理它,因此我们必须编写一些代码来删除那些不可见的多边形,然后再将它们交给显卡进行处理。 这个过程称为剔除。

有许多不同的扑杀方法。 在深入研究这些之前,让我们先探讨一下为什么显卡无法处理极高的多边形数量。 我的意思是,最新的显卡不能每秒处理数百万个多边形吗? 不是应该可以处理的吗? 首先,您必须了解多边形生成率的营销声明和现实世界的多边形生成率。 营销上宣称的多边形生成率是显卡理论上能够达到的多边形生成率。 如果所有的多边形都在屏幕上,相同的纹理,相同的大小,并且将多边形发送到显卡的应用程序除了发送多边形之外什么也不做,则确定了显卡此时可以处理的多边形数量由图形芯片制造商提供。 给你的数字。

然而,在真实的游戏情况下,应用程序通常会在后台执行许多其他操作 - 多边形的 3D 变换、光照计算、将更多纹理复制到显卡内存等。不仅将纹理发送到显卡,还有每个多边形的细节。 一些较新的显卡允许您将模型/世界几何细节实际存储在显卡内存本身中,但这可能很昂贵,并且会占用通常可用于纹理的空间,因此您最好确保它在每个帧中都存在。 使用这些模型的顶点,否则您只是在浪费显卡上的存储空间。 这就是我们要说的。 重要的是游戏运营,当你实际使用显卡时,你不一定能达到显卡包装盒上看到的指标。 如果您的 CPU 速度较慢或没有足够的内存,则这种差异将会很明显。 特别真实。

基本消除方法

最简单的剔除方法是将世界划分为多个区域,每个区域都有一个其他可见区域的列表。 这样,您只需显示任何给定点的可见部分。 如何生成可见视野区域列表是诀窍。 此外,有很多方法可以用来生成可见区域列表3d游戏引擎设计,例如BSP树、窥视孔等。

我确信您在谈论 DOOM 或 QUAKE 时听说过 BSP 这个术语。 它代表二进制空间划分。 BSP 是一种将世界划分为小区域的方法。 通过组织世界上的多边形,可以轻松确定哪些区域可见,哪些区域不可见,这使得不想做太多绘图工作的基于软件的渲染器变得更容易。 它还可以让您以非常有效的方式了解您在世界的哪个位置。

在基于窥视孔的引擎中(由 3D Realms 取消的 Prey 项目首次引入游戏世界),每个区域(或房间)都有自己的模型,每个区域的门(或窥视孔)都可以看到其他区域。 部分。 渲染器将​​每个区域单独绘制为单独的场景。 大致是这样的。 可以说这是任何渲染器的必要部分,而且非常重要。

尽管其中一些技术被归类为“遮挡剔除”,但它们都有相同的目的:尽早消除不必要的工作。 对于FPS游戏(第一人称射击游戏)来说,视野中往往有很多三角形,玩家负责控制视野。 丢弃或消除看不见的三角形是绝对必要的。 空间模拟也是如此,您可以看到很远的地方 - 排除超出视觉范围的事物很重要。 对于视野有限的游戏 - 例如 RTS(即时战略游戏) - 这通常更容易实现。 通常渲染器的这部分仍然由软件完成,而不是由显卡完成。 显卡完成这部分工作只是时间问题。

基本图形管线流程

举个简单的例子,从游戏到多边形绘制的图形管线流程大致是这样的:

• 游戏决定游戏中的对象、它们的模型、使用的纹理、它们可能位于哪些动画帧中以及它们在游戏世界中的位置。 游戏还确定相机的位置和方向。

• 游戏将这些信息传递给渲染器。以模型为例,渲染器首先查看模型的大小和相机的位置,然后决定模型是否在屏幕上完全可见,或者在屏幕上完全可见。观察者的左侧(相机视野)、观察者的后面或远处。

并且不可见。 它甚至使用一些世界确定来确定模型是否可见。 (见下文)

• 世界可视化系统确定摄像机在世界中的位置,并根据摄像机的视野确定世界的哪些区域/多边形可见。 有很多方法可以实现这一点,从将世界分成多个区域的蛮力方法,每个区域都很简单“我可以从区域 D 看到区域 AB 和 C”,到更复杂的 BSP(二进制空间)分区)世界。 通过这些剔除测试的所有多边形都将传递到多边形渲染器进行绘制。

• 对于传递给渲染器的每个多边形,渲染器根据局部数学(即模型动画)和世界数学(相对于相机的位置?)来变换多边形,并检查多边形是否背对相机(即远离相机)。 背面的多边形将被丢弃。 渲染器根据其发现的附近灯光来照亮非背面多边形。 然后,渲染器查看多边形使用的纹理,并确定 API/显卡使用哪个纹理作为其渲染的基础。 在这里,多边形被发送到渲染 API,然后发送到显卡。

显然这过于简单化了,但你明白了。

下图取自 Dave Salvator 的 3D Pipeline 文章,应该为您提供一些更具体的细节:

3D 管道 - 高级概述

1. 应用/场景

•场景/几何数据库遍历

• 物体移动、观察相机移动和瞄准

•对象模型的动画移动

•3D世界内容的描述

• 对象的可见性检查,包括可能的遮挡剔除

•细节级别(LOD)的选择

2. 几何

•变换(旋转、平移、缩放)

•从模型空间到世界空间的转换(Direct3D)

•从世界空间变换到观察空间

•视图投影

•接受/拒绝消除的详细信息

• 背面剔除(也可以在后面的屏幕空间中完成)

照明

•透视分割-变换到剪切空间

•庄稼

•转换到屏幕空间

3. 三角形生成

• 背面剔除(或在照明计算之前在视图空间中完成)

•坡度/角度计算

•扫描线变换

4. 渲染/光栅化

•染色

•质地

•多雾路段

•Alpha透明度测试

• 深度缓冲区

•抗锯齿(可选)

•展示

通常,您会将所有多边形放入某个列表中,然后按纹理对列表进行排序(因此您只需将纹理发送到显卡一次,而不是每个多边形一次),等等。在过去,多边形将被排序根据距相机的距离,首先绘制距相机最远的那些,但现在随着 Z 缓冲的出现,这种方法不再那么重要了。 当然,那些透明的多边形是例外,可以在绘制完所有非半透明的多边形之后再绘制3d游戏引擎设计,这样其后面的所有多边形都能正确出现在场景中。 当然,像这样,你实际上必须从后到前绘制这些多边形。 但通常在任何给定的 FPS 游戏场景中,通常不会有太多透明多边形。 看起来可能有,但与不透明多边形相比,该比例实际上相当低。

一旦应用程序将场景传递给 API,API 就可以利用硬件加速的变换和光照 (T&L),这在当今的 3D 显卡中很常见。 无需深入讨论此处涉及的矩阵数学(请参阅 Dave 的 3D 管道简介),几何变换允许 3D 显卡随时根据相机的位置和方向以正确的角度和位置绘制多边形,因为您尝试。

每个点或顶点都有大量的计算,包括剪切操作,确定任何给定的多边形是否实际上可见、在屏幕上完全不可见或部分可见。 光照操作计算纹理颜色的亮度,这取决于世界光投射到顶点的角度。过去,处理器处理这些计算,但现在,现代图形硬件可以为你做这件事,这意味着你的

然后处理器可以做其他事情。 显然这是一件好事(tm),因为你不能指望 T & L 在市场上的所有 3D 显卡上都可用,所以无论如何你都必须自己编写所有这些例程(再次从游戏开发者的角度解释) )。 您将在本文的不同段落中看到术语“good thing(tm)”。 我认为这些功能对于让游戏看起来更好做出了非常有用的贡献。 毫不奇怪,您也会看到相反的情况; 你猜对了,坏事(tm)。 我正在尝试对这些文字进行版权保护,您需要支付少量费用才能使用它们。

曲面片(高阶曲面)

除了三角形之外,曲面的使用现在也变得越来越普遍。 因为他们可以使用数学表达式来描述几何体(通常涉及某种弯曲几何体),而不是仅仅列出大量多边形及其在游戏世界中的位置,所以曲面片(高阶曲面的别称)非常好。 这样,您实际上可以根据方程动态构建(和变形)多边形网格,并决定您实际希望从面片中看到多少个多边形。 因此,例如,您可以描述一个管道,然后世界上可以有很多该管道的示例。 在某些房间中,您已经显示了 10,000 个多边形,您可以说:“因为我们已经显示了很多多边形,并且任何更多的多边形都会降低帧速率,因此该管道应该只有 100 个多边形。 ” ”。但在另一个房间里,视野中只有 5,000 个多边形可见,你可以说,“因为我们还没有达到可以显示的多边形数量的预算,所以这个管道现在可以有 500 个多边形。 “非常精彩的东西 - 但你必须首先了解所有这些并构建网格,这并不简单。通过 AGP 发送同一对象的表面方程确实比发送大量顶点的成本要低。SOF2 使用这种方法的变体来构建其表面系统。

事实上,当前的 ATI 卡具有 TruForm,它采用基于三角形的模型,并将该模型转换为基于高阶表面的模型,对其进行平滑处理 - 然后将模型转换回基于高阶表面的模型三角形数量的十倍。 三角形模型(称为重新细分)。 然后将模型发送到管道进行进一步处理。 事实上ATI只是在T&L引擎之前添加了一个阶段来处理这个过程。 这里的缺点是您必须控制哪些模型需要平滑,哪些模型不需要。 通常,您希望某些边缘更锐利,例如鼻子,但它的平滑度不正确。 这仍然是一个很好的技术,我可以看到它在未来会被更多地使用。

这是第一部分 - 我们将在第二部分中继续讨论光照和纹理,接下来的章节将进行更深入的讨论。

文章来源:https://blog.csdn.net/lembo520390/article/details/4062958