Game Engine

一、游戏引擎与图形学基础

游戏引擎

游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。

渲染基础

  1. 现实与CG世界的光照原理:现实中光源发出光线,打到物体再反弹给眼睛,我们才看见了世界。CG世界也是一样,需要有个光源,发出光线,照亮场景。场景是一个个由三角面组成的模型,面越多,图形越精致。还需要有个摄像机,摄像机前方是一个屏幕,将模型投射到像素,就得到了一张图像,这就是渲染。
  2. 光栅化渲染:投射过程从左到右,从上到下,一行行如窗户栅栏,这种渲染方式就是光栅化渲染。
  3. 其他相关概念:包括Gouraud插值、纹理映射(Texture mapping贴图) 。

二、画面逼真度与光照模拟

画面不逼真的原因

渲染是光的艺术,画面假一定是光出了问题。光线没有单位,模糊的强度度量,最开始是一,被物体反弹后会衰减,衰减多少,由材质决定。 1. 不同材质的光照模型 - lambert材质:模拟粗糙角度的漫反射, ,其中I是入射光,是反射光,是反射光和入射光的角度。 - Phong材质:模拟金属,为环境反射系数,为散射系数,为镜面反射系数。 - Blinn - Phong材质为散射系数。这些都是经验公式,结果不一定准确。 2. 生成逼真图像的关键:想要生成逼真图像,必须模拟光在场景中转播的物理行为,而光的强度和分布又由能量的传输和守恒原理决定。

解决方法 - 渲染方程

  1. 理论基础:在1984年的一篇论文《模拟漫反射表面间光的相互作用》中引入了工程热计算的学科——辐射度量学。1986年Jim Kajiya提出渲染方程,它满足能量守恒,是图形真实感的数学描述,宣告着图形学蛮荒时代的终结,为后人的研究指明了方向。
  2. 渲染方程公式
    • 完整公式为 。其中是反射光,是自发光,是入射光,叫做BRDF双向反射分布函数(代表光线反弹后衰减了多少) 。
    • 简化理解:反射光取决于BRTF (过去各种材质的量化统一,过去的Lambert 和Phong都可以纳入其中 和反射光本身。
    • PBR材质基于物理的模型(实验测算,经验统计,套用真实存在的物理公式),如菲涅尔公式,用于模拟不同角度的折射和反射效果,还有次表面散射(sss材质,可以表现皮肤蜡烛等物体在背光时的半透效果) 。
  3. 求解渲染方程
    • 对渲染方程进行数学变换,写成离散的代数形式,经过一系列推导得到 。左边第一项是自发光项,第二项表示从光源发出后直接打到物体的所有光线(直接光),后面的项表示从光源发出后被其他物体反弹过来的光,叫间接光,次方表示反弹次数。理论上光会反弹无数次,直到光的能量为零 ,直接光和间接光共同照亮场景,即所谓的全局光照。
    • 现实世界都是全局光照,传统的光栅化渲染只有直接光,光源找不到的地方漆黑一片,只能手动补光模拟,补光打破了能量守恒,成像效果依赖灯光师水平。全局光照用物理法则部分消除了真实感渲染的主观性,模拟现实,让画面更逼真,凭借出色画面表现,全局光照诞生不久就被应用于电影领域,引发了CG特效的革命。

三、实时全局光照与光线追踪

实时全局光照的挑战

游戏的每一帧画面都是全局光照,几十年来实时全局光照一直被奉为图形学领域的圣杯。实现实时全局光照很难,原因在于渲染方程是无限项的组合,想要逼真,必须实现非常多的间接光反弹,无限次数的反弹。

光线追踪技术

  1. 原理与发展:光线追踪是图形学领域最出名的全局光照技术,诞生于1980年《一种改进的阴影显示照明模型》Turner Whitted ,1986年被kajiya优化。光线从光源射出,碰到物体后随机反弹,多次反弹后进入摄像机,形成一条光路,像素值由此时的光线决定。实际操作从像素发射光线,多次反射后找到光源,由于光路可逆,可模拟光源发出光线,摄像机接收。为了模拟成像效果更好,通常会让每个像素发射多根光线,像素发射的光线越多,光线反弹的越多,渲染方程就更可能逼近,如果能实现无数次反弹,图像就能百分百准确。
  2. 计算量问题:计算机判定每条光线被哪个三角形反弹,需要计算光线和三角形的交点,再判断交点是否在三角形内,过程复杂。一个大的场景(如原子之心),计算次数是像素数量、每像素发射光线、三角形的数量、光线反弹次数的乘积,是天文数字。这导致好莱坞特效渲染慢,游戏中每秒刷新60帧画面,每帧生成时间不到17毫秒,完成如此大量计算非常困难,所以有“光线追踪是未来的技术,并且永远都是”的说法 。

四、Lumen实现实时全局光照的原理

距离场概念

光线追踪慢在判断光线和三角形是否相交,Lumen引入距离场(Distance Field)概念。取场景中的一个个位置点,计算点到物体的距离,再把这个距离数据存起来,形成距离数值的集合。判断光线和谁相交时,光线打出去后进行步进,步进距离等于光源所在点离它最近物体的距离,以该点为球心,距离为半径的球体空间内无物体,光线可放心前进,到下一点重复操作。通过设定阈值判断光线与物体是否相交,相比传统光线求交判断,距离场每个点的距离提前算好,运行时只查询数据,不做数学运算,速度快。若场景里物体变化,只需重新计算其附近的物体场,仍比传统方法快(以空间换时间)。

表面缓存与解决材质信息问题

Lumen中距离场的源码只占很小一部分,在UE4版本就被用于生成阴影,但未用于加速光线追踪,因为距离场有个致命问题,它不包含材质信息 ,计算机只能靠它判断光线和谁相交,却无法完成光线反弹的计算。为解决这个问题,Lumen创新式地引入了表面缓存的概念,即计算机为了存储光照,专门分配的一个空间。

Lumen实现实时全局光照的具体方式

  1. 全局光照分类与现有算法局限:实时全局光照包括图像空间全局光照(如反射阴影贴图RSM)、3D空间全局光照(如光传播体积LPV、体素全局光照VXCL )、屏幕空间全局光照(如环境光遮蔽AO,包括SSAO、HBAO、SSDO ;屏幕空间反射SSR,包括屏幕空间Ray - Matching、Hierarchical tracing加速结构、着色&采样方法)。目前主流的全局光照基本只提供了一次反弹的间接光,并未真正逼近渲染方程。
  2. Lumen的解决方案
    • 直接光与间接光分离计算:Lumen的思路是分求解直接光和间接光。光线从距离场出发,通过距离场快速找到物体,得到直接光 。理论上直接光会反弹形成间接光,但距离场不提供材质信息,无法判断反弹方式,于是Lumen先将直接光存进表面缓存,再想办法解决间接光。
    • 引入辐射度算法(Raddiosity):工程师将目光转向与光线追踪齐名的全局光照技术辐射度算法。该算法将场景离散成一个个面元,一个面元往外辐射的能量,等于辐射给它的能量之和。通过一系列公式推导,如 (考虑自发光项),可以理解成面元细分得越多,间接光反弹得次数就越多,成像效果也越好 。但求解方程组计算量成指数级增长(高斯消元法复杂度为 )。
    • 复用与迭代计算:游戏里相邻两帧场景中变化的物体不多,可粗略认为大多数面元每一帧接受的光照都差不多,少部分变化的面源对整体结果影响不大,这就是复用,是Lumen实时全局光照的基础。Lumen将面元上一帧接收的光照当成这一帧辐射的能量用于计算,将这帧的光照存进表面缓存。下一帧直接光从光源采得,间接光从表面缓存里取得上一帧存进去的光照,代入公式算出这一帧的间接光,直接光加间接光得到最终光照,再存进表面缓存更新,随着面元增加和帧数增加,计算结果会越来越准确。
    • 场景区域划分与优化:Lumen根据到摄像机的距离,将场景分为四个区域,每个区域的光照采集有对应的加速方案。距离场用于1.8m内的区域的加速,1.8m到200m内使用的是全局距离场和体素等技术,更近的区域使用屏幕空间追踪的全局光照方案。最后将光照和该处的BRDF材质做计算,算出反射光,确定每个像素值。Lumen通过融合两种经典全局光照以及一系列巧妙的工程手段,解开原本无法用于直接求解的渲染方程。

五、游戏引擎的发展与影响

游戏引擎的发展历程

1996年第一款3D引擎Quake诞生,凭借出色的效果,备受游戏厂商追捧,开创了游戏的3D时代。硬件厂商敏锐嗅到商机,3D独立显卡横空出世,不仅扩宽了人们对于游戏的想象,更解放了众多计算机相关的生产力。

游戏引擎的影响

  1. 对芯片产业的推动:电子游戏的升级牵引着图形显卡和游戏引擎技术的迭代,并推动着GPU问世,如今GPU已经成为芯片产业的核心组成,游戏对芯片产业科技的贡献率高达14.9% 。
  2. 在其他领域的应用:游戏引擎的身影早已出现在影视动画,元宇宙,甚至建筑和汽车领域。全球游戏技术风向标GDC大会展示了游戏引擎在深度学习还原沙漠景观、改变传统体育赛事直播形态等方面的应用,游戏引擎驱动的不仅仅是游戏,更是现实世界。现在互联网被冠以“新型工业软件”的称号,是未来数字经济的重要驱动,更是图形工业实力的集群体现 。
  3. 国产自研引擎的发展:GDC大会也有国产自研引擎的身影,腾讯游戏的CROS团队以自研的引擎生动展示了数字长城,这是首个自研引擎在文保领域的应用,改变了国产游戏工业的认知。

图形学的发展与梦想传承

1998年,康奈尔大学研讨会上提到无法模拟在河中游泳的老虎的所有细节,后来这只老虎被引作经典图形学教材《计算机图形基础》的封面。17年后实现一只游泳的老虎已不是难事,这张封面更像是图形学梦想的传承,提醒所有图形学后生,图形学仍面临诸多挑战,仍未摘得那座圣杯,但也意味着还有很长的路可走,激励着人们不断探索。