我们首先通过对片段的每个位置指定一个透明度值来执行混合,这个透明度值基于片段位置的距离。在进行实际绘制前,我们在一个透明度路径中累加这些透明度值。在绘制时,我们可以基于片段的透明度值,以及在透明度路径中存储的累加透明度值,来决定一个片段对总像素颜色的作用效果。最终,我们使用法线扰动技术来增加细节,改善流表面的混合。当将表面作为有向片段渲染时,我们在每个片段处略微地扰动法线。法线的扰动由流密度场的曲率决定,密度场位于渲染片段的粒子位置处。密度场的曲率可以在速度限制路径中通过计算密度场及梯度得到。使用梯度,我们可以获得关于被渲染片段尺寸的一个向量,相切于流表面。这个向量与曲率(一个3×3矩阵)相乘,可获得法线沿切向量的一个变化量。我们仅存储使用点积得到的且法线投影到切向量方向的变化量,结果是一个缩放因子。这是对粒子位置偏离度的一个估计(实际上,它仅包含了部分的偏离度)。这个缩放因子被存储起来,在表面渲染阶段,可以将该缩放因子与重新构建的切向量结合使用,来构成正方形法线的扰动法线。
7.7结论
本章给出了一个方法,该方法有效且高效地在GPU中实现了Witkin and Heckbert 1994的基于点的隐式表面可视化,在保持互动级帧速率的情况下渲染可变形球。我们的方法由三部分构成:计算受限速度、斥力及粒子密度,来实现接近一致的粒子分布。后面两部分包含了一个用于GPU粒子系统的新算法,粒子之间相互影响。方法的最后一个部分对原始方法进行了改进,加速了流表面粒子的分布,并可以在不连续的表面使用分布,这样防止了空隙。相比于行进立方体(Marching Cubes)方法和光线追踪方法,这个方法具有明显的性能优势,这是因为其复杂度取决于流表面面积,而前两种方法的复杂度取决于流的体积。
目前给出的方法仍然没有解决所有的问题。算法的进一步改进包含具有适应性的粒子尺寸(这样可以使流表面的临时空隙被快速填充)。同时,新生成的不连续表面部分并不总是在其表面具有粒子,这意味着只要它们仍然不连续,就一直不会收到任何粒子。但最大的问题在于,对位于较远且较小的流部分的处理。由于斥力算法需要包含每个粒子的一个剪辑空间,因此有限分辨率的视口很可能导致多个粒子映射到了同一个像素上,造成数据丢失。最终的研究方向包括渲染表面粒子来实现不同的视觉效果,图7-11就是这样的一个例子。
展开
——Martin Mittring Grytek首席图形程序员