【起源粉进阶修炼】V 社游戏引擎画面渲染发展的科普
V 社引擎现在分为三大版本,GoldSource(金源),Source(起源)和 Source 2(起源 2)。它们三个的隔代差距很大。
其实三者代表着三个实时渲染的时代,那么具体是怎么回事呢?

我们总结一下三款引擎渲染层的特性:
金源
· 最基本的纹理映射(Texture Mapping),该技术让二维纹理映射到三维空间内,俗称贴图技术。
· 低级光照模型(环境光 + 漫反射),给予最基本的漫反射光照效果。
· 辐射度算法烘焙的光照贴图。
起源
· 辐射度算法烘焙的光照贴图。
· 高级光照模型(环境光 + 漫反射 + 冯氏 Phong 高光),依托起源的新着色器系统来实现。
· 基于着色器的渲染系统
这个是值得注意的,不知道你发现没有,半条命 2 的宣传语有一段这样的话:

“Source 基于着色器的渲染器与 Pixar 公司制作《玩具总动员》、《怪物公司》等电影时使用的一样,创造出了异常绚丽和真实的场景,在视频游戏中前无古人。”
其实这个说法并不严谨,但也不算错。现代实时渲染着色器的概念是微软搞出 Shader Model 后正式引进,然而计算机图形学界将渲染管线上的任何一个部件都定义为了 “着色器”。
也就是从绝对严谨的角度来讲,金源也包含着自己的一套着色器系统,但是和我们实际使用和叫法的习惯不一样。玩家们一般讨论的着色器是决定 材质(Material)表现 的一种程序,很少具体涉及到什么顶点像素几何计算着色器。包括接下来谈到的也是。
举个更形象的例子,这就像英伟达把自己奉为 GPU(图形处理器)的发明者,然而这种说法是偏向于商业话术,我们都知道 SGI 比英伟达更早实现 GPU 技术上的功能,但英伟达的说法也不算错,因为自己率先在商业上用 “GPU” 来宣传自己。
回到正题,这个基于着色器的渲染器是什么到底是什么玩意?
这里,我放出 2005 年 PS3 主机发布会,黄仁勋的一张演讲 PPT:

这里出现了 Texture Mapping(纹理映射,刚刚讲金源所提到的)和 Shaders(着色器),显然,纹理映射的计算速度非常快,在 PS2 级别主机上就能流畅运行,那个世代对应着金源引擎。但是问题来了:我的材质如何表现得更真实?如果是人的皮肤材质,如何体现出它的高光反射效果?
这就需要着色器了。我们来对比一下纹理映射(金源)和着色器系统(起源)的流程:

显然着色器系统包含了纹理映射的同时,还有一条着色器指令执行计算的管线。在材质输入上,除了纹理,还有法线等。
在着色器中,法线是极其重要的,知道了法线是什么样就等于知道了光照是什么样的,因为多数着色方程都包含 这个式子,也就是 法线 点乘 光源,可以决定光照的明暗。例如起源引擎所使用的 Half-Lambert 漫反射方程,用来求解着色树的 Diffuse 项:
其中:
:出射光照。
:入射光照。
:余弦项。V 社把它的值域限制到了
而不是传统余弦波瓣的
,这意味着起源引擎的光照过渡会比较平缓。
这里放出半条命 2 的着色树结构:

上图,起源引擎通过基于着色器的渲染系统为 Alyx 实现了更加真实的光照效果。
2001 年,英伟达推出首款可编程着色器的 GPU,配合微软的 DirectX 8,着色器的灵活性大幅上涨,在那之后,游戏画质开始出现快速增长的趋势。
至于宣传所使用到的《玩具总动员》等等话术,其实硬要挑刺能挑出来很多,甚至能直接说它是错的,因为本身离线渲染(电影)和实时渲染(游戏)就完全不是一个级别的东西。
不过对普通玩家来说,这说的确实没错,起源相对于金源确实是从传统的纹理映射跳到“影视级”的着色器时代了。
但同时,基于着色器的渲染系统对显卡性能的要求上升了很多。然而对于 HL2 来说,一开始甚至提供了 DirectX 7 的支持,使得 GeForce 256, GeForce4 MX440 这类不可编程着色的 GPU 能正常运行,随之而来的也就是画面打折扣了,例如水面直接成为了一张普通的动态纹理,显然使用了经简化的着色器系统。可以说起源引擎本身还是比较 scalable 的。
上面就是关于起源引擎的东西了。起源引擎基于着色器的渲染代表着可编程着色的新时代,直到今天,我们也仍然受益。接下来,我们就要进入现代了。
起源 2
· 可编程性更高的基于着色器的渲染系统。
· 光线追踪烘焙的光照贴图。相比于前两代的辐射度算法,光线追踪能带来更加高频的细节,烘焙光照更加精细。
· 基于物理渲染的光照(Physically-Based Rendering, PBR)
PBR 大家应该都不陌生了,作为现代游戏引擎的标配技术之一,这里不过多展开。
简而言之,PBR 让材质有了真实的质感,而不仅仅停留于有更加真实的光照效果。PBR 的基础是双向反射分布函数(BRDF),这里也不展开,感兴趣的可以看我写的 s&box 开发 wiki: S&box 的着色器 - S&boxWIKI_BWIKI_哔哩哔哩 (biligame.com)
这里给出两张起源 1 和起源 2 的对比图,可以直观地看出起源 1 传统的光照和起源 2 基于物理渲染的光照有什么区别:

可以看出,地板和墙壁更有质感了。这样的质感是怎么实现的呢?答案就藏在 PBR 的双向反射分布函数里,它可以决定材质表面法线的分布,以此来做出不同的材质光照的质感。(诶又是法线看到没有,法线很重要的)
起源 2 使用了基于现实中总结物理实验得出的 GGX 反射分布(它在 1975 年就已经被提出,不是 V 社搞的),GGX 使得起源 2 的高光质感表现得非常优异。更详细的资料参见这篇论文:S. Trowbridge and K. P. Reitz, "Average irregularity representation of a rough ray reflection". Journal of the Optical Society of America, 65(5):531–536, May 1975.
起源 2 就相当于代表着现在 PBR 渲染的时代,随着时间的推移,硬件性能不断地呈爆发式增长,游戏画面渲染也开始逐步转向基于物理的,符合真实的复杂数学算法,而不是经验性的,绝对理想化的简单算法了。
说了这么多,也差不多该到尾声了。
开头我提到,三者代表着三个实时渲染的时代,具体就是金源的贴图时代,起源的着色器时代以及起源 2 的基于物理渲染时代了。这三个时代都诞生了非常经典的优秀作品,也见证了游戏技术的发展和成熟。
下一个时代具体会是什么样的,谁也不知道。
我们的终极目标是实现完全物理的实时渲染,也就是所有场景的光照,反射,阴影等等都是实时地通过物理正确的方程来计算。
然而这是一种极大的算力开销(从 Portal RTX 就能看出来,然而这玩意也是被砍成残废了的,和离线渲染器的超高采样没法比),目前我们能做的只有处处妥协。
但是,说不定哪天加速算法上又有突破了呢?或者是直接不用几何光学用波动光学体系了呢?如果只要效果,那咱们耍个流氓,说不定哪天生成式 AI 做光照被广泛应用了呢?
谁也说不准。

“坏消息是,我们还有很长一段路要走......
......好消息是,我们还有很长一段路能走。”
—— 选自计算机图形学圣经《Fundamentals of Computer Graphics》

