实时渲染学习(十)渲染加速算法总结

参考博文:【《Real-Time Rendering 3rd》 提炼总结】(十一) 第十四章 : 游戏开发中的渲染加速算法总结

前言

本章主要介绍了一些加速渲染算法,个人认为了解这些加速技术还是很重要的。
本章知识概览:

  • 常用空间数据结构(Spatial Data Structures)
    1)层次包围盒(BVH ,Bounding Volume Hierarchies)
    2)BSP树(BSP Trees)
    3)八叉树(Octrees)
    4)场景图(Scene Graphs)
  • 各种裁剪技术(Culling Techniques)
    1)背面裁剪(Backface Culling)
    2)视锥裁剪(View Frustum Culling)
    3)遮挡剔除(Occlusion Culling)
    4)层次视锥裁剪(Hierarchical View Frustum Culling)
    5)入口裁剪(Portal Culling)
    6)细节裁剪(Detail Culling)
  • 各种层次细节(LOD,Level of Detail)技术
    1)几种LOD切换技术(Discrete Geometry LODs、Blend LODs、Alpha LODs、CLODs and Geomorph LODs)
    2)几种LOD的选取技术(Range-Based、Projected Area-Based、Hysteresis)
  • 大型模型的渲染(Large Model Rendering)
  • 点渲染(Point Rendering)

一、空间数据结构

常用的空间数据结构包括:

  • 层次包围盒(Bounding Volume Hierachy,BVH)
  • 二元空间分割树(Binary Space Partitioning,BSP)
  • 四叉树 (QuadTree)
  • kd树(k-dimensional tree)
  • 八叉树(Octree)
  • 场景图 (Scene Graphs)

1.1 层次包围盒 | Bounding Volume Hierarchies , BVH

层次包围盒常用于层次视锥体裁剪,其核心是用体积略大而几何特征简单的包围盒来近似描述复杂的几何对象,仅需对包围盒重叠的对象进行进一步的相交测试。通过构造树状层次结构,可以越来越逼近对象的几何模型,直到几乎获得对象的几何特征。
实时渲染学习(十)渲染加速算法总结_第1张图片

1.2 BSP树 | BSP Trees

BSP树,即二叉空间分割数,是一种常用于判别对象可见性的空间数据结构,BSP树可以方便地将表面由后往前地在屏幕上渲染出来,适用于场景中对象固定仅视点移动的情况。
实时渲染学习(十)渲染加速算法总结_第2张图片
BSP 树是一棵二叉树,每个节点表示一个有向超平面,其将当前空间划分为前向(front)和背向(back)两个子空间,分别对应当前节点的左子树和右子树。如果用一种特定的方式遍历,树的几何内容可以从任何角度进行前后排序。
若要创建BSP树,需递归将一个平面空间一分为二,并将几何体归类到这两个空间中来完成。

1.2.1 轴对齐BSP树 | Axis-aligned BSP tree

构建方法:将整个场景包围在一个AABB(轴对齐包围盒,Axis-Aligned Bounding Box)中,然后以递归的方式将这个包围盒分为若干个更小的盒子。
分割平面的轴线和位置对提高效率至关重要。

  • k-d树:轴循环,即在根节点,先后沿着x轴、y轴和z轴对盒子进行分割,这样就完成了一个循环周期。
  • 另一种分割策略是找到盒子的最长边,沿着最长边分割盒子。
    实时渲染学习(十)渲染加速算法总结_第3张图片
    应用:从前到后粗排序(Rough Front-to-Back Sorting)对于遮挡剔除算法非常有用。而在视点的另一侧进行遍历,可以得到从后向前粗排序(Rough Fack-to-Gront Sorting),对于透明排序非常有用。还可用来测试射线和场景几何体相交的问题,只需将视点位置换为射线原点即可,另外还可用于视锥裁剪。

1.2.2 多边形对齐BSP树 | Polygon-aligned BSP tree

构建方法:将多边形作为分隔物,对空间进行平分。也就是说,在根节点处,选取一个多边形,用这个多边形所在平面将场景中剩余多边形分为两组。对于与分割平面相交的多边形来说,沿着其中的交线将这个多边形分为两部分。然后,在分割平面的每个半空间中,选取另外一个多边形作为分隔物,只对这个分隔物所在平面的多边形进行继续分割,直到所有的多边形都在BSP树中为止。
注:多边形对齐BSP树的创建是一个非常耗时的过程,这些树通常只需计算一次,可以存储起来进行重用。
实时渲染学习(十)渲染加速算法总结_第4张图片
应用:对于一个给定的视点来说,可以对该结构按照从后往前(或者从前往后)的顺序进行严格遍历,而轴对齐的BSP通常只能给出粗略的排序顺序,可以配合画家算法来绘制整个场景,而无需Z缓冲;相交测试;碰撞检测。

1.3 八叉树 | Octrees

八叉树(octree),或称八元树,是一种用于描述三维空间的树状数据结构。八叉树的每个节点有八个子节点,这八个子节点所表示的体积元素加在一起就等于父节点的体积。

1.3.1 松散八叉树 Loose Octrees

松散八叉树的基本思想和普通八叉树一样,但是每个长方体的大小选中比较宽松。而如果一个普通长方体的边长为l,那么可以用kl来代替,其中k>1。
实时渲染学习(十)渲染加速算法总结_第5张图片

1.4 场景图 | Scene Graphs

BVH、BSP树和八叉树都是使用某种形式的树来作为基本的数据结构,具体区别在于如何进行空间分割和几何体的存储,且均是以层次的形式来保存几何物体。
三维场景的绘制不仅仅是几何体,对动画,可见性,以及其他元素的控制,往往需要通过场景图(Scene Graphs)来完成。场景图是一个面向用户的树结构,可以通过纹理、变换、细节层次、渲染状态(例如材质属性)、光源以及其他任何合适的内容进行扩充,由一棵以深度优先遍历来渲染整个场景的树来表示。
开源的场景图有Open Scene Graph和OpenSG。
实时渲染学习(十)渲染加速算法总结_第6张图片

二、裁剪技术 | Culling Techniques

常见的裁剪技术有:

  • 背面裁剪(Backface Culling):将背向视点的物体删除;
  • 视锥裁剪(View Frustum Culling):将视锥体之外的多边形删除;
  • 遮挡裁剪(Occlusion Culling,也称作遮挡剔除):将被其他物体遮挡的物体删除。

实时渲染学习(十)渲染加速算法总结_第7张图片

2.1 背面裁剪 | Backface Culling

基本思想:对不可见的内容不需要进行渲染,因为对最终渲染图像没有贡献。
实时渲染学习(十)渲染加速算法总结_第8张图片

2.2 层次视锥体裁剪 | Hierarchical View Frustum Culling

基本思想:将物体的包围体与视锥体比较,若包围体与视锥体相交,那么包围体重的内容是可见的。
视锥体裁剪位于应用程序阶段(CPU),只将可见部分发送至渲染管线可以获得一定的加速效果。
实时渲染学习(十)渲染加速算法总结_第9张图片

2.3 入口裁剪 | Portal Culling

在室内场景中,建筑物墙面通常充当大的遮挡物,通过每个入口(如门或者窗户)进行视锥裁剪。当遍历入口的时候,就减小视锥。

2.4 细节裁剪 | Detail Culling

基本原理:当视点处于运动的时候,场景中的微小细节对渲染出的图像贡献甚微。且当视点停下来的时候,通常禁止细节裁剪。细节裁剪可以作为一种简化的LOD技术来实现,其中一个LOD是整个模型,另外一个LOD是空物体。
考虑一个具有包围体的问题,将这个包围体投射到投影平面,然后以像素为单位来估算投影面积,如果像素的数量小于用户定义的阈值,那么不对这个物体进行进一步处理。基于这个原因,细节裁剪也往往被称为屏幕尺寸裁剪(Screen-Size Culling)。

2.5 遮挡剔除 | Occlusion Culling

有两种主要形式的遮挡裁剪算法,分别是基于点的遮挡裁剪和基于单元的遮挡裁剪。
实时渲染学习(十)渲染加速算法总结_第10张图片
常见的遮挡剔除方法算法:

  • Hardware Occlusion Queries 硬件遮挡查询
  • Hierarchical Z-Buffering 层次Z缓冲
  • Occlusion Horizons 遮挡地平线
  • Occluder Shrinking 遮挡物收缩
  • Frustum Growing视锥扩张
  • Virtual occluder 虚拟遮挡物算法
  • Shaft Occlusion Culling 轴遮挡裁剪
  • The HOM algorithm 层次遮挡映射算法
  • Ray Space Occlusion Culling 射线空间遮挡剔除

2.5.1 硬件遮挡查询 | Hardware Occlusion Queries

基本思想:当和Z缓冲器中内容进行比较时,用户可以通过查询硬件来找到一组多边形是否可见,且这些多边形通常是复杂物体的包围体。如果其中没有多边形可见,那么便可将这个物体裁剪掉。即硬件实现对查询的多边形进行光栅化,并且将其深度和Z缓冲器进行比较。

2.5.2 层次Z缓冲 | Hierarchical Z-Buffering

是GPU上做Z-Culling(深度裁剪)的基础。
基本思想:用八叉树来维护场景模型,并将画面的Z缓冲器作为图像金字塔(也称为Z-金字塔(Z-pyramid)),该算法因此在图像空间中进行操作。其中,八叉树能够对场景的遮挡区域进行层次剔除,而Z-金字塔则可以对单个基元和边界体积进行层次Z缓冲。

三、层次细节 | LOD,Level of Detail

细节层次(Level of Detail,LOD)的基本思想是当物体对渲染出图像贡献越少,使用越简单的形式来表达该物体。
通常情况下,雾效会与LOD一起使用。这样可以完全跳过对一些物体的渲染,直接用不透明的雾来进行遮挡。
完整的LOD算法包含3个主要部分:

  • 生成 Generation
  • 选择 Selection
  • 切换 Switching

3.1 LOD的切换 | LOD Switching

当从一个LOD切换到另一个LOD的时候,忽然的模型替换往往会引起观察者的注意。这种现象被称为突越(Poping)。
LOD切换方法主要有:

  • 离散几何LOD:不同的表示是不同图元数量的同一模型,但这种方法Poping现象严重;
  • 混合LOD:在两个LOD之间执行一个线性混合,但混合操作代价较高;
  • 透明LOD:随着LOD选取度量值的增大,物体整体透明度也随之增大,当完全透明时,物体最终就会消失;
  • 连续LOD:基于LOD选取值来精确决定可见多边形的数量;
  • 几何形变LOD:基于简化生成的一组离散模型,且其中模型顶点之间的链接关系保持不变。而网格简化的过程可以从一个复杂的物体中创建各种不同的LOD模型

3.2 LOD的选取 | LOD Selection

常见的三种LOD选取技术是:

  • 基于距离的LOD选取( Range-Based ):将物体的不同LOD于不同距离联系起来;
  • 基于投影面积的LOD选取( Projected Area-Based ):投影面积越大,就选取细节越丰富的LOD;
  • 基于滞后的LOD选取(Hysteresis):引入一个围绕ri值的滞后,减少不必要的Popping现象。

3.3 时间临界LOD渲染 | Time-Critical LOD Rendering

所谓渲染系统有一个固定的帧率,实际上这就是通常所说的“硬实时(Hard Real Time)”或者时间临界(Time-Critical)。通常给定这类系统一个特定时间段,必须在这段时间内完成相应的任务(如图像渲染);当时间到的时候,必须停止处理。如果场景中的物体用LOD来表示,则可以实现硬实时渲染算法。

四、大型模型的渲染 | Large Model Rendering

大型模型的渲染通常会使用多个嵌套的数据结构,使用一个四叉树形式的数据结构来覆盖地球表面。而在每个叶节点内部可以根据具体内容使用不同的数据结构。此外,为了保持合适的帧率,即将进入视野中的模型区域,在需要之前从磁盘中分页,而四叉树也可以在这里使用的。

五、点渲染

将点作为一种新的图元来进行渲染,基本思想是用一个大的点集来表示物体表面并予以渲染。在随后的通道中,使用高斯滤波来填充渲染点之间的间隙。而高斯滤波器的半径取决于表面上点的密度和屏幕上的投影密度。

你可能感兴趣的:(图形学)