前言
剔除是游戏引擎中非常重要的技术:现代引擎需要在十几毫秒的预算里,渲染出数以万计的物体,场景复杂度往往是数千万面的级别,同时还需要处理千计盏灯光和数百种材质。对于开放世界类型的游戏更是如此:场景动辄就是数十公里的延伸,想要通过暴力穷举地方法逐一绘制这些物体是不现实的。因此,如何有效地减少不必要的绘制就显得格外重要。
这是一篇很早就想写的话题,也是我入职腾讯后的第一篇技术文章,这篇文章仅就游戏引擎中用到的各种剔除技术进行一个概述,涵盖了从引擎演算法层面到硬体层面的内容。文中会较少涉及细节,感兴趣的同学可以去看文末的引用。
演算法层面的剔除
视锥剔除
视锥剔除是所有3D引擎的标配。实时图形学里,摄像机一般是基于针孔模型:光线经过一个小孔(可认为是一个点)照射到小孔背后的感测器阵列(通常是规则的矩形)上,从而形成图像。从小孔出发,只有与感测器阵列有交点的光线才能够真正进入最终的画面,这个区域就是我们一般说的视锥体。