参考博文:【《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.2 BSP树 | BSP Trees

BSP树,即二叉空间分割数,是一种常用于判别对象可见性的空间数据结构,BSP树可以方便地将表面由后往前地在屏幕上渲染出来,适用于场景中对象固定仅视点移动的情况。

BSP 树是一棵二叉树,每个节点表示一个有向超平面,其将当前空间划分为前向(front)和背向(back)两个子空间,分别对应当前节点的左子树和右子树。如果用一种特定的方式遍历,树的几何内容可以从任何角度进行前后排序。
若要创建BSP树,需递归将一个平面空间一分为二,并将几何体归类到这两个空间中来完成。

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

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

  • k-d树:轴循环,即在根节点,先后沿着x轴、y轴和z轴对盒子进行分割,这样就完成了一个循环周期。
  • 另一种分割策略是找到盒子的最长边,沿着最长边分割盒子。

    应用:从前到后粗排序(Rough Front-to-Back Sorting)对于遮挡剔除算法非常有用。而在视点的另一侧进行遍历,可以得到从后向前粗排序(Rough Fack-to-Gront Sorting),对于透明排序非常有用。还可用来测试射线和场景几何体相交的问题,只需将视点位置换为射线原点即可,另外还可用于视锥裁剪。

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

构建方法:将多边形作为分隔物,对空间进行平分。也就是说,在根节点处,选取一个多边形,用这个多边形所在平面将场景中剩余多边形分为两组。对于与分割平面相交的多边形来说,沿着其中的交线将这个多边形分为两部分。然后,在分割平面的每个半空间中,选取另外一个多边形作为分隔物,只对这个分隔物所在平面的多边形进行继续分割,直到所有的多边形都在BSP树中为止。
注:多边形对齐BSP树的创建是一个非常耗时的过程,这些树通常只需计算一次,可以存储起来进行重用。

应用:对于一个给定的视点来说,可以对该结构按照从后往前(或者从前往后)的顺序进行严格遍历,而轴对齐的BSP通常只能给出粗略的排序顺序,可以配合画家算法来绘制整个场景,而无需Z缓冲;相交测试;碰撞检测。

1.3 八叉树 | Octrees

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

1.3.1 松散八叉树 Loose Octrees

松散八叉树的基本思想和普通八叉树一样,但是每个长方体的大小选中比较宽松。而如果一个普通长方体的边长为l,那么可以用kl来代替,其中k>1。

1.4 场景图 | Scene Graphs

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

二、裁剪技术 | Culling Techniques

常见的裁剪技术有:

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

2.1 背面裁剪 | Backface Culling

基本思想:对不可见的内容不需要进行渲染,因为对最终渲染图像没有贡献。

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

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

2.3 入口裁剪 | Portal Culling

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

2.4 细节裁剪 | Detail Culling

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

2.5 遮挡剔除 | Occlusion Culling

有两种主要形式的遮挡裁剪算法,分别是基于点的遮挡裁剪和基于单元的遮挡裁剪。

常见的遮挡剔除方法算法:

  • 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

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

五、点渲染

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

实时渲染学习(十)渲染加速算法总结相关推荐

  1. 实时深度学习的推理加速

    还未完成的...... 作者 Yanchen 毕业于普林斯顿大学机器学习方向,现就职于微软Redmond总部,从事大规模分布式机器学习和企业级AI研发工作.在该篇文章中,作者介绍了实时深度学习的推理加 ...

  2. Python深度学习十大核心算法!

    深度学习已经成为了一种热门的技术,它的应用领域正在不断扩大.在深度学习中,有一些核心的算法是非常重要的,这些算法为深度学习的应用提供了强大的基础.在本文中,我们将介绍基于Python深度学习的十大核心 ...

  3. 【Machine Learning系列】带你快速学习十大机器学习算法

    前言 机器学习算法是一类用于从数据中学习模式和规律的算法.这些算法可以通过训练样本的输入和输出来推断出模型的参数,然后用于预测新的未知数据. 文章目录 前言 机器学习算法 1. 线性回归算法 Line ...

  4. STL源码剖析学习十四:算法之set相关算法

    STL中定义的set要求元素不得重复且已经排序 set算法要求的都是有序区间,但元素可以重复出现 另外提供的hash版本的set因为其元素无序,因此不能作为set函数的参数 set算法前4个参数分别表 ...

  5. Re:从零开始的DS学习 十大排序算法我都整理好了

     前言

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

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/78884513 导读 这是一篇1万3千 ...

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

    本文由@浅墨_毛星云 出品,转载请注明出处.    文章链接:  http://blog.csdn.net/poem_qianmo/article/details/78884513 导读 这是一篇1万 ...

  8. 实时渲染学习(二)GPU渲染管线与可编程着色器

    写在最开始: 参考博文:[<Real-Time Rendering 3rd> 提炼总结](三) 第三章 · GPU渲染管线与可编程着色器 注意区分图形渲染管线和GPU渲染管线.图形渲染管线 ...

  9. “基于云平台的移动终端实时渲染”学习参考

    "基于云平台的移动终端实时渲染"学习参考 之前在看"基于云平台的移动终端实时渲染"时,遇到了很多问题.在解决这些问题的过程中,查阅了大量的资料.此处记录下当时所 ...

  10. 自学习芯片、实时3D表情捕捉渲染,百倍DNN模型无损压缩 | 英特尔中国研究院媒体开放日...

    在人工智能的大背景下,这几年,说起芯片霸主英特尔,似乎总有一股时过境迁的味道.但是,"关于芯片霸主这个问题,判断是不是具有领先性,既不能看近期的市场营收,也不能只看媒体曝光的热度,应该要从一 ...

最新文章

  1. from server sql 拼接统计两个子查询_4复杂查询-SQL
  2. Interview:算法岗位面试—上海某公司算法岗位(偏数据分析,互联网行业)技术面试考点之特征工程考察点
  3. 2018.08.09洛谷P3959 宝藏(随机化贪心)
  4. asp.net core系列 67 Web压力测试工具WCAT
  5. C语言指针作为参数的传递问题
  6. 笨办法学 Linux 中文版 翻译完成
  7. functional correspondence by matrix completion
  8. 外壳程序(shell):命令解释器commond
  9. 【学习笔记】深入理解js原型和闭包(15)——闭包
  10. “我们”是量子计算业内人士,“我们”在炒作
  11. 20HZ信号发生器电路图
  12. gre红宝书词汇量是多少?考试够用吗?
  13. DarkMode(1):产品应用深色模式分析
  14. 加来道雄 基因编辑 纳米机器人_同样基因编辑技术,为什么2位学者获得诺奖,中国贺建奎被痛骂?!...
  15. Win10正式版Guest来宾账户开启使用方法
  16. c语言:(指针)有n个整数,使前面各数顺序向后移动m个位置
  17. 阿拉伯数字小写金额转换成中文大写金C额程序说明
  18. leetcode17 Sum of Two Integers
  19. 小满OKKICRM与金蝶云星空对接集成客户档案
  20. 计算机传票算录入测试,传票算

热门文章

  1. Spark案例之流量统计(三种方法)
  2. 来,让我用Python给你算一命
  3. c语言编译器怎么防止优化变量,volatile关键字的作用:防止变量被编译器优化
  4. 思维导图组件@hellowuxin/mindmap的基本使用
  5. NOIP数学学习笔记 Sakura_xyz
  6. mysql数据库连接池锁_数据库连接池deadlock
  7. tp3.2打印mysql查询语句_[tp3.2.1]sql查询语句(一)
  8. 迅手系统连接不到服务器,逆火快速上手.doc
  9. markdown在线编辑器
  10. mysql聚簇索引和非聚簇索引的区别_聚簇索引与非聚簇索引的区别