游戏渲染中的挑战

游戏渲染和现代图形学之间有着较大的差异,主要是因为其面向的环境不同:

1.游戏渲染系统非常复杂,包含大量的game object和不同的效果;

2.要深度适配现代硬件架构,GPU、CPU;

3.对高帧率与高分辨率越来越高的要求;

4.对CPU性能的有限使用,因为CPU除了渲染之外还要为游戏逻辑、网络、物理、ai系统提供算力。

渲染系统的对象

此部分适合看Games101,在此不多赘述。

了解GPU

SIMD(Single Instruction Multiple Data)单指令多数据流,并发编程。例如向量运算(x,y,z),一个指令可以完成三个运算。

SIMT(Single Instruction Multiple Threads)单指令多线程,可以理解为把多个SIMD同时运行,SIMT+SIMD使显卡运算量运算速度大量提升。

可见性裁剪

以下对几种方法进行介绍:

BVH方法

BVH(Bounding volume hierarchy)即层次包围体,这是一种用来管理3D场景中物体的方法。在BVH中,所有的几何物体都会被包在bounding volume的叶子节点里面,bounding volume外面继续包着一个更大的bounding volume,递归地包裹下去,最终形成的根节点会包裹着整个场景。常用于碰撞检测和光线追踪的加速,能够将时间复杂度降低到关于物体数量的对数级别。

举例:找个volume包围10个物体,如果射线没击中这个volume,那么射线肯定没击中这10个物体。

参考Blog:【光线追踪系列十】光追加速结构(BVH树)-CSDN博客

PVS方法

PVS(Potential Visibility Set)可以理解为透过房间的门和窗最多能看到的房间。该方法也可以用于资源的加载。

这里还会涉及到一个知识,包围盒

AABB包围盒,比较简单,就不讲了。

贴图压缩

游戏引擎不会直接使用JPG、PNG等格式,也不会使用比较主流的一些压缩算法,因为这些格式的纹理不能做到随机访问,无法高效的读取某个像素点的颜色。

一种方法是使用BC,游戏引擎会将一个图片切割成多个4*4的小块,选择该块中最亮和最暗的两种颜色,将其中的所有其他颜色都视作这两个颜色的插值。

建模工具

感觉没有什么多说的,无非是blender,zbrush之类的工具……

渲染管线

背景:游戏的数据量越来越大,例如,模型细节增多,游戏场景增大。这种进步对游戏引擎架构提出更高要求。

Cluster-Based Mesh Pipeline:引擎新的发展方向,两个重要的idea:一是把mesh面片按照一个数量进行分组,根据距离的远近呈现不同面片细分度的mesh模型,这个功能大多数可以通过代码自动化生成;二是根据摄像机的方向和距离动态剔除模型不需要被渲染的面片。UE5的Nanite可以理解为在Cluster-Based Mesh Pipeline基础上的优化。