Surfels-SIG00-单个复杂物体的surfel渲染方法

本文最后更新于:1 年前

surfel 完整流程概述

surfel 定义

surfel标准定义:A surfel is a zero-dimensional n-tuple with shape and shade attributes that locally approximate an object surface.:surfel是一个具有形状和阴影属性的零维n元组,在局部近似于物体表面。

surfel优点:几何图形的离散化,不像三角形那样隐式存储连接信息,适用于复杂精细的曲面,不适用于平面(在这些平面中,大的、有纹理的多边形以较低的渲染成本提供了更好的图像质量。)

surfel方法概述

image-20220801110515223

surfel方法包括两个主要步骤:采样和渲染。几何和纹理的采样是在预处理期间完成的,其中可能包括其他与视图无关的方法,如凹凸和位移映射。上图给出了该算法的概念概述。

采样过程将几何对象及其纹理转换为曲面。我们使用光线投射来创建三个正交的层状深度图像(layered depth images,LDIs)。LDI沿每个射线-表面交点存储一个surfel点,每条射线存储多个surfel点。

这种三个正交LDI的排列称为分层深度立方体(LDC)。我们的采样方法的一个重要和新颖的方面是形状(或几何)采样和阴影(或纹理颜色)采样之间的区别。surfel存储形状(如表面位置和方向)和阴影(如多层预过滤纹理颜色)。由于与传统纹理mipmap的相似性,我们称这种分层颜色信息为surfel mipmap。

从LDC中,我们创建了一个高效的分层数据结构来进行呈现。LDI树是一棵八叉树,每个八叉树节点上都有一个LDI。我们使用相同的层次空间划分结构,但在八叉树的每个节点上存储一个LDC。八叉树中的每个LDC节点称为一个块。

我们将产生的数据结构称为LDC树。在一个称为3-to-1减少的步骤中,我们可以选择将LDI逐块减少为单个LDI,以便更快地呈现。

渲染管道使用透视投影分层次地将块投影到屏幕空间。通过块剔除和快速增量向前扭曲来加速渲染。我们估计投影的曲面密度在输出图像,以控制渲染速度和图像重建的质量。传统的z-buffer与一种称为可见性喷溅的新方法一起解决了可见性问题。在surfel mipmap的适当级别之间使用线性插值对可见的surfel纹理颜色进行过滤。每个可见的surfel都需要进行shading,可以使用Phong照明和反射映射。最后一个阶段对可见的图像进行重建,包括孔洞填充和抗锯齿。通常,输出图像的分辨率和z-buffer的分辨率不必相同。

Surfel Sampling

采样期间的目标是找到一个具有最小冗余的几何的最优曲面表示。大多数采样方法是使用表面几何的函数对对象进行离散化,如曲率或轮廓。这种对象空间离散化通常会导致显示的细节效果过多或过少。在surfel表示中,目标采样与图像空间绑定并匹配图像的预期输出分辨率。

LDC Sampling

image-20220802105439017

我们从立方体的三个面抽取三个正交的LDI,称为分层深度立方体(LDC)。上图使用2D绘图显示了一个LDC和两个LDI。

从每个LDI按照一定的分辨率投射光线并记录所有的交叉点,包括与背面表面的交叉点。在每个交叉点,使用G-buffer中深度、纹理颜色与法线初始化一个surfel point。对于凹凸和位移映射的表面法线或几何图形的扰动可以在采样前或在使用程序着色器的光线投射期间对几何图形进行。LDC采样可以让我们很容易地构建一个分层的数据结构,这是很难从几十张深度图像中做到的(如正交深度图像采样)。

采样分辨率的设定

给定用于采样的全分辨率LDC的像素间距为h0,我们可以确定最终在表面上的采样密度。假设我们使用生成的曲面作为三角形顶点在物体表面上构造一个三角剖分。这个采样过程生成的虚三角形网格的最大边长Smax为 √3 h0。当两条或三条采样射线相交于同一表面位置时,最小边长为0。

我们设定目标空间中相邻象素之间的最大距离Smax小于目标像素重构filter的半径r`rec,此时我们可以保证至少有一个surfel满足像素filter的分辨率要求。这也被称为充分采样。

Texture Prefiltering

image-20220802113443941

为了确定纹理空间中filter的范围,我们在其切线平面上以每个surfel为圆心作圆。我们称这些圆为切线圆盘。切线圆盘被映射到纹理空间,生成了椭圆,其收集范围内预定义的表面纹理参数。使用EWA filter过滤纹理,产生的颜色被分配给surfel。为了实现足够的纹理重建,纹理空间中的椭圆滤波器必须相互重叠。因此,我们选择r0pre =Smax,即物体空间中相邻surfel之间的最大距离,作为切线盘的半径。这通常保证切线盘在对象空间中彼此相交,并且它们在纹理空间中的投影重叠。

如果使用所有的surfels用于图像重建,将导致纹理混叠伪影。因此,我们每个surfel存储几个(通常是三到四个)预过滤纹理样本。将半径 rkpre =Smax2k 的切线磁盘映射到纹理空间,用于计算预过滤的颜色。因为它与mipmapping相似,我们称它为surfel mipmap。上图显示了连续较大切线磁盘在纹理空间中的椭圆足迹。

数据存储结构

我们使用一种高效的分层数据结构LDC树来存储抽样过程中获得的LDC。它允许我们快速估计每个像素的投影surfels的数量,并以更高的图像质量换取渲染速度。

LDC Tree

自底向上递归构造八叉树,其高度由用户定义。在几何采样期间获得的最高分辨率LDC存储在最低层n = 0。如果分辨率最高的LDC的像素间距为h0,那么第n层(从下往上数)的LDC的像素间距为hn = h0 2n。将LDC按用户指定的维度b细分为块,即每个块中的LDC有b2个分层深度像素。B对于树的所有层都是一样的。

image-20220802115020237

上图使用2D绘图显示了b = 4的LDC树的两层。在图中,相邻的方块有不同的阴影,空的方块是白色的。右图显示了LDC树的n = 1级别。请注意,八叉树中更高级别的surfels引用了0级LDC中的surfels,也就是说,出现在层次结构中的几个块中的surfels只存储一次,并且在块之间共享。

空块(如图中的白色方块所示)不存储。因此,块的维度b与最高分辨率LDC的维度无关,可以任意选择。选择b = 1使LDC树成为一个完整的容量八叉树。

3-to-1 Reduction

为了减少存储和呈现时间,通常可以选择将ldc逐块减少到一个LDI。我们称之为3-to-1的减少。首先,surfels被重采样到射线相交的整数网格位置,如图所示。

image-20220802115420007

目前我们使用最近邻插值,然后,重新采样的块的surfels被存储在单个LDI中。

还原和重采样的过程降低了曲面再现的质量,无论是形状还是阴影。从同一表面重新采样的surfel可能有非常不同的纹理颜色和法线。这可能导致颜色和阴影伪影在物体运动期间恶化。然而,在实践中,我们并没有遇到由于3-to-1减少而造成的严重的伪影。我们可以将具有精细结构的块存储为LDC,而其他所有块可以减少为单个LDI。

我们可以确定3-to-1减少后的surfel密度边界。给定一个像素间距为h0的采样LDI,物体表面上相邻surfels之间的最大距离为Smax= √3 h0,就像在原始LDC树中一样。

由于消除了冗余冲量,冲量之间的最小距离增加到smin = h0,使得表面假想的Delaunay三角剖分更加均匀。

The Rendering Pipeline

渲染管道采用surfel LDC树,并使用分层可见性剔除和块的前向遍历来渲染它。

分层呈现还允许我们估计每个输出像素的投影surfels的数量。为了获得最大的渲染效率,我们大约每个像素投影一个surfel,并使用与输出图像相同的z-buffer分辨率。为了获得最大的图像质量,我们在每个像素投影多个surfels,使用z-buffer的更精细的分辨率,以及高质量的图像重建。

可见性块剔除

我们从顶部(最低分辨率块)到底部(最高分辨率块)遍历LDC树。对于每个块,我们首先使用块边界框执行视图截锥剔除。接下来,我们使用可见锥来执行等效于块的背面剔除。使用surfel法线,我们预先计算每个块的可见性锥,这提供了一个快速、保守的可见性测试:从锥内的任何视点都看不到块中的surfel。我们在LDC树中分层执行所有可见性测试。

LDC树遍历

在渲染过程中,我们从上到下遍历LDC树。为了选择被投影的八叉树级别,我们保守地估计每个块的每个像素的surfels的数量。我们可以为每个像素选择一个曲面用于快速渲染,或者为超级采样选择多个曲面。对于树级n的每个块,每个像素的surfels数量由 inmax 决定,inmax 是图像空间中相邻surfels之间的最大距离。我们用块包围盒投影的四条主要对角线的最大长度除以块的维数b来估计inmax这对于正投影是正确的。

对于每个块,将imax与期望像素重建滤波器的半径r`rec进行比较。r`rec通常是√2/2 so,其中so是输出像素的边长。如果当前块的 inmax 大于r`rec,则遍历它的子块。我们采用那些inmax 小于r`rec的块,大约每个像素渲染一个surfel。请注意,每个像素的surfels数量可以通过为r`rec乘一个分数来增加。得到的inmax 存储为imax ,每个投影的surfels用于后续的可见性测试和图像重建阶段。实际重构滤波器的半径为:rrec= max(r`rec,imax )。

每个样本只需要6次加法、3次乘法和1次倒数。每个LDC块中的ldi都是独立的,这使得我们可以呈现一个LDC树,其中一些或所有块在3比1的减少后变成单个ldi。

Visibility splatting

image-20220802150454874

透视投影、高z-buffer分辨率和放大可能会导致z-buffer中的欠采样或孔洞。如果z-buffer像素不包含一个可见的surfel或背景像素后的投影,那么它是一个孔洞。为了重建图像,必须进行处理。z-buffer的每个像素存储一个指向最近的surfel和当前最小深度的指针。Surfel深度使用最近相邻插值被投影到z-buffer。

为了正确地分辨孔洞下的可见性,我们将曲面切线盘的投影扫描转换到z-buffer中。切线盘的半径为 rnpre =Smax2n ,其中Smax是物体空间中相邻surfel之间的最大距离,n是块的level。我们将这种方法称为Visibility splatting,如图7所示。Visibility splatting有效地将图像的可见性计算和重建分离开来,产生高质量的图像,并符合硬件实现。

正切投影后,切线盘围绕曲面形成一个椭圆,如图7b所示。我们用部分轴对齐的边框(如红色所示)来近似椭圆。边界框平行四边形可以很容易地进行扫描转换,每个z-buffer像素根据法线被填充到适当的深度(由图中阴影的正方形表示)。

这种扫描转换只需要简单的设置计算,不需要颜色插值,也不需要透视划分。

我们计算surfel深度z对屏幕x和y方向的偏导数。由于正投影,它们是常量,可以从单位法线n计算。在扫描转换过程中,使用偏导数计算包围框内每个像素的深度。此外,我们为每个投影z值添加一个小阈值。该阈值防止位于前景表面的surfel被意外丢弃。z值大于切线盘z值的像素标记为孔

如果表面非常弯曲,切向平面不会完全覆盖它,可能会留下裂缝和洞。此外,极端透视投影使正投影与实际投影的切线盘差的近似。然而,在实践中,我们并不认为这是一个大问题。如果投影的切线盘是一个圆,也就是说,如果N几乎平行于观测方向,则边界框平行四边形是一个糟糕的近似。在本例中,我们使用一个方形边框。

我们可以使用分层z-buffer进行可见性测试。每个surfel都被投射出来,并估计surfel周围的洞的大小。洞的半径决定了分层z-buffer的级别,在那里将设置surfel的z深度。这是使用分层z-buffer的Visibility splatting。其优点是在分层z-buffer中通过一个深度测试来执行可见性splat。然而,可见性splat总是正方形的,本质上表示一个切向的圆盘,平行于图像平面。此外,它不一定围绕着投影的surfel。为了克服这些缺点,可以引入表示surfel覆盖范围的权重。但这使得重建过程更加昂贵,并不能保证完全覆盖隐藏表面。

Texture Filtering

正如上文所述,LDC树中的每个surfel存储了surfel mipmap的几个预过滤纹理颜色。在渲染过程中,surfel的颜色根据对象精细程度和表面方向从surfel mipmap进行线性插值。

image-20220802152914588

上图显示了一个采样表面投影到z-buffer的所有可见的表面。围绕surfels中心的椭圆标记了最高分辨率纹理filter的范围。注意,在预过滤过程中,我们尽量保证投影完全覆盖表面。在上图中,通过应用z-buffer深度测试,每个z-buffer像素的样本数量被限制为一个。为了用纹理投影来填补表面覆盖的空白,必须将剩余的surfel放大。如果surfels在给定的z-buffer像素中被丢弃,我们可以假设z-buffer像素在它周围的3x3附近不是洞。因此,如果每个surfel的纹理投影至少覆盖一个z-buffer像素的区域,那么可以填充空白。因此,投影轨迹的椭圆在最坏的情况下必须有一个较小的半径,最小为 √2Sz,其中Sz是z-buffer像素间距。但我们不考虑最坏的情况,使用 √2/2 sz,这意味着surfels被投影到z-buffer像素中心。右图显示了缩放的纹理投影,在投影的曲面周围是椭圆。

image-20220802154335891

为了选择适当的surfel mipmap级别,我们使用传统的依赖视图的纹理过滤,如上图所示。一个半径为√2/2 sz的圆从视图的方向通过一个像素投影到表面的切平面上,在切平面上产生一个椭圆。在这种计算中,圆的投影用正投影近似表示。类似于各向同性纹理映射,投影切线空间椭圆的长轴被用来确定surfel mipmap级别。surfel颜色是由最接近的两个mipmap层之间的线性插值计算的。

Shading

在能见度测试前,通常使用光照模型计算光照。我们已经在Visibility splatting过程中将法线转换到摄像机空间。有了转换后的法线在手,我们使用立方体反射率和环境贴图来计算每surfel Phong照明模型。用每surfel法线进行shading可以得到高质量的高光。

图像重建和超采样抗锯齿

从投影的曲面重建一个连续的曲面本质上是一个离散数据插值问题。我们将可见性计算与图像重建分离。带有孔的z缓冲区像素在Visibility splatting期间被标记。这些孔像素不包含任何可见的样本,因此在图像重建时不使用。下图展示了对象渲染后的z-buffer和图像重建过程。

image-20220802155014226

如左图所示,最简单和最快的方法是使输出像素的大小与z-buffer像素大小Sz相同。Surfels被映射到像素中心使用最近邻插值,在图中显示为彩色方块。

孔用黑色x标记。回想一下,在向前查询的过程中,每个surfel存储Imax。Imax保证了每个像素至少包含一个surfel。为了插值孔洞,我们使用半径略大于Imax的径向对称高斯滤波器定位在孔洞像素中心。

一种高质量的替代方法是使用超采样,如右图所示。输出图像像素大小是z-buffer像素大小Sz的任意倍数。图中的虚线表示图像缓冲区子像素。超级采样的渲染过程和之前完全一样。在图像重建过程中,我们在所有输出像素的中心放置高斯滤波器来过滤亚像素的颜色。滤波器的半径为rrec= max(r`rec,imax )。因此,rrec至少与r`rec= √2/2 S0一样大,但如果Imax表示输出图像中的surfel密度较低,则可以增加。

对于常规渲染和无孔洞的超采样,输出像素的颜色是如何确定的,这是很有指导意义的。对于常规渲染,像素的颜色是通过z缓冲区中最近的可见曲面的最近邻居插值得到的。

surfel的颜色是通过两个surfel mipmap级别之间的线性插值来计算的。因此,输出的像素颜色是从两个预过滤纹理样本计算。在超采样的情况下,一个输出像素包含每个z-buffer亚像素的一个surfel的过滤颜色。因此,多达8个预滤波纹理样本可用于2*2超采样的输出像素。这产生的图像质量类似于三线性mipmapping。

总结

LDC采样的一个基本限制是小于采样网格的薄结构不能被正确表示和渲染。例如毛发等。3-to-1处理之后更加失真。

采样期间获得的surfel属性包括表面法线、镜面颜色、光泽和三个纹理mipmap级别。

形变系统很难用surf和当前的LDC树数据结构表示。此外,如果曲面不能很好地近似物体表面,例如在3-to-1减少后或在高曲率区域,在渲染过程中可能会出现一些表面孔。

Surfel渲染对于精细模型和复杂阴影有理想效果。当我们将栅格化和纹理从核心渲染管道转移到预处理步骤时,每像素的渲染成本会显著降低。渲染性能基本上是由翘曲、着色和图像重建决定的——这些操作可以很容易地利用向量化、并行和流水线。

我们的渲染管道提供了一些速度和质量的权衡。通过解耦图像重建和纹理滤波,我们获得了比类似的点样本方法更高的图像质量。我们引入了Visibility splatting,它可以很有效地检测小孔,提高图像重建性能。具有超采样的抗锯齿是我们系统中很自然的一部分。我们的结果表明,surl渲染能够在交互帧率下获得高质量的图像。提高处理器性能和可能的硬件支持将使其进入实时性能的领域。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!