Surfels and Spatial Storage

本文最后更新于:1 年前

#
Surfels and Spatial Storage

img

介绍

本文档的目的

本文档的目的是解释什么是surfel,它们目前是如何被使用的,以及它如何增强我们的项目。结论可以在文档末尾找到。这包含研究结果的简要摘要,以及读者可能想知道的有关surfel和空间存储的最重要的事情。

以前的研究

我们的团队从未对surfel做过任何研究。因此,本文档将从头开始,并以第一章中解释的基础知识为基础。

研究问题

  • 什么是surfel?
  • surfel的用途是什么?
  • EA SEED 如何使用surfel?
  • Pixar 如何使用surfel?
  • 我们可以在项目中使用surfel吗?
    • 时间估计。
    • 风险分析。
    • 结论。

定义

Surfels是体积渲染文献中的“表面元素”或“表面体素”。其他人将其描述为零维n元组,其形状和阴影属性局部近似于对象表面。对象可以由一组密集的点(表面)表示,这些点(表面)保存照明信息。

为什么选择surfel?

由于该团队没有预算来解决每帧的全局照明问题,因此需要某种特殊方法或时间累积。预算约为每帧 250.000 条光线来计算全局照明。

在存储光的贡献时,通常有两种存储数据的方法:屏幕空间和世界空间。屏幕空间存储的优点是,当相机靠近表面时,分辨率会增加。但是,这仅适用于静态环境。它不适用于动态场景,因为“重影”可能会变得可见。

因此,该团队选择使用世界空间存储进行全局照明积累。这就是surfel发挥作用的地方。每个surfel器存储一个位置、法线、半径和一些动画信息。surfel是持久的。这允许全局照明随时间累积。

surfel可以蒙皮。这样就可以将surfel放置在动画网格体上。每个surfel器都有一个平滑的衰减,在渲染过程中提供统一的外观。

将surfel应用于屏幕,这是一种类似于渲染延迟光源的技术。每个surfel的有效载荷只是辐照度,没有方向。

surfel使用世界空间数据结构进行剔除,非常像八叉树。每个单元格存储一个相交的surfel列表。空间中的每个点都可以查询数据结构并找到所有相关的surfel。

EA SEED

Surfels的常见应用是医用扫描仪数据表示,渲染体积数据的表面和粒子系统的实时渲染。surfel也用于提高GI(全局照明)的效率,正如EA SEED的Tomasz Stachowiak所描述的那样。

在游戏或游戏引擎等交互式应用程序中,surfel对于存储照明数据非常有用。这可以使照明pass更快,因为照明数据已经在生成surfel的区域可用。

surfel放置算法

放置算法使用 G-buffer 信息,它是一个迭代孔填充器。从计算当前surfel集对每个像素的覆盖率开始,它应该寻找覆盖率较低的像素,以便可以在这些位置生成新的surfel。EA SEED找到了一种方法来找到那些低覆盖率的信号。

他们首先将屏幕分成tiles(在他们的情况下:16x16像素),对于每个tiles,他们使用“group atomic sense wave operations”找到最低的覆盖。然后,使用G缓冲区的深度和正常数据生成surfel。需要考虑的一件事是像素的投影区域。当你面对一堵墙时,你不希望仅基于屏幕(16x16)- tiles 生成很多surfel,因为较近surfel的分布与距离较远的物体的分布不同。
img img

投影的像素区域正是它所说的。以左侧的图像为例。图像在 7x5 像素的窗口中呈现。每个绿色像素覆盖球体的一部分,即投影区域。右图显示得更好。可以在表面上看到像素的投影区域,并确定像素的投影区域。

因此,如果像素的投影区域太小,则surfel放置算法会考虑到这一点,并且不会生成很多彼此非常接近的survel。它将均匀地分布surfel,就像它应该在更远的物体上一样。

这种在较差覆盖区域生成新surfel的过程每帧都会发生。新生成的surfel将比已经生成的surfel计算更多的样本,以减少noise。生成的surfel将每帧粗略地计算一个路径跟踪。当路径轨迹被追踪并击中surfel时,它使用该surfel的照明数据,重用上一帧的照明数据,并随着时间的推移不断叠加新的bounce,以计算新的/改进的照明数据。

该算法比路径跟踪更接近光能传递,但视觉结果非常相似。

全局照明

surfel可用于许多应用/技术。这可以是在医疗应用程序中存储扫描的区域数据,也可以是在具有交互式GI的交互式应用程序中。Surfels对于GI非常有用,因为它们存储了一个小区域的照明数据,GI可以找到并“轻松”渲染具有交互式GI的场景。

实现此目的的一种方法是蒙特卡罗方法。但是,在具有动态场景的交互式应用程序中使用这种做法并不好。蒙特卡罗方法会在场景中的某些内容每次更改时执行硬重置。一旦场景发生剧烈变化,重新渲染的成本很高,并且会有残影生成。

相反,您可以使用修改后的指数均值估计器。该方法与平原蒙特卡洛的方法非常相似。但是,混合因子以另一种方式定义。对新样本的权重进行指数平均是恒定的(通常设置为一个小值),因此输入方差不会导致输出方差较大。很容易注意到,如果输入没有高方差,那么输出也不会。在检测到方差较低时,可以使用较高的混合因子。

EA SEED 积分的细节一直在动态变化。您需要通过使用均值和方差的短期统计来从场景中找出这一点,以确定混合因子。这表明样本应该落入合理的值范围。例如,当新样本被引入时,方差应该在2σ之内。

当方差过大时,您可以动态调整混合因子。

最终,这比蒙特卡罗方法效果更好,因为这种方法呈指数级变化以模拟正确的GI。

空间存储

至少有两种方法可以在空间存储中实现surfel。使用LDI/LDC树或Pica Pica approach:使用屏幕空间来确定在何处生成存储在与Octree非常相似的树中的surfel。

LDI/LDC 树

Hanspeter PfisterMatthias ZwickerJeroen van BaarMarkus Gross在他们的研究文件中很好地解释了这棵树[1]。LDC 代表分层深度立方体,LDI 代表分层深度图像。一个LDC由三个LDI组成。这描述了多维数据集。

img img

他们使用光线追踪来创建这三个LDI。LDI 沿每条射线存储多个表面,每个射线存储表面交点。

此树也基于 Oct 树。每个 octree 节点存储一个 LDC,称为“块”。整棵树也被称为LDC树。在此树上,执行“3to1减少”步骤,并逐块将LDC减少到单个LDI。提高渲染速度。

渲染管线使用透视投影将块投影到屏幕空间,并通过块剔除和其他一些技术(Forward Warping, Visibility Splatting)加速(管线可以在下图中看到,并在PfisterZwickervan BaarGross的PDF中描述)[1])。

在每个光线交点处,将创建一个具有深度、几何形状和阴影(如果已实现)属性的surfel。

为了减少存储和渲染时间,可以选择将LDC的LDI逐个块减少到一个LDI是很有用的。减少每个区块的LDI数量非常简单。获取样本射线的所有交点(三个 LDI 的样本射线相交的地方)。最近邻插值使用这些交点:采样的点位置查找最近的交点并绑定到该交点。Splatting过滤器可以很容易地实现。

这意味着surfel位置的质量取决于每个LDI的采样射线的密度。

基于点的近似颜色渗色(Point-based approximate color bleeding)

基于点的色彩渗出是一种全局照明技术。它利用surfel云来表示物体的表面。surfel云与点云非常相似。但是,surfel云由具有重叠表面的多边形网格组成,而不仅仅是点。

在基于点的近似颜色渗色中,surfel用于表示场景的直接照明。每个surfel存储位置、法线、颜色和半径。在计算特定点的颜色渗色值时,使用特定半径内最接近的surfel来确定颜色渗色值。

生成surfel

使用表面进行全局照明至少需要两次传递。第一个pass用于生成整个场景的surfel表面。生成的每个surfel都应存储直接照明数据,其中包括阴影。表面上的surfel越多,颜色渗出看起来就越好(拥有更多的数据点意味着空间中给定点可用的颜色信息越多)。

surfel“网”

对于静态几何图形,对于整个应用程序,第一次pass只需执行一次,因为它永远不会更改。添加动态对象后,当对象在 3D 空间中移动时,必须更新空间结构。

由于场景的surfel大小可能剧烈变化,因此使用某种空间分区结构(例如八叉树)是有意义的。这将有助于加快第二次pass的速度,因为该次pass必须查询所有接近空间中某个点的surfel。

计算颜色渗色

算法本身相对简单。需要渲染的每个点都会检查周围区域,并查询来自八叉树该部分中所有surfel的数据。来自surfel云的surfel用于生成围绕该点的立方体map。然后,可以使用此立方体贴图根据表面的法线计算渗色到点上的颜色。色彩映射表中的所有像素都乘以反射率函数 (BRDF),并添加到当前的直接照明颜色中。结果是那一点的颜色渗色。多边形网格

如果survel分辨率较低,立方体贴图将仅使用几种颜色,这不会产生很大的颜色渗色。可能需要进行实验以找到每个表面积的最佳表面数。

通过将一组远处的点组合成一种颜色,可以优化表面颜色外观。由于它们“很远”,因此它们的颜色可以组合在一起,而没有任何真正的视觉差异。可能存在颜色渗色差异最小的情况,可以对这种颜色进行插值以节省一些处理能力。

如果查询surfel的点非常接近surfel,那么光线追踪可能是一个解决方案。这样,一个surfel可以多次采样。

在半径内平均颜色时可能出现的问题之一是它没有考虑遮挡。前面的surfel应该阻挡后面的surfel,并在那里,防止后面的surfel对最终图像做出贡献。Pixar解决这个问题的方法是对surfel进行栅格化,就好像它们是从正在计算的点观看的一样。这将给出一个很好的色彩映射表,计算出其中哪些surfel为最终的颜色输出做出了贡献。

当然,结果仍然需要保存到每个正在评估的点的立方体贴图中,但这与我们之前看到的没有任何不同。这次的唯一区别是,可能影响最终颜色的颜色在应用于立方体贴图之前会进行栅格化。

结论

皮克斯“基于点的色彩渗出”演示中的示例。

与EA SEED的方法相比,LDC树将需要更多的性能。它跟踪光线以找到surfel的位置,而EA SEED只使用G缓冲区,这比从追踪的光线构建Octree要快得多。

Surfels对于基于点的近似颜色渗色非常有用。surfel是世界空间中的磁盘,用于存储直接照明信息(包括阴影)、法线、位置和半径。然后可以查询此信息以计算空间中某个点的颜色渗色值。

在静态几何上生成表面只需执行一次,但动态几何会强制空间分区数据结构更新(表面必须随几何一起移动)。EA SEED 更进一步,增加了动态surfel生成和蒙皮。

风险分析

  • surfel为近似颜色提供了一种相对简单的渗色解决方案。

  • 有很多资源可以描述理论和实现。

  • Surfel云分辨率直接影响性能,如果其他地方需要更多的处理能力,则可以降低分辨率。

  • Surfel第一个pass可能需要很长时间。
  • 像EA SEED这样的蒙皮surfel可能会有更广泛的应用。

引用

参考文章

[1] Surfels: Surface Elements as Rendering Primitives PDF - Hanspeter Pfister, Matthias Zwicker, Jeroen van Baar, and Markus Gross

[https://www.researchgate.net/publication/2462148_Surfels_Surface_Elements_as_Rendering_Primitives]{.下划线}


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