搜索
您的当前位置:首页正文

QSplat与基于点绘制的计算机图形学

来源:二三娱乐

引言

随着3D扫描技术的进步,在实践中,有着数以百万计的网格的多边形如雨后春笋般涌现,意图使用传统的显示、简化和渐进传输算法处理如此数据规模的网格是不切实际的。QSplat将表示并逐步显示这些网格——它们结合了基于边界球的多分辨率层次结构和基于点的渲染系统。专门使用一个数据结构进行视域剔除,背面剔除,多细节层次选择以及绘图。这一表示是紧凑且可以被迅速计算的,因此适合大型数据集。这一实现将用于大规模3D数字化项目,它能够迅速启动,维护用户设置的交互式帧频,而无关乎对象的复杂性或相机位置,即使对于运动的物体运动,也能产生高质量图像。

一、3D数据与ply格式

三维数据作为一种新的媒体数据越来越引起人们的广泛关注,在与传统应用领域的逐步结合过程中,三维数据也促进了多学科交叉的新型领域的发展。因为,它记录了物体表面的精确几何信息,有助于模型的形态分析和几何测量。基于真实三维数据的几何形态分析,其可信度要远远高于二维空间中的信息分析。

三维技术可记录场景的全方位信息。相对于以往的二维图像,三维数据允许用户从各个角度观察事物,从而得到更准确地信息。例如,通过三维扫描来记录地质勘探、考古挖掘中的各阶段现场(因为这些场景往往是不可重现的),可以从不同角度分析其地形地貌;在一些事故现场,三维数据可以使得人们从各个视点观察现场,避免在二维图像由于视点的影响而造成的遮蔽问题。

三维技术可以用于增强现实、虚拟现实的应用中,以建立具有真实感的场景环境。比如,在目前正进行的数字博物馆项目中,三维模型可以真实再现物体形态不需要人们亲临现场。因而三维建模不但可以在文物展示、文化教育中发挥重大作用,而且可以很好的保护文物原件。更为重要的是,记录精确几何信息的三维数据具有保存价值,有助于文物受损后的修复工作。此外,对于历史遗迹的三维建模,不但可以使人们通过虚拟场景漫游仿佛置身于真实的环境中,可以从各个角度去观察欣赏这些历史瑰宝,而且还可以为这些历史遗迹保存一份完整、真实大型三维点云模型的交互绘制研究的数据记录,一旦遭受意外破坏,也可以根据这些真实的数据进行修复和完善。此外,在电子购物,电影娱乐,网络游戏,远程手术,文化教育等诸多方面,三维数据的介入也促进了应用的发展。

所谓ply文件格式,是由斯坦福大学开发的一套三维mesh模型数据格式,图形学领域内很多著名的模型数据,比如斯坦福的三维扫描数据库(其中包括很多文章中会见到的Happy Buddha, Dragon, Bunny兔子)最初的模型都是基于这个格式的。其开发目标是,建立一套针对多边形模型的,结构简单但是能够满足大多数图形应用需要的模型格式,而且它允许以ASCII码格式或二进制形式存储文件。这样一套既简单又灵活的文件格式,能够帮助开发人员避免重复开发文件格式的问题。尽管在工业领域内,新的文件格式仍然在不断的出现,但是在图形学的研究领域中,PLY还是种常用且重要的文件格式。

ply数据文件格式中包含用来描述多边形的一系列点的信息:

<顶点列表><面片列表><其他元素列表>

头部是一系列以回车结尾的文本行,用来描述文件的剩余部分。头部包含一个对每个元素类型的描述,包括元素名(如“边”),这个元素在工程里有多少,以及一个与这个元素关联的不同属性的列表。头部还说明这个文件是二进制的或者是ASCII的。头部后面的是一个每个元素类型的元素列表,按照在头部中描述的顺序出现。

以下是一个立方体的完整ASCII描述。相同工程的二进制版本头部的唯一不同是用词“binary_little_endian”或者“binary_big_endian”替换词“ascii”。

formatascii1.0;

commentmadebyanonymous;

/*comment this is a cube*/

elementvertex8;

propertyfloat32x;

propertyfloat32y;

propertyfloat32z;

elementface6;

propertylistuint8int32vertex_index;end_header;

/*list vertex*/

/*list face*/

这个例子说明头部的基本组成。头部的每个部分都是以一个关键词开头以回车结尾的ASCII串。即使是头部的开始和结尾(“ply”和“end_header”)也是以这种形式。跟在文件头部开头之后的是关键词“format”和一个特定的ASCII或者二进制的格式,接下来是一个版本号。再下面是多边形文件中每个元素的描述,在每个元素里还有多属性的说明。一般元素以下面的格式描述:

element <元素名> <在文件中的个数>property <数据类型> <属性名-1>property <数据类型> <属性名-2>property <数据类型> <属性名-3>...

属性罗列在“element”(元素)行后面定义,既包含属性的数据类型也包含属性在每个元素中出现的次序。一个属性可以有三种数据类型:标量,字符串和列表。属性可能具有的标量数据类型列表如下:

int8 字符 1

uint8 非负字符 1

int16 短整型 2

uint16 非负短整型 2

int32 整型 4

uint32 非负整型 4

float32 单精度浮点数 4

float64 双精度浮点数 8

这些字节计数很重要,而且在实现过程中不能修改以使这些文件可移植。使用列表数据类型的属性定义有一种特殊的格式:

property list <数值类型> <数值类型> <属性名>

二、点与三角形的图形学

点作为基本的图形绘制元素已经有很长的历史了。早在1974年,Catmull注意到任何几何剖分最终都将显示为一个个离散点。Reeves在1983年提出在计算机图形绘制时用3D离散采样点—粒子—作为基本绘制元素。一个粒子是三维欧氏空间内的一个点,附属一些如颜色、密度、光照反射系数等附加信息。粒子系统的最大的优点在于简便快捷的绘制:将每个粒子投影到屏幕上,利用 Z缓冲消隐,并用粒子的颜色给相应象素着色。粒子系统主要应用于一些用传统造型方法很难表示和绘制的自然场景:如火焰与爆炸场面,流水与瀑布。

Levoy与Wihtted在1985年首先提出将点作为基本绘制元素的思想。他们分析出复杂物体用连续的扫描线方法绘制时的缺陷,并指出点虽然简单却足以表示任何物体:只要三维点云足够致密,将一个个点投影到屏幕上后仍然能得到逼真的显示效果。其核心思想是在绘制前将任何物体转化成一系列离散点表示并用一个新的通用算法绘制。他们用圆形 splat 来绘制点,并设定splat的最小尺寸为一个象素以保证绘制质量,同时采用A缓冲技术进行反走样,论文中还详细地考虑了纹理问题。点的独立性,基于点的绘制允许高度的并行处理。点离散地表示几何而无需存储任何拓扑信息。因此,点云简化了实体表示方法而只保留最重要的信息,尽管无拓扑使得数据结构变得非常简单,它同时会给图形处理带来很大的困难与挑战。高性能绘制、光影计算、各向异性的纹理映射以及进一步的信号处理将是其最大的特点。

1992年Szeliski与Tonneson在Reynolds的工作基础上改进了粒子系统,给原本各向同性的粒子确定了一个法向量,并将这个有向粒子系统应用于模型的表面造型以及交互编辑。在绘制有向粒子时他们并没有使用基于点的绘制技术,而是用椭圆来显示粒子,最终实体也是三角化的曲面。1994年Witkin与Heckbert将有向粒子应用于隐式曲面的采样以及交互编辑,并采用同样的绘制方法来显示有向粒子。受基于图像的绘制技术(IBR)的启发,1998年Grossman与 Dally重新开展了点绘制方面的研究工作,其目标是在避免昂贵图形硬件的条件下实时绘制复杂物体。到了2000年,随着Rusinkiewicz等人的Qsplat绘制系统出现, 点绘制技术有了重要突破。

同期,Rusinkiewicz和Levoy给Qsplat系统设计了一种全新的数据结构,高效地压缩了数据并实现了层次LOD控制和基于法向聚类的可见性剔除。在预处理阶段,采样点存储在层次包围球内。在绘制时层次遍历数据结构,根据当前视点视角、屏幕分辨率以及计算条件等情况选择绘制的层次。Qsplat的算法设计允许使用硬件加速绘制,能实时地绘制上亿个点的超大模型。其缺点是没有考虑透明度以及反走样问题,因此绘制质量一般。纯粹用点云来构建场景有其应用缺陷:首先,点云的密集分布造成了大量的数据冗余,极大地消耗了存储、传输以及绘制资源;其次,在当前的几何绘制引擎中,点云在绘制时最终采用三角形或圆面表示,而拓扑关系的缺失使得在视点靠近时无法保证无空洞的绘制效果。因此许多研究者采用多边形与点混合表示场景,这种混合表示方式结合了点与多边形两种表示方式的优点:当绘制元素在屏幕上投影区域很小时用点绘制效率高一些,反过来投影区域较大时用多边形绘制效果更好。

主要参考资料

QSplat软件、QSplatMake软件(将ply文件转成QSplat可以读取的qs文件)、完整源代码及相关资料下载地址:

三角形作为三维建模中的基本表示元素,在图形学中的应用非常广泛。基于三角形的表面表示需要首先根据物体表面的复杂度进行不规则的采样,然后采用分段线性拟合技术来实现建模过程。这种表示元素不但性质简单,而且可以很有效的表示物体表面的几何属性。同时,在目前的硬件发展中也得到了直接的支持。

然而,随着可获取采样点数目的飞速增长,三角化网格的点云数据在实施绘制显示时,会消耗大量的空间和时间。而本设计中提出的Qsplat(基于多分辨率处理大规模网格的点绘制系统)数据结构大大的压缩了三角网格点云数据的数据量,这对于大量的数据绘制显示是非常有利的。

网格简化方法通过减少三角网格中的顶点和三角形数目,降低了模型的存储、传输数据量,并且可以通过网格重建、多分辨率建模的方法,在绘制过程中恢复出必要的细节。三维网格压缩方法采取的则是另一种途径,即通过编码/解码过程减少网格模型的几何、拓扑信息的存储量,而不直接对网格模型的细节信息进行消减。

最常用的网格压缩方法是将三角形网格模型拆分为连续的三角形条带,于是三角形顶点的重复记录就大大减少,节省了存储空间。这种方法有很多的应用和发展。此外,通过平行四边形预测方法还可以减少顶点坐标(即网格的几何信息)的存储量。另一类网格压缩方法通过坐标量化等手段对网格的几何信息进行编码,这是一种有损的压缩方法。而近年来出现的一些方法中,通过重新建网将原始网格转化成半规整的网格,然后利用一些常规的信号处理工具,如小波分析,对网格的几何信息进行压缩。这样网格在几何和拓扑两方面的压缩都是有损的。近年兴起的“点绘制(point-based)”的方法也可以看作是一种网格压缩的手段。它完全抛弃了网格模型中的拓扑连接关系,仅保存几何信息部分,因而使数据量大大减少,但是模型绘制的效果也相应的有所损失。网格压缩方法在减少数据量的同时并不对模型的细节信息进行简化,因此在数据传输中十分有用;但是它也因此无法提供不同LOD 的多分辨率模型目前有很多方法将网格编码算法应用于大数据量模型简化的out-of-core 方法中,取得了很好的效果。

三、建立qs文件

设计ply数据文件与Qsplat数据文件的转换,即对Qsplat数据结构进行设计→设计读取ply数据的函数,并将数据存储在与Qsplat相对应的数据节点中→将读取得的数据进行处理,使数据符合Qsplat的数据格式→建立QS树的算法,并将形成的QS文件输出(图为著名的Bunny兔模型)。

通过调整以及整合扫描的点云数据产生三角网格,它可以通过imageware软件处理获得。

在此基础上,在每个节点上放置一个球体,这个球体要足够大使得能够和旁边的球体相接触。

Qsplat是通过将不同区域的边界球进行着色来建立层次结构的。

QSplat用边界球的层次结构作为可见性剔除技术,多细节层次的控制以及绘制。树中每个节点都包含球心位置和半径,泛数和圆锥泛数的宽度,以及颜色(可选)。尽管对程序来说,仅需要一种算法从三角网格中生成这种边界球的层次结构,但是QSplat还能从多边形、体素或者点云模型生成这样的层次结构。这种层次结构作为一种预处理被构造,并被写入到磁盘上。

四、QSplat的数据结构与算法

构造层次结构之后,下面的算法用于显示:

TraverseHierarchy(node){

if(node not visible)   

    skip this branch of the tree;

else if(node is a leaf node)

    draw a splat;

else if(benefit of recursing further is too low)

    draw a splat;

else   

    for eachchildinchildren(node)

        TraverseHierarchy(child);

}

现在我们来详细讨论这个基本算法的几个阶段。

可视性剔除: 在边界球的层次上做递归,剔除那些不可见的节点。视域剔除是由测试每个球体对着视域的位面完成的。如果球位于平截头体(视域平头四棱锥)的外面,那么它和它子树的节点都会被丢弃,而非做进一步的处理。如果球位于平截头体(视域平头四棱锥)的内部,就不必剔除这些节点的孩子节点。通过使用法向量和法锥面也可进行背面剔除。如果锥面完全背离视点,那么这些节点和它的子树节点都会被丢弃。若锥面完全指向视点,则组成这些面的节点的孩子节点就不作为背面剔除的候选节点。

确定递归时机:QSplat所使用的启发式决策意味着其递归基于在屏幕上投影的大小,这就是说,如果球投影到观察面上的区域超过一个阈值,就得对这个节点做细分。递归的中止为了维护用户选择的帧频,从而做从一帧到另一帧地调整。我们目前使用的是简单的反馈方案,在先前帧的基础上,通过实际的比率获得绘制时间,调整阈值面积的比率。Funkhouser和Sequin展示了LOD控制预测算法, 在多细节层次控制理论中,这种带有预测性的算法使得帧到帧的绘制时间变小。在求精时对外观做适当改变,或者在典型观察点上突变时,将不能发现缺乏滤波的实然的重要意义。但是其他应用程序,可能从这样的平滑转变中受益。这一框架可以将递归规则推广到以下情形:轮廓边缘(使用每个节点的法向量),高曲率区(使用法锥面宽度),或在中心凹陷区域 (只使用投影位置)。上述使用的帧频控制是实现模型的交互操作。一旦用户停止移动鼠标,我们就会重新绘制现场,即令阈值不断缩小,直至只有一个像素。下图渲染通过了QSplat的几个层次的细化的一个示例场景。


一个模型——圣马太雕像,米开朗琪罗作品——渲染QSplat在几个层次的细化。渲染的SGI Onyx2完成超然的现实图形,在1280×1024的屏幕分辨率下从网格模型生成1.27亿个样本,代表一个2.7米高的雕像,有着0.25毫米的分辨率。右边的图片是左边的放大。

画一个Splat:一旦我们到达一个叶子节点或决定停止递归,我们画一个Splat代表当前的球体。Splat的大小是基于当前球体的投影直径,它的颜色是基于当前每个球的法向量和颜色而从照明角度考虑获得的,并启用了z缓冲解决阻尼。

预处理算法首先表示模型的三角网格编码。虽然可以直接从点云建立一个QSplat层次结构,然而从一个网格入手更容易计算每个节点的法向量。如果没有网格,我们就不得不设法拟合平面法向量的顶点——以计算其邻域点集的方式。一个网格也可以指定输入顶点(球体大小成为我们边界球的叶节点层次结构)。为了使得绘制的点紧密,我们目前的算法是,如果两个顶点由原始网格的一条边相连,所生成的球就必须足够大,使得每两个球在顶点相接。这是一个“宁停三分不抢一秒”式的保守方法。

一旦我们分配叶球体大小,我们使用以下算法建立树的其余部分:

BuildTree(vertices[begin..end]){

if(begin==end)   returnSphere(vertices[begin]);

else{

midpoint=PartitionAlongLongestAxis(vertices[begin..end]);

leftsubtree=BuildTree(vertices[begin..midpoint]);

rightsubtree=BuildTree(vertices[midpoint+1..end]);}

returnBoundingSphere(leftsubtree,rightsubtree);}

这一算法沿着最长轴的边界框建立树的顶点,递归地计算两个子树,寻找边界球的两个孩子球体。一旦树被建立, 内部节点上的每个顶点的公共属性(如法向量和颜色)均被置为平均值。当递归达到一个顶点,我们简单地创建一个中心是顶点的球体,因为整个树的大小依赖每一个节点的分支因素,我们把这些节点都结合到树中去,使得树的平均分支大约有4个。这样将减少内部节点的数目,从而减少了树的存储量。

五、节点布局和量化

(a)树存储按广度优先方式(即红色箭头给出的顺序)。(b)从父节点到孩子节点的联系——建立一组从父节点到第一个孩子节点的指针。如果所有的“父”的兄弟姐妹都是叶节点,则指针不出现。所有的指针都是32位。(c)一个量化节点占48位(不带颜色的占32位)。一个节点包含相对于它父节点的位置和球的尺寸、法向量、法锥面的宽度、可选的颜色、以位表示的用来存储表示树的数据结构的空间(比特表示)。

球心位置和半径:每个球的球心位置和半径在边界球层次结构上相对于它们的父节点被编码。为了节约空间,这些度量的值定在了13比特。也就是说,球的半径数值范围相对其父节点是1/13到13/13,球心相对于它父节点(每一个X,Y,Z)的中心的偏移量是它父节点直径的1/13的倍数。量化自顶向下进行,然则孩子节点球的位置和范围相对其父节点的量化的位置被输入,是故量化错误不向网格传播。为了保证量化过程紧密且拟合良好,量化的半径总是收敛于代表最近点的值。


需要注意的是,不是所有可能组合的中心偏移量和半径比都是有效的,因为,许多孩子节点的结果是不依赖于其父节点的。事实上,只有7621种可能的组合是有效的,这就意味着我们对球心位置和半径所使用的空间只能是13比特。假设父球的半径是1的话,这个编码的方案给出了对于孩子球的X、Y、Z的一个平均量化误差是0.04,对于孩子球半径而言,误差的均值为0.15。半径误差远大于位置误差的原因是,为了保证量化球能够接近实际球,半径被球位置量化的误差不断累加,于是半径总是收敛于代表最近点的值。我们只要不坚持量化球完整拟合原始球,就能够获得比较低的量化半径误差。但是,这样就会引起球之间不紧密地接触,在绘制时制造出空隙。

通过渐进式的编码来表示像球位置这样的几何量,因此实质上在层次结构的层次上按比特输出这些几何量。这种方案在网格压缩方面是违背传统方案的。传统方案依赖对于沿着一些路径和沿着网格边的顶点位置的不同的编码。实际上这种层次三角编码和Eck的多分辨率分析中小波表示几何体比较接近。我们每个节点只需要13比特空间的方案比state-of-the-art几何压缩方法更有竞争力,后者是依靠最初量化的顶点位置,使得顶点平均占用9-15个比特。然而这不是完全有效的比较,因为被我们抛弃的传统几何压缩方案同样也表示出了网格的连通性,而我们用这13比特创造的一个节点还存储了球的半径。

每个节点的位置和半径都被迅速解码以渲染。正因如此,我们的数据结构不仅在磁盘上表现得紧凑,而且在绘制的时候比在绘制前解压数据的方案需要更少的内存空间。


法向量: 每个节点的法向量存储时占用14比特,可表示的法向量对应的点落在正方体每个面的52×52的格子上,向样本的法平面上作不一致的弯曲。在绘制时,我们使用一种查找表来对可表示的法向量进行解码。在实践中我们仅仅使用了52×52×6 = 16224个不同的法向量生成灰部,但是,一些条状产物在低曲率的广阔区域里的强镜面反射周围却是可见的。我们可以通过平移每个法向量做其相对父球的法向量,这样利用渐进式的编码消除这些产物,并达到比较好的压缩,但是,这样会增加内部算法循环的时间复杂度——又一个空间和时间的权衡。不似节点位置的无疆,法向量的空间是有界的,所以,一个固定的量化表能满足任意场景下法向量的编码。因此在这样的情况下,我们选择了一个对法向量固定的量化,这种量化在运行时只需要一个查找表。当处理器的处理速度增加时,我们预测,渐进量化方案将变得更加有前景。


颜色:颜色目前存储时占用5+6+5=16位。在做法矢运算的时候,颜色增加式的编码能够节约存储空间,但是在运行的时候耗费比较多的内存。

法锥面:经过实验,我们决定给每个节点法锥面宽度2比特的空间。四个有代表性的数值对应着角度为arcsin(1/16),arcsin(4/16),arcsin(9/16),arcsin(16/16)的四个锥面。在典型数据集上,使用准确量化的法锥面做背面剔除,可以砍掉超过90%的节点。值得注意的是,我们总是保守地去表示法锥面的宽度,“宁停三分不抢一秒”。和法向量以及颜色一样,这意味着,法锥面的宽度能相对于其父节点的宽度被表示,但是这将减慢绘制速度。

六、文件布局

边界球的节点层次结构在内存和磁盘上以广度优先顺序存储。一个主要的结果是,第一部分的文件——内存中的文件——包含了整个低分辨率的网格。因此,我们只需要读这第一部分文件来将低分辨率模型可视化;若欲明察秋毫,则更多的文件可从磁盘读取。我们目前使用OS-provided内存映射作为工作集管理的基石,这种渐进加载对于将QSplat推广到大型模型的努力是重要的。从磁盘加载整个数据集的时间可能要几分钟。因为数据需要加载,渲染性能在用户首次放大时会降低,因为在某些区域的模型是基于反馈的方法建立的,这样帧频控制就会产生时滞。然而,后续帧将全速渲染,解决这个问题。

由于按广度优先顺序存储树,只要有一个指针将每个组的兄弟树指向这些节点的孩子节点就足够了。此外,如果这些节点没有孩子节点(即他们都是叶节点),那么就不需要指针。如果使用这一方案,只有大约8%到10%的总存储成本——我们认为是足够小以至于不需追求更复杂的方案做进一步压缩的——花在了指针上。为了使树能够遍历,在每个节点存储两位编码数量的孩子节点(0、2、3或4个孩子节点,一个孩子节点是不允许的),加上一个比特的空间——指示是否该节点的所有孩子节点是叶节点。




可以做个这样的估计:树的总存储需求=树中的节点数量×每个节点的成本+开销指针。例如,若树的平均分支系数为3.5,节点总数将是叶节点数的1.4倍,整个树的存储空间=9×叶节点的数量,如果颜色不存储,那么整个树的存储空间=6×叶节点的数量。

内核的选择对于渲染点采样有重大影响,直接决定了最终的图像质量。最简单的,最快的选择是一个OpenGL点,渲染为一个正方形。第二个选择是一个不透明的圆,这可能渲染为一群小三角形,或以更低成本在OpenGL实现为一群多边形。另一种可能是模糊点,利用正态分布来拟合。我们使用的拟合方法是,定义半径的标准差为1/2的Splat。后面这两个选项的绘制速度将减缓,因为需要发送更多的数据。此外,由于混合和z缓冲的互作,画一个正态分布的Splat需要特殊处理。Levoy和Whitted就纯软件渲染讨论过这个问题,他们提出的基于容器的方法确保了图像在阻尼和混合下的准确性。在OpenGL中,我们可以用多通道渲染增强准确性。在第一通道,深度偏移远离观测者一些,我们就只渲染深度缓冲。在第二通道,我们通过增加对颜色缓冲区的渲染抵消深度偏移,却不更新深度。这就把一定深度范围内的所有Splat混合在一起,同时保持正确的阻尼。以下比较了这三种选择的Splat内核。因为每个内核、每个splat绘制时间在当前硬件都是不同的,我们现在在恒定的Splat尺寸和恒定的运行时间下进行比较。

选择Splat形状。我们展示一个场景渲染使用正方形、圆和正态分布作为Splat内核。在最上面一行,每个图像使用相同的递归,即20像素的阈值。相对于正方形,圆花大约两倍的时间来渲染,正态分布需要大约四倍的时间。然而,正态分布显著减少了混叠。在最后一行,每个图像的阈值调整在每种情况下产生相同的渲染时间。根据这一标准,正方形内核提供最高质量的显示。

另一个选择基于Splat是圆(或由OpenGL点渲染的正方形)还是椭圆。在后一种情况下,每个节点的法向量还用来确定椭圆的离心率和方向。当法向量指向观测者,Splat将是圆形的。否则,每一个椭圆的短轴将法向量n的投影指向观测平面上,短轴与长轴的比值k=n·v,其中v是指向观测者的向量。这提高了轮廓的质量,是相对于圆形Splat的锐化。


圆形和椭圆Splat。在左边的图片,所有的Splat都是直径20像素的圆。在正确的图像中,我们根据每个节点的法向量画出旋转椭圆的Splat。这样就对图像进行了锐化。递归深度被限制以便看清单个Splat。

因为我们在一个连续的表面构造边界球层次结构不会留下空隙,我们可以保证,方形和圆形内核总是紧密地进行重建。正态分布内核同样保证了表面的连续性。对于椭圆内核,我们不能再保证这一点了,也不必要再保证这一点了,因为此时法向量不需要沿着连续表面重建。在使用椭圆内核时,我们偶尔会看到孔隙,尤其是在轮廓的边缘。我们不妨通过限制k的最小值来限制椭圆的离心率的最小值,具体地说,如限制k>1/10,这样就能填充几乎所有的空隙。


QSplat使用点作为渲染的原始对象,适合各种特定的场景,特别是显示标准大小的几何细节,和没有必要采取很高的分辨率的情形下。如果模型如一马平川,或是某些特殊的曲面,多边形模型画得更快也更紧密。同样地,如果放大到像素级别,多边形模型也提供了更高的画面质量,尤其是对于那些锋利的棱角。下图显示了一个比较点绘制和多边形绘制的效果图。


系统把大多数的渲染时间用来在一个内部循环遍历层次结构,计算各自的位置和半径节点,执行可视性剔除,并决定是画一个点还是进一步递归。这个内部循环代价高昂,特别是在树的层次较低时。例如, 当一个节点的空间大小达到几个像素时,我们就要将树的低层次的角度划分由精确切换到近似。因此, 在SGI Onyx2上,一旦数据被从磁盘读取,算法平均每秒可以渲染150万至250万个点。准确的速度因缓存的影响、剔除数据的量和树的层次而异。

结语

QSplat非常适合在低端机器上实现。在没有3D图形硬件的笔记本电脑上实现了QSplat(366 MHz英特尔奔腾II处理器,128 MB内存)。因为在渲染软件中,系统填充是有限的,对于一个500×500和帧率5赫兹的典型窗口,可以实现每秒25万到40万点的遍历,每秒4000万像素填充率,每帧通常吸引5万到7万Splat。在这个分辨率实现仍堪舒适的用户体验。

渲染性能总结:


QSplat适合使用边界球层次结构和射线追踪的增量数据结构,使得高质量渲染效果的模型能以QSplat格式存储。

基于树的数据结构和渲染算法易于实例化,大大减少了内存,跳过了要求大量类定义的程式性的场景,这可以被认为是一种新形式的视觉实现,那就是允许在同一场景中有效地包含多个视点。

除了法向量和颜色可以存储在每个节点外,透明度、BRDFs和BTDFs这些数据也将增加QSplat可表示的视觉复杂性,使其功能类似于现代体积渲染器[Kajiya 89]。更复杂的对象,如光场、观测者独立视点以及不同空间的BRDFs以及分层图像处理,也可以在每个节点存储,创建混合渲染系统和现代化的基于图像的渲染器。

Top