一种基于曲率流的屏幕空间流体渲染方法与流程

文档序号:11135369阅读:795来源:国知局
一种基于曲率流的屏幕空间流体渲染方法与制造工艺

本发明涉及一种图像渲染方法,尤其是涉及一种基于曲率流的屏幕空间流体渲染方法。



背景技术:

对于交互式的应用程序,比如游戏,基于粒子的流体模拟方法如平滑粒子流体力学(Smoothed Particle Hydrodynamics,SPH)通常偏爱欧拉流体表示形式。这是由于流体能够在不需要定义流体网格的场景下随意流动,通常这种场景下内存和计算的消耗是非常昂贵的。SPH模拟是一种模拟流体的强大的工具,但是需要先进的技术来实现结果的现实渲染。

随着粒子能够像其他严格的对象一样碰撞场景几何图形,粒子方法也更加方便地集成到现有的物理系统中,而不需要将场景几何图形体素成网格。它的缺点是提取一个表面来进行渲染变得更加困难。在已有的方法中,大部分对于渲染粒子流体的方法都不适用于游戏中的实时使用。通常,流体的表面是在世界空间中创建的,直接作为一个网络,或者作为隐式的表面,然后使用移动立方体或者一个相似的算法来多边形化。在这之后,松弛和优化操作可以被应用在整个网络来增加表面的平滑度,平滑度是计算和内存密集型的。

隐式表面多边形化方法也遭受在帧到帧连贯性中网格离散化工件的问题,因为网格是静态的,并且不需要随着流体移动。这个现象在实时渲染长使用低分辨率的网格时尤其明显。Zhang[1]提出过一个基于点的渲染方法,光线圆球相交是完全在GPU上计算的,使用一个两阶段的渲染方法。这个方法移除了网格离散化的要求。

如果流体是移动的,那么渲染每一帧只需要仅仅一个或者最多几个观点,一个更多的内存和计算有效的方法仅仅需要构造在可视空间中对相机可见的粒子所代表的表面.



技术实现要素:

本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种速度快、效果好的基于曲率流的屏幕空间流体渲染方法。

本发明的目的可以通过以下技术方案来实现:

一种基于曲率流的屏幕空间流体渲染方法,包括以下步骤:

S1,获取屏幕空间中三维物体的光滑粒子流体模型,模型包括粒子的位置和速度,生成流体表面的粒子的深度图,确定三维物体的最近表面,三维物体的最近表面确定方法具体为:若物体与摄像机光轴方向的同一条直线有两个或多个交点,则取离摄像机最近的交点,作为最近表面上的点;

S2,通过曲率流滤波,平滑最近表面;

S3,计算每个点与最近表面之间的流体数量,作为该点的厚度;

S4,为最近表面添加噪声;

S5,根据点的厚度和粒子的速度,减弱点的颜色和透明度,得到流体渲染图。

所述的步骤S1中,将粒子渲染成球体,计算每个球体上离摄像机最近的点。

所述的步骤S2中,采用平均曲率来平滑最近表面。

所述的步骤S4中,噪声为柏林噪声。

所述的步骤S5中,点的厚度越大,可见程度越低,点的颜色和透明度减弱越多。

与现有技术相比,本发明具有速度快的优点,可直接在图形硬件上完成所有处理;通过平滑表面,避免流体产生斑点或胶状物效果。

附图说明

图1为本发明流体表面和摄像机角度之间的关系图;

图2为将粒子看成球形的示意图;

图3(a)、(b)为两个视角的粒子球形示意图;

图4(a)、(b)分别为使用高斯双边模糊和屏幕空间曲率流对NVIDIA进行平滑的效果图;

图5(a)、(b)为对一个管道进行添加噪音前后的对比效果图;

图6为使用本实施例方法渲染沙子流体效果图;

图7为本发明方法的流程图。

具体实施方式

下面结合附图和具体实施例对本发明进行详细说明。本实施例以本发明技术方案为前提进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。

实施例

如图7所示,一种基于曲率流的屏幕空间流体渲染方法,包括以下步骤:

S1,获取屏幕空间中三维物体的光滑粒子流体模型,模型包括粒子的位置和速度,生成流体表面的粒子的深度图,确定三维物体的最近表面,三维物体的最近表面确定方法具体为:若物体与摄像机光轴方向的同一条直线有两个或多个交点,则取离摄像机最近的交点,作为最近表面上的点;

S2,通过曲率流滤波,平滑最近表面;

S3,计算每个点与最近表面之间的流体数量,作为该点的厚度;

S4,为最近表面添加噪声;

S5,根据点的厚度和粒子的速度,减弱点的颜色和透明度,得到流体渲染图。

以下是本方法具体说明。

第一步、生成流体表面的粒子的深度图。

假设一种光滑粒子流体动力学粒子模拟存在。输入数据包含n个无顺序的粒子pi(i=1,…,n)的位置。随意地,粒子有相关的密度和来自模拟的速度。在被渲染之前,摄像机交付的流体最前面的表面已经设定好。

如图1所示,屏幕空间流体渲染仅仅生成距离摄像机最近的表面。通过将粒子渲染成球体,保留使用硬件深度测试在每个像素点的最近的值,如图2、图3所示。

为了获得从观察者的视角得到的流体的表面,使用在片段着色器中深度替代的点块纹理将粒子渲染成球体。这样避免了复杂几何的使用。深度值将在下面的平滑步骤中用到。在渲染过程中会倾向于丢弃部分粒子,因为它们并不构成表面的任何部分,通过从模拟过程中给密度添加一个阈值,可以很容易地实现。为了使得过度过程更加平顺,低密度的粒子可以作为喷雾被单独渲染。

第二步、平滑方法。

虽然第一步是将粒子渲染为球体,但是粒子看起来像球体并不是想要的结果,因为这样会导致一个不真实、像果冻的外表。一个光滑和平整的表面,近似于粒子的位置需要通过平滑屏幕空间中的表面来实现。

现有方法是使用一个高斯模糊或者它的变体比如双边高斯滤镜。然而直接的高斯模糊将会模糊掉轮廓边缘,导致在使用大核函数时的相等深度的稳定状态。双边滤镜可以保护边缘,但是它是不分离的。使用一个宽度改变的核在图形硬件上高效地实现一个模糊同样很困难。

作为一种高斯平滑的备选,可以从另一种不同的方式来看待这个问题:对于一种可以平滑处的粒子间曲率的突然变化,形成一个平滑和连续的表面。考虑这个的一种方式是最小化曲率。这与自然界中水滴和水漩涡的形成的合理的流体的表面张力是相似的。这个过程叫做曲率流。

曲率流的表面沿着法线方向速度取决于大小和表面的平均曲率的符号。表面只能在垂直于视觉平面的z方向上被移动,然而由于视觉点是连续的,仍然需要通过移动与曲率成比例的z值来实现表面平滑的理想效果,这样定义

其中,t是一个平滑的时间步骤,H是平均曲率。到这步开始,将这个方法叫做屏幕空间曲率流。平均曲率被定义为一个表面的单位向量的偏差,

通过转置映射转换,深度缓存中的一个值被映射会视觉空间Vx和Vy中的一个点P,Fx和Fy是之后x和y方向的焦距,

法线是通过取P在x和y方向的导数的差乘来计算的,

其中,忽略依赖于视觉位置Wx和Wy的P的导数项,因为这样简化了许多计算,而且当它的贡献很小的时候差别是可以忽略的。单位向量定义如下:

其中

在平均曲率的公式中被取代了,因此H可以被导出。导数的z部分的值总是0,因为z是一个关于x和y的函数,因此在它们都保持为常数的时候都不会改变。由此得到

其中,

等式(1)的一个简单欧拉积分被用来修改在每个迭代中z的值。z的偏导是使用有限差计算的。

因为屏幕空间中的表面轮廓可能是不连续的。为了防止将表面的不同块混合在一起,在这些边界和屏幕的边缘上,将偏导数强制为0来防止任何的平滑发生。

迭代的数量是根据需要的平滑程度来选择的。迭代次数越多,表面越平滑,但是这个将会导致递增的计算时间的代价。

第三步、计算厚度。

一个物体根据它前面的流体的多少来决定它的可见程度。因此需要计算在摄像机和每个像素的最近的不透明物体之间的流体的数量,将这个取名为厚度。当渲染时,厚度用来减弱流体的颜色和透明度。

粒子被视为在世界空间中有着固定尺寸的流体的球体。渲染的过程跟深度的过程是一样的,差别在于片段着色,其输出粒子的厚度而不是深度。额外的混合被使用因为流体的数量在屏幕上是在每个位置积累的。深度测试时是可以的,因此只有在屏幕集合前面的粒子才被渲染了,

其中,d是深度核函数,xi和yi是粒子的映射位置,x和y是屏幕坐标,σi是映射的规模。

严格来讲,仅仅在粒子没有覆盖时厚度的测量是正确的,但是这个在SPH中是个合理的假设,因为粒子之间的斥力。

第四步、避免太过人工平滑,而添加噪声。

尽管本方法帮助隐藏了流体的基于粒子的本质,但是这个结果仍然看起来太过人工平滑。表面细节和泡沫在真实流体中是一个重要的可视元素。一个直接改善这个缺陷的方法是使用一个噪音纹理来扰乱表面,然后添加小规模的细节,就像Johanson实现的这样。然而,生成世界空间或者视野空间中的固定的噪音会使得噪音表现得好像陷入地方。这个挑战是通过流体平流输送来产生噪音,但是仅仅比模拟的基于粒子的流体有更小的规模和更高的频率。因此,本方法提出通过将噪音的八音阶分配给基于它的索引值的每一个映射的粒子来使用柏林噪音,因此,一个确定的噪音的类型与其他粒子保持在一起。通过使用额外的混合,这将会导致一个柏林噪音,八音阶随着流相对于彼此而移动。

对于每一个粒子,一个点块纹理使用高斯核被渲染。得到的值与一个在表面下基于深度的一个指数下降,因此粒子在它们自合并时贡献更少,

其中,p是这个像素的视觉空间位置,d是来自表面深度纹理的样本深度,x和y在-1和1之间变化。噪声纹理噪声在每个粒子之间是变化的为了防止模式变得明显。

这个噪声核然后对于屏幕上的每个粒子进行加和,为了得到能够在每个像素处得到一个噪声值将被用于遮阴,

当流体是非常暴力的时候,流体应该变得更加被扰乱,当速度vi发生巨大变化的时,通过标记流体粒子来实现,

|vi(t)-vi(t-1)|>τ (12)

其中τ是一个阈值。对于这些粒子,噪声振幅将会更高。一会儿之后,粒子平静下来,转化成平常状态。

第五步、渲染。

在最后一步中,所有的中间结果都将通过渲染一个全屏的四元组被合成最后的图片。流体的光学性质是基于菲涅耳方程,有一个反射和折射的部分和一个冯氏高光,计算输出颜色

Cout=a(1-F(n·v))+bF(n·v)+ks(n·h)α (13)

其中F是菲涅耳方程,a是折射的流体颜色,b是反射的场景颜色,ks和α是反射高光的常数,n是表面法线,h是摄像机和光纤之间的半角,v是摄像机向量。在渲染流体的时候,深度测试是可以的,通过片段着色器返回的深度是从表面深度复制过来的。为了渐变流体的表面,视觉空间的法线n使用表面深度d(x,y)的有限差来计算,如等式(4)所示。简单地使用一个方向的有限差来计算发现将会导致边缘的人工化。当不连续性被检测到,通过比较深度到阈值的差,选择最小的绝对有限差。除此之外,噪声纹理N(x,y)是被用来扰乱发现,通过把噪声纹理的偏导数加到计算的法线上来添加小的像波的表面细节到流体。此外,一个灰度的颜色可以通过噪声的级数来添加模拟一个表面泡沫效果。

厚度T(x,y)被用来减弱流体a的折射颜色,

a=lerp(Cfluid,S(x+βnx,y+βny),e-T(x,y)) (14)

流体越厚,它减弱背景色就越多。流体的区域越过背景场景显示。当渐变流体的时候,对每一个色彩通道使用一个稍微不同的指数下降,这样颜色就会随着厚度以一种有趣的方式变化。对于透明度而言,没有流体的场景是最先被背景纹理S(x,y)渲染的。被用来取样背景场景纹理的纹理坐标是基于表面的法线n被扰乱来给出流体背后的折射物体的幻觉。β随着厚度线性递增,

β=T(x,y)γ (15)

其中,γ是依赖于某一种流体的常数,决定了背景被折射的程度。反射的颜色b被取样基于发射方向的环境的立方体贴图纹理来决定的,是从表面法线和视线矢量来计算的。

因为使用PDE来实现曲率最小化是比较呆板的,因此使用一种额外的合成方案,稳定性问题可以提出导致系统震荡。针对这个原因,在高分辨率上,花费了大量的迭代在一个小的时间步骤上保持稳定性。一个折中可以被使用,牺牲一些性能质量,在一个较低的分辨率下同时做流体渲染和处理后的步骤。这个缩放是困难的,因为边缘的展现。在一个流体的体内,深度是线性插入的,但是边缘是作为特殊情况来被处理的。这些不应该看起来锋利或者参差不齐,如果看起来模糊或者平滑还更能接受一些。由于这个原因,我们混合了最后的渐变颜色,在一个低分辨率处计算而不是在法线或者深度值处。这样就有平滑轮廓的效果。

插入有高频率也正将会由于取样而丢失的结果。因为平滑性,一半或者四分之一的分辨率流体可以比全分辨率的看起来要好。

本发明的方法实现包含使用碎片着色器和中间的渲染目标等几个关口,依据上述步骤,对于已有的测试视频及进行分析,该测试集选取了NVIDIA商标,管道、走廊等场景中的流体进行了部分模拟。所有试验均在PC计算机上实现,该PC计算机的主要参数为:中央处理器Intel(R)Core(TM)2Quad CPU Q8400@2.66GHz,内存4GB。

一些对比模拟效果如图4(a)、4(b)、图5(a)、5(b)所示。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1