0. 实时渲染四大目标
• 更高的每秒帧数
• 更高的分辨率
• 渲染更多的物体与更具真实感的场景
• 实现更高的复杂度
1. 空间数据结构 | Spatial Data Structures
空间数据结构(Spatial Data Structures)是将几何体组织在 N 维空间中的一系列数据结构,而
且我们可以很容易地将二维和三维的一些概念扩展到高维之中。这些空间数据结构可以用于
很多实时渲染相关操作的加速查询中,如场景管理,裁减算法、相交测试、光线追踪、以及
碰撞检测等。
空间数据结构的组织通常是层次结构的。宽泛地说,即最顶层包含它之下的层次,后者又包
含更下层的层次,以此类推。因此,这种结构具有嵌套和递归的特点。用层次结构的实现方
式对访问速度的提升很有帮助,复杂度可以从 O(n)提升到 O(log n)。但同时,使用了层次结构
的大多数空间数据结构的构造开销都比较大,虽然也可以在实时过程中进行渐进更新,但是
通常需要作为一个预处理的过程来完成。
一些常见的空间数据结构包括:
• 层次包围盒(Bounding Volume Hierachy,BVH)
• 二元空间分割树(Binary Space Partitioning,BSP),
• 四叉树 (QuadTree)
• kd 树(k-dimensional tree)
• 八叉树(Octree)
• 场景图 (Scene Graphs)
其中,BSP 树和八叉树都是基于空间细分(Space Subdivision)的数据结构,这说明它们是对
整个场景空间进行细分并编码到数据结构中的。例如,所有叶子节点的空间集合等同于整个
场景空间,而且叶子节点不相互重叠。
1.1 层次包围盒 | Bounding Volume Hierarchies , BVH
层次包围盒(Bounding Volume Hierarchies, BVH)方法的核心思想是用体积略大而几何特征简
单的包围盒来近似地描述复杂的几何对象,从而只需对包围盒重叠的对象进行进一步的相交
测试。此外,通过构造树状层次结构,可以越来越逼近对象的几何模型,直到几乎完全获得
对象的几何特征。
对于三维场景的实时渲染来说,层次包围体(Bounding Volume Hierarchy,BVH)是最常使用
的一种空间数据结构。例如,层次包围体经常用于层次视锥裁减。场景以层次树结构进行组
织,包含一个根节点(root)、一些内部节点(internal nodes),以及一些叶子节点
(leaves)。顶部的节点是根,其无父节点。叶子节点(leaf node)包含需渲染的实际几何
体,且其没有子节点。
相比之下,内部节点包含指向它子节点的指针。因此,只要根节点不是这颗树唯一的一个节
点,那么它就是一个内部节点。树中的每一个节点,包括叶子节点,都有一个包围体可以将
其子树中的所有几何体包围起来,这就是包围体层次的命名来源,同时,也说明了根节点有
一个包含整个场景的包围体。
1.2 BSP 树 | BSP Trees
BSP 树(二叉空间分割树,全称 Binary Space Partitioning Tree)是一种常用于判别对象可见性的
空间数据结构。类似于画家算法,BSP 树可以方便地将表面由后往前地在屏幕上渲染出来,
特别适用于场景中对象固定不变,仅视点移动的情况。
其中,BSP 是 Binary SpacePartitioning(二叉空间划分法)的缩写。这种方法递归地将空间使
用超平面划分为凸面体集合。而这种子划分引出了借助于称之为 BSP 树的树形数据结构的场
景表示。
1.3 八叉树 | Octrees
八叉树(octree),或称八元树,是一种用于描述三维空间的树状数据结构。八叉树的每个节
点表示一个正方体的体积元素,每个节点有八个子节点,这八个子节点所表示的体积元素加
在一起就等于父节点的体积。一般中心点作为节点的分叉中心。
简单来说,八叉树的空间划分方式很简单,即递归地进行规整地 1 分为 8 的操作。如下图,
把一个立方体分割为八个同样大小的小立方体,然后递归地分割出更的小立方体。这个就是
八叉树的命名来源。这种分割方式可以得到比较规则的结构,从而使得查询变得高效。
相似地,四叉树是把一个二维的正方形空间分割成四个小正方形。而八叉树是四叉树的三维
空间推广。
1.4 场景图 | Scene Graphs
BVH、BSP 树和八叉树都是使用某种形式的树来作为基本的数据结构,它们的具体区别在于
各自是如何进行空间分割和几何体的存储,且他们均是以层次的形式来保存几何物体。然而
三维场景的绘制不仅仅是几何体。
然而,渲染三维场景不仅仅只是渲染出几何图形,对动画,可见性,以及其他元素的控制,
往往需要通过场景图(Scene Graphs)来完成。
场景图被誉为“当今最优秀且最为可重用的数据结构之一。”Wiki 中的对场景图的定义是
“场景图(Scene Graph)是组织和管理三维虚拟场景的一种数据结构,是一个有向无环图
(Directed Acyclic Graph, DAG)。
场景图是一个面向用户的树结构,可以通过纹理、变换、细节层次、渲染状态(例如材质属
性)、光源以及其他任何合适的内容进行扩充。它由一棵以深度优先遍历来渲染整个场景的
树来表示。
另外提一句,开源的场景图有 Open Scene Graph 和 OpenSG 等,有兴趣的朋友们可以进行进一
步了解。
裁剪技术 | Culling Techniques
层次细节 | LOD, Level of Detail
https://github.com/sp4cerat/Fast-Quadric-Mesh-Simplification 减面算法