Real - time Rendering 实时计算机图形学
Real - time Rendering 实时计算机图形学
目录
一、图形绘制管线
- 绘制管线:在给定虚拟相机、三维物体、光源、照明模式,以及纹理条件下,生成或者绘制一幅二维图像。
- 最慢的管线决定绘制速度,即图像更新速度,用fps表示,每秒绘制的图像数量,或者用Hz表示。
1、应用程序阶段
- 应用程序阶段通过软件方式实现,能进行完全控制,可以通过改变实现方法来改变实际性能。可以在应用程序阶段通过减少三角形数量来达到目的。
- 检查其它输入信息源,如键盘、鼠标、虚拟现实(VR)中的头盔
- 还包括纹理动画、变换仿真、几何变形、层次视锥裁减等
2、几何阶段
单多边形操作
- 模型与视点变换:每个顶点从模型空间到世界空间到观察空间
- 光照和着色:每个顶点的颜色由光源及其特性、顶点位置和法线、顶点所在的材质属性来计算。
- 投影:将视体变换成一个单位立方体。
- 裁减:只有当图元有部分存在于视体外就是裁减掉
- 屏幕映射:裁减后,将观察空间转化到屏幕坐标系
3、光栅阶段
单个像素操作
- 目的是给每个像素(Pixel)正确配色,正确绘制整幅图像,称为光栅化或者扫描转换。也就是把屏幕空间的二维顶点转化为屏幕上的像素。
二、图形变换
是对物体的位置、方向、大小、形状,以及相机的位置、视点进行控制的基本操作形式。
- 基本变换:平移、旋转、缩放、错切、变换级联、刚体变换、正交变换
- 欧拉变换:E(h,p,r) = RyRxRz,先旋转y轴,再旋转x轴,最后旋转z轴。会出现万向锁。
- 四元数:作为复数的扩展,是一个用来构造强制变换的有力工具,在旋转和定向的情况比欧拉角和欧拉矩阵更有优势。
- 正交投影:平行线经过投影后保持平行,x、y分量不变,z分量设置为0
- 透视投影:距离物体越远,看到的也就越小
三、视觉外观
- 光源:平行光源、点光源和聚光源。
- 光照方式:环境光、漫反射光、镜面反射光
- 材质:材质参数,比如环境amb、漫反射diff、镜面反射apec、光亮度shi、放射率emi
- 着色处理:是计算光照并由此决定像素颜色的过程,3种方法扁平(三角形)、Gouraud(顶点)、Phong(像素)
- 扁平:基于多边形,以三角形为单位进行颜色计算和填充
- Gouraud:基于计算三角形顶点处光照,通过插值计算三角形内部各点的光照
- Phong:基于三角形各顶点的法向量通过插值计算每个像素处的法向量,根据各个像素的法向量计算光照
- 漫反射分量:目的是捕捉不光滑表面的行为,反射光由物体表面法线n和光向量l的余弦决定。
- 镜面反射分量:目的是通过产生高光来使物体表面出现闪闪发光的效果,视野与反射光余弦决定。
- 环境分量:材质和光照强度常量的组合。
- 采样和滤波:图像绘制过程本质是一个采样过程,这是因为图像的生成就是对三维对你进行采样的过程。
- 采样:连续信号采样得到离散信号
- 重建:离散信号重建得到连续信号
- 重采样:就是对样本信号进行放大或者缩小
- 透明度:根据Alpha进行混合,Co(最终颜色) = As(源Alpha)X Cs(源颜色) + (1-As)XCd(目标颜色)
- 雾化:添加到最终图像中的简单大气效果,目的有三种,一是可以提高户外场景的真实度;二是雾化效果随着观察距离变远会逐步增加,可以帮助确定物体所在位置的远近;三是可以通过远平面对物体进行光滑裁减。
四、纹理贴图
- 纹理贴图就是使用图像、函数或者其它数据源来改变物体表面外观。
- 镜面高光纹理:纹理贴图会使材料都具一样的光亮度,为了比较逼真的效果,使用镜面高光纹理应用到物体表面,这种纹理改变表面发光效果,却没有改变物体表面颜色。这样颜色就是彩色图像纹理的颜色,发光效果就是镜面高光纹理的发光效果。
- 凹凸纹理:可以改变表面法线,可以表面粗糙效果。
1、一般纹理贴图
- 顶点颜色计算:需要考虑光照、材质、视点位置。如果有透明度,还要计算雾化效果。
- 纹理贴图是通过改变光照方程中的参数值来实现的,这些值的改变方式基于物体的表面位置。
- 物体表面一点的颜色由纹理贴图对应颜色替代;镜面高光纹理改变光亮度值;凹凸纹理改变表面法线方向。
- 纹理贴图映射过程:
- 物体空间坐标(x,y,z)(-2.3,7.1,88.2)由投影函数将三维向量转换成二元向量uv
- 投影参数空间(u,v)(0.32,0.29)由分辨率256*256,uv乘256得到纹理坐标
- 纹理图像空间(x,y)(81,74)由此坐标得到像素位置的颜色值
- 二维纹理贴图会具有变形和拼接问题,三维纹理可以以材质的形式出现。
- 像素单元指该像素的屏幕网格单元,纹理元素指纹理一个像素的元素。
2、图像纹理贴图
- 放大:图像比较小,而三维物体比较大时,要对图像放大。
- 最邻近方法:不同的纹理元素看上去会很明显,这种效果称为”像素块“。实现是在放大时候,将最近的纹理元素值作为每个像素的中心,从而导致一个块状外观。
- 双线性插值方法:实现是先找到4个相邻的纹理元素,然后在二维空间中线性插值,得到一个混合值。消除了大部分锯齿边缘。
- 缩小:会出现多个纹理元素只覆盖一个像素单元的情况
- 最邻近方法:实现是选择当前像素单元最中心的可见纹理元素,会导致严重走样问题。
- 双线性插值:实现是将4个纹理元素进行混合,如果一个像素受多于4个纹理元素影响,同样会出现走样现象
- 为了防止走样,每个纹理元素至少一个像素。
- 反走样算法基本思想:对纹理进行预处理,同时创建一种数据结构,从而有助于快速计算一组纹理元素对像素的近似影响。这些算法在执行花费时间和资源都是固定的,这意味着对于每个纹理来说,每个像素的样本个数都是固定的。单个样本可以检索到一个或者多个纹理元素的影响。反走样4种方法:
- 分级细化方法(mipmapping):对原始纹理进行反复过滤,直到生成一幅幅比较小的图像。每4个相邻纹理元素平均值生成一个纹理元素值,一直到纹理的二维或者一维等于一个纹理元素为止。
- Ripmapping:思想是对分级细化图进行扩展以包含缩减采样后的矩形纹理区域,可以对这种矩形纹理进行访问。
- 总面积表:创建一个数组,与纹理一样大小,所存储的颜色具有更多的精度位数。
- 非限制各向异性纹理过滤:将像素单元反投影到纹理上,然后对纹理上的四边形多次采样,最后将采样结果结合起来。
3、纹理缓冲与压缩
- 纹理缓冲:目的是为了在速度和纹理所需要的内存空间之间寻找一种平衡
- 纹理管理优化方法
- 使纹理尽量比较小,小到尽可能避免放大问题
- 平铺法(Tiling)或镶嵌法(Mosaicing):需要将一些小非重复的纹理组合成一幅大的纹理图像,目的是避免纹理切换来提高访问速度
- 最后最少使用(Least Recently Used,LRU):这策略通常用于纹理缓冲中,过程是对加载到图形加速器内存中的每一幅纹理,都给予一个时间戳,用来标志上次进行图像绘制的时间;当需要内存空间进行新的纹理加载时,将最早时间戳的纹理卸载。还可以设置优先级,当时间戳相同,先卸载低优先级的纹理。有助于避免不必要的纹理交换。
- 最近最常使用(Most Recently Used,MRU):对交换出缓冲器的纹理进行核查。
- 关于内存、带宽、缓冲问题解决方法:固定比率纹理压缩(Fixed-rate Texture Compression),利用空闲时间,通过硬件对压缩纹理进行解码,一幅纹理就只需要较少的纹理内存空间,还可以提高有效的缓冲器大小。
4、多通路纹理绘制
- 多通路纹理绘制(Multipass Texture Rendering):在不同的通路中对光照因子进行计算,每个通路对前一个结果进行修改。
5、多重纹理贴图
- 多重纹理贴图(Multitexturing):硬件允许在一个绘制通路中使用两个或者更多的纹理。为了将纹理访问的结果组合在一起,定义了纹理混合层叠概念,由一系列纹理阶段组成,第一个纹理阶段将两个纹理值结合起来,通常是RGB和alpha,然后将这个结果发送到下一个纹理阶段。
6、纹理动画
- 应用物体表面图像不一定是静态的,如视频源作为纹理,纹理可以在画面之间进行变化。
7、纹理贴图方法
-
alpha贴图:效果有贴花、减裁,火,植物生长、爆炸、大气效果。alpha值为0,就不需要对当前像素做任何工作。
-
光照贴图:通过使用一个单独、已经计算出光照效果的纹理,并将当前表面结合起来,得到一个类似于Phong着色效果。
-
光泽贴图:能够改变表面镜面反射分量分布的一种纹理,思想是所有的材料属性(材质、光照)可以用纹理来提供,而不用常量或者每个顶点值。
-
环境贴图(Environment Mapping,EM):也叫反射贴图(Reflection Mapping)在曲面上可以对反射效果进行很好的近似。视点以法向量的反射向量方向作为环境图像的索引。算法步骤:
- 生成或者加载一幅表示环境的二维图像
- 对于包含反射物体的每个像素点来说,计算这个物体表面在该点处的法线方向
- 根据视向量和法线计算发射向量
- 使用反射向量计算一个环境图的索引,用来表示反射方向上的物体
- 使用环境图中的纹理元素数据对当前像素进行着色
- Blinn和Newell方法:(球体)极点处纹理坐标会出现错误
- Greene方法:立方体环境贴图(天空盒),把相机放在环境的最中央,然后将环境投影到立方体的六个平面。
- Miller和Hoffman方法:(球面贴图)纹理图像是通过对一个理想的反射球体进行正面观察而得到的环境外观,也叫球面图。
- Heidrich和Seidel方法:(抛物面贴图)两个抛物面透镜使用直径相反的视图来捕捉环境
- 使用环境贴图产生光照效果:环境贴图技术一个重要应用是生成镜面反射和折射效果。
-
凹凸贴图:模拟需要大量多边形才能生成的模型特征。思想是通过纹理访问来改变表面法线,而不是使用纹理来改变光照方程中的颜色分量。不真实效果:轮廓周围、起伏的突块并没有在自身表面上形成阴影。
- 浮雕凹凸贴图
- 点乘凹凸贴图(DOT3凹凸贴图)目前图形硬件使用的主要方法
- 环境图凹凸贴图(Environment Map Bump Mapping,EMBM):在具有光泽的表面上产生凹凸外观,思想是用从凹凸纹理中得到的u和v微分来对环境贴图坐标进行振动,可以抖动反射向量,从而对反射表面的外观效果进行变形。
五、高级光照与着色技术
1、顶点着色器
- 顶点着色器提供了改变每个多边形顶点相关的值,包括颜色、法线、纹理坐标、位置。
- 顶点着色器不会创建也不会消减顶点,在一个顶点上生成的结果不能用于其它顶点。
- 顶点着色器使用4种类型的存储器:输入寄存器、输出寄存器、临时寄存器区域、常量内存。
2、片段着色器
- 像素着色(Pixel Shading)也称片段着色(Fragment Shading),在一个绘制通路中是基于每个像素、每个物体进行的。思想是使用一系列指令对一组常量、插值、纹理值进行操作来生成一个像素的颜色值,同时选择一个alpha值。也可以执行很多操作,如一般相关纹理读取(General Dependent Texture Read)操作(首先计算出纹理坐标,然后由像素着色器来使用),还可以改变z深度值。
- 每一个纹理坐标可以用一个纹理地址指令来访问,这个指令既可以将纹理坐标看作对纹理传统意义上的查询和过滤,也可以将其当作一个向量或部分矩阵。
3、运动模糊
- 运动模糊:是由一个物体在一帧画面中穿过屏幕时的运动产生的。模糊效果方法:
- 使用累积缓冲器对一系列图像取平均,将物体移动到它在一帧画面中所经历的一系列位置,然后将物体绘制到累积缓冲器中,最终结果就可以产生一幅模糊图像。
- 可以用顶点着色器在两个通路中完成。第一个通路中,对物体正常绘制;第二个通路中,顶点着色器将前一帧和当前帧的变换应用到每个顶点,在这些位置处的差别就给予每个顶点一个运动向量。
4、反射
- 反射、折射和阴影都是全局光照效果的示例,反射、阴影等效果可以大幅提高绘制图像的真实感,还有一个作用是可以由视点作为提示信息来确定空间位置关系。
- 平面反射:指平直表面(如镜子)的反射,只是任意表面反射的一个特例,容易实现,执行速度也要比一般反射快。理想反射平面遵循反射定律,认为光线的入射角与反射角相等,也就是入射光与平面法线夹角与反射光与平面法线夹角相等。
- 光泽效果:加强反射平面是镜面的假象,就是对看到的被反射物体进行雾化处理。随着反射面距离增大,使物体逐渐变黑。
- 曲面反射:射线跟踪方法是处理反射问题的一种传统方法。一条反射光线从视点位置出发,然后在反射方向上获得颜色值。
5、折射
- 光线从一种介质进入另一种介质时发生的折射,由两种介质各自的折射率决定。入射角大于或等于折射角。
6、阴影
- 阴影效果:在真实感图像的生成和物体位置的判断方面是一个非常重要的元素。
- 遮挡物(Occluder)是在接收物(Reciever)上会投射阴影的物体,
- 点光源只能产生全阴影区,也称硬阴影(Hard Shadow)
- 面光源或者体光源就会产生软阴影(Soft Shadow)
- 每个阴影都有一个全阴影区,称作本影(Umbra)
- 还有一个部分阴影区域,称为半影(Penumbra)
- 平面阴影:
- 投影阴影:需要对一个三维物体进行两次绘制,这样可以得到一个将物体顶点投影到一个平面上的矩阵。
- 软阴影:可以通过使用各种技术将投影阴影也变成软阴影,目标是在显示软阴影的平面上生成一个纹理。
- 曲面阴影:一种将平面阴影思想扩展到曲面的方法,将生成的阴影图像作为一个投影纹理来处理。光源能看到的就是照亮的部分,不能看到的就在阴影中。这种技术通过阴影纹理(Shadow Texture)也称阴影图(Shadow Map),跟光线贴图类似。用被遮挡的物体纹理坐标,应用了阴影纹理。
- 阴影体:使用模板缓冲器将阴影投影到任意形状的物体上,也称体阴影(Volumetric Shodow)方法。
- 阴影图:可以使用一个基于Z缓冲器的绘制器在任意物体上快速生成阴影。主要思想是使用Z缓冲器算法,从投身阴影的光源位置处对整个场景进行绘制。对于Z缓冲器内的每一个像素,它的z深度值包括了这个像素距离光源最近的物体的距离,一般将Z缓冲器中的整个内容称为阴影图(Shadow Map)。
- 阴影优化:阴影在性能和存储空间会还来比较大的开销,优化会用质量作为代价来换取速度上的提高。
- 使用一个低层的细节层次模型来准确的产生阴影。
- 每隔一帧画面对相关阴影信息进行一次更新。
7、全局光照
- 实时绘制中,通常使用的是局部光照模型,只需要用可见点的表面数据来计算出光照情况。
- 局部光照:光子从光源出发,到达物体表面(忽略中间干扰物体),最后到达眼睛。
- 全局光照:通过反射,光子可以从光源到达某个物体后,发生反弹并到达另外一个光亮物体,然后从这个物体表面反射到眼睛。基本思想是将所有可能路径加起来得到给定方向上的辐射率,如果希望得到更高级的真实感,那么可以增加更多的路径来计算。重点在于,有效计算出各种不同光线路径的效果。基本算法有:辐射度算法和射线跟踪算法。
- 辐射度算法:光线会在环境中来回反射,当打开灯后,光照情况很快可以达到一种稳定状态,在这状态中每个物体表面可以认为是一个独立的光源。当光线射到物体表面,可能被表面吸收,也可以发生漫反射,或者其它方式发生反射。
- 射线跟踪方法:实际显卡在用的方法,原理是光线是从眼睛射出,然后穿过屏幕上的像素栅格。对于每条射线,找出与之最近的物体,然后从这条光线与屏幕的相交点出发向每个光源都发出一条射线,并检测是否有东西阻挡或者削弱这条光线,从而判断出这个相交点是在阴影内还是在阴影外。
六、非照片级真实感绘制
- 照片级真实感目的是使绘制的图像看上去与真实照片没有任何区别,而非照片级绘制(Non-photorealistiv Rendering,NPR)也叫网格绘制(Stylistic Rendering),一种是只显示那些与特定应用目标相关的细节;另一种应用领域是对绘画网格和自然媒体(如钢笔、墨水、木炭、水彩画等)进行模拟。
1、toon着色处理
- toon绘制:与卡通网格类似,实现的方法有:
- 有纹理没有光照的模型:通过对纹理进行量化来近似具有实心填充颜色的卡通网格。对于明暗处理有两种常见方法:一种是用实心(没有光照)颜色填充多边形区域;另一种是使用2-tone方法来表示光照效果和阴影区域,也称硬着色方法(Hard Shading)。
2、轮廓边缘绘制
- 表面角轮廓:使用视点方向和表面法线之间的点乘来获取轮廓边缘。实际应用中可以用一个一维纹理来代替环境图,使用视线和顶点法线之间的点乘来访问一维纹理。
- 过程几何轮廓:思想是首先绘制正向表面,然后绘制背向表面,使得轮廓边缘可见。
- 通过图像处理生成轮廓:屏幕分辨率决定实现的效果。思想是将图像处理技术应用于各种各样的缓冲器信息来实现NPR。用法线图对一个充满屏幕的四边形进行绘制,然后用z深度值图再次绘制并且检测出边缘的不连续性。
- 轮廓边缘检测:前面的都存在一个缺点,就是都需要两个通路来绘制。思想是指朝向相反的相邻三角形之交界,也就是说其中一个三角形是朝向视点,另外一个三角形是背向视点。
- 混和轮廓处理:同时使用图像和几何要素来绘制轮廓。
3、线条
- 边缘加亮技术:是一种固定视点的技术,在模型快速交互过程中非常有用。为了加亮的方式显示一个物体,可以将物体的边缘用一种不同的颜色绘制出来,而不需要对表面进行重新绘制。
- 多边形边缘绘制:在靠近每条线条的真实所在位置来绘制线条,保证这些线条总处于表面的上方。
- 隐藏线绘制:用与背景颜色相同的实填充色来绘制多边形,同时用多边形绘制边缘,这样绘制的多边形可以覆盖不可见线条。
- 光晕:两个线条相交时,常规处理方法是擦除较远线条的一部分,使得两条线条前后位置关系比较明显。实现:对每个线条可以绘制两次,其中一次使用光晕线完成,这种方法通过背景色对线条的绘制来实现重叠部分的擦除。
七、基于图像的绘制
- 用图像表示一个物体的最大好处在于绘制量与所要绘制的像素数量(而不是几何模型中的顶点数)成正比。
- 基于图像的绘制(Image-Based Rendering,IBR):常用技术有精灵技术(Sprites)、布告板技术(Billboarding)、替代物技术(Impostor),IBR技术的应用有透镜眩光(Lens Flares)、粒子系统(Particle Systems)等。
- 将三维物体显示在屏幕上,前面是用多边形来绘制。绘制的目的是在屏幕描绘一个物体,每种绘制方法都是对真实世界的一种近似。用基于图像的绘制技术思想是基于计算出来的图像可以应用于一系列图像帧。
1、精灵
- 精灵:是一种最简单的IBR单元,它是一幅可以在屏幕上走来走去的动态图像。对于简单精灵来说,精灵与屏幕上的像素之间存在着一对一关系,存储在精灵中的每个像素对应于屏幕上的一个像素。
- 纯粹的图像分层绘制依赖于快速、高质量的图像弯曲、过滤与合成,基于图像的技术可以和基于多边形的绘制结合起来。
2、布告板技术
- 布告板技术(Billboarding):根据观察方向来确定多边形方向的技术,称其中的多边形为布告板,随着观察角度的变化,多边形方向随之改变。与alpha纹理和动画技术结合,可以用布告板技术表示很多没有实心表面的现象,如烟、火、雾、爆炸、能量屏蔽(Energy Shields)、水蒸气痕迹、云朵等。
- 对齐于屏幕的布告板:类似于一个二维精灵,其中图像总是平行于屏幕而且有一个固定不变的向上向量。对于注释文本等作信息非常有用,因为文本总是与屏幕想平行(这就是布告板命名的由来)。(适合对称球状物体)
- 面向世界的布告板:是用世界向上向量来得到旋转矩阵。法线依然与视平面相反,其中后者是固定向量。(适合圆柱对称物体)
- 轴向布告板(Axial Billboard):经过纹理贴图的物体通常不直接朝向视点,而是允许物体围绕某个固定世界空间轴进行旋转,同时调整物体使其在此范围尽可能朝向视点。通常用于树木,缺点是从上直接向下看,效果就很差。
- 替代技术:是一种在屏幕上模拟几何形状的方法,模拟变形应该和真实几何变形一样。替代物是通过从当前视点将一个复杂物绘制到一幅图像纹理上来创建的,其中的图像纹理用于映射到布告板上,绘制过程与替代物在屏幕上覆盖的像素点数,而不是顶点数或者物体的复杂程度成正比。
3、透镜眩光和敷霜效果
- 透镜眩光:是由于眼睛的晶状体或者相机的透镜直接面对强光所产生的一种现象,由一圈光晕和纤毛状的光环组成。
- 敷霜(Bloom)效果:是由于眼睛晶状体和其它部分的散光而产生的,从而在光源附近出现一种辉光,而且与场景中的其它部分相比会逐渐暗化。
4、粒子系统
- 粒子系统:是一组分散的微小物体集合,其中这些微小物体按照某种算法运动,实际应用包括模拟火焰、烟、爆炸、流水、树木、旋转星系和其它一些自然现象。粒子系统并不是一种绘制形式,而是一种动画方法,思想是粒子的生命周期内控制它们的产生、运动、变化和消失。
- 粒子表示形式,比布告板简单,如点、线等,每个粒子可以是屏幕上的一个单独点,也可以用布告板来表示。
5、深度精灵
- 深度精灵:如果对精灵纹理增加一个深度分量,就会得到一个称为深度精灵(Depth Sprites)或者钉板(Nailboard)的绘制图元。这样的纹理图像是对每个像素增加一个z参数RGB图像,从而形成一个RGBz纹理。
6、层次图像缓存
- 层次图像缓存(Hierarchical Image Caching)是一种使用以层次状分布的替代物来获取更好性能的算法。思想是将场景分割为箱体层次并且为每个箱体生成一个替代物,同时在分割过程中为每个父节点以层次状创建一个替代物,然后对替代物进行分层更新。
7、全屏布告板技术
- 全屏布告板(Full-Screen Billboarding):覆盖整个视图且与屏幕对齐的布告板可以用于很多不同的视觉效果,一种是是通过场景中所有物体的前面放置一块布告板来改变环境外观。
8、天空体
- 对于给定的视点和方向来说,总有一个入射光线。眼睛并不能感知距离,只能感知颜色。环境图表示局部空间区域中的入射光线,尽管该图经常用来模拟反射现象,但是同样也可以用来直接表示周围环境。
9、图像处理
- 图像处理应用于场景,首先需要将场景绘制成纹理或者任何图像形式。需要将图像映射到与屏幕对齐的四边形上,然后对之进行大小调整,以保证将图像绘制到屏幕上的时候,一个纹理元素对应一个像素。
10、体绘制技术
- 体绘制技术(Volume Rendering):绘制数据是用体素(Volumetric Pixel,Voxel)来表示的,每个体素表示一个规则空间体。这种技术种类有:
- 将体素数据看作一组二维图像切片,然后对这些图像进行剪切和弯曲并合成最终的图像。思想是用与屏幕对齐的几何图形或者精灵来表示表面或者体,其中在绘制精灵的时候会形成一个表面
- 通过将体切片直接绘制成具有纹理的四边形,从而直接利用图形硬件的纹理和合成功能。可以使体纹理沿着物体表面流动,比较适合复杂表面,如园林细节、器官组织、毛发、毛状物体等。
八、加速算法
在实时绘制中,在性能至少有3个目标:每秒有更多的帧、更高的分辨率、更多(比较好的真实感效果)的场景物体。60~85帧率的速度通常认为足够,1600x1200的分辨率认为足够。理想情形是绘制图像的帧率与显示器的刷新频率一样,同时速度也不产生变化。图形加速绘制算法核心都是基于空间数据结构(Spatial Data Structures)。
1、空间数据结构
- 空间数据结构可以将几何体组织在n维空间中,这种数据结构可以用于判断几何实体之间是否重叠的加速查询,如裁减算法、相交测试、光线跟踪、以及碰撞检测等。
- 空间数据结构组织通常是层次结构的,就是最高层次包含它下面的层次,后者又包含再下面的层次,如此类推。因此,这种结构具胡嵌套和递归的特点。使用层次可以提高查询速度,复杂度从O(n)提高到O(logn)。类型有:
- 包围体层次(Bounding Volume Hierarchy,BVH):常用于描述模型关系和层次动画的控制方面,也是树结构
- 二元空间分割(Binary Space Partitioning,BSP)树:不规则的,对空间分割比较任意
- 八叉树:规则的,空间是以一种均匀的形式进行分割的,虽然均匀性限制比较大,但是却可以提高效率。
- 包围体(Bounding Volume,BV):就是包含一组物体的空间体,比所包含的几何物体形状简单的多。对绘制图像视觉效果没什么用,通常用于加速绘制和各种计算与查询。
- BVH适合用于查询,如射线,如果射线与包围体不相交,那么这条射线与这个BVH中的所有几何体都不相交;否则继续进行递归测试。如果射线与叶子节点包围体相交,就对这条射线和该节点处的几何体进行相交测试。系统性能之所以提高,部分原因源于射线与包围体之间的测试速度比较快,这也是为什么使用一些简单物体作为包围体的原因。另一部分原因源于包围体的嵌套结构,可以较早的终止一些测试,避免了对很大一部分区域的测试过程。
转载请声明出处:https://www.cnblogs.com/wwhhgg/