多噪声体积云实时模拟研究
2019-12-04刘智轩郭慧玲张晓碧
唐 勇,刘智轩,郭慧玲,3,赵 静,张晓碧
1(燕山大学 信息科学与工程学院,河北 秦皇岛 066004)2(河北省计算机虚拟技术与系统集成重点实验室,河北 秦皇岛 066004)3(河北环境工程学院 信息工程系,河北 秦皇岛 066102)
1 引 言
计算机图形学领域中,研究学者们希望通过计算机再现真实世界,而在真实世界中自然现象是最具有挑战性的课题.云是一种复杂的自然现象,在不同高度的云具有不同的表现形态,由于其特殊的物理构成,在光照方面有着复杂的情况.云作为自然现象的重要组成部分,是图形学领域中重要的研究课题.体积云作为三维云可以满足更高的真实性要求,在光照方面也因具有三维特征有更好的表现力.实时体积云模拟适用于游戏,动画,影视等场景.
在云建模上研究学者们研究出了大量方法.Dobashi[1]等人提出使用元胞自动机模拟云的方法,通过对每个元胞自动机上的三个二元属性进行属性设置模拟三维云,这种方法的运算开销巨大,难以达到实时.Schpok[2]等人提出使用Perlin噪声生成云的方法,通过对Perlin噪声进行一系列操作得到连续随机的云密度,然后在空间中使用噪声对空间进行干扰生成云.虽然生成的云效果较好,但该方法为离线渲染且无法进行大规模场景的云模拟.唐勇等人[3]使用NS方程对云进行模拟,同样无法用于大规模场景的云模拟.KALLWEIT[4]提出了使用蒙特卡罗积分和神经网络模拟云的方法,该方法需要预先学习大量光照方向和空间分布.Prashant和Fabrice[5]提出了一种混合物理方法,将包裹体内粗糙的拉格朗日模型与体积噪声的程序放大器相结合,通过GPU加速达到实时,缺点为云的分布于形状不够真实,并且随着包裹体的增加,帧率下降严重.Parga[6]通过使用高斯方程减少模拟过程中所需元球的数量,渲染使用低分辨率噪声增强视觉效果,虽然达到实时,但是在云的细节上效果不佳.
云的光照模型直接决定云的视觉效果,是云模拟中的研究重点.Dobashi等人提出基于广告牌的Splatting算法,计算了光的单次散射,光由被散射的阳光和穿过云层的光构成.可渲染出光线透过云层的效果,由于基于广告牌所以是二维的云.Harris和Lastra[7]改进了Dobashi的方法,将单次散射改进为多次前向散射,通过对每个粒子求解多次散射公式可以得到更加明亮的云,此方法能在10K粒子以下可以达到实时渲染.Bouthor[8]提出了一种多重各向异性散射方法,通过迭代计算光路在云表面每个区块中像素的能量传输,在密度不均匀的像素上使用Mie相位函数计算单次散射,通过改变不透明度以调整透射效果,该种方法极大的提升了光照的效果,但是需要非常大的计算量,无法达到实时.Elek[9]提出一种模拟云层中光传输的新算法,引入了Henyey-Greenstein函数存储和重建照明信息,并且能够使用单一方向表示各项异性分布.
综上所述,现有模拟方法大多着眼于小规模云模拟,大规模场景云模拟方法较少,为数不多的大规模场景云模拟又存在云的分布或形状不自然的问题,本文针对大规模场景云模拟提出了有效的体积云实时模拟方法,为了在保证实时的前提下解决云形状不够真实的问题,本文使用三维Simplex噪声和三维Worley噪声共同进行云建模,并且引入Curl噪声为云增加不规则性与翻腾的效果[10].为了解决云的分布不自然的问题,对处理过的噪声进行采样,根据采样得到的密度计算云的密度,从而生成分布连续且自然的云.为了保证能够实时渲染体积云,在光照模型上使用大气中的比尔-兰伯特定律与HG相位函数求解,并且计算来自太阳和天空和地面反射的环境光.最后渲染出大规模环境下体积云的实时绘制效果.
2 多噪声的预处理
2.1 多噪声生成
使用噪声纹理进行云建模的大部分方法使用的是二维噪声,这样建模得到一层片状的二维云,本文为了得到效果更好的体积云,所以使用三维噪声进行云建模,同时为了解决单一噪声进行云建模效果真实性较差的问题,本文使用两种噪声共同对云进行建模,一种是Simplex噪声,另一种是Worley噪声.
由于Perlin噪声具有明显的伪影,使用基于数学概念单形(Simplex)对Perlin噪声改进的Simlex噪声,凭借单形的特性解决了一些Perlin噪声的局限,降低了计算复杂度,最为显著的是大大减少了高维度上的计算开销,在硬件上更容易实现.本文根据McEwan[11]文中在GPU上实现生成2D simplex噪声的方法与stefan[12]对Simplex噪声的深入解释,提出一种在GPU上生成3D Simplex噪声的方法.
只使用Simplex噪声进行云建模有细节不足的问题,由于Worley噪声的计算过程是先划分区块,进行特征点填充,再计算当前区块与相邻区块内的特征点之间的最小距离.所以可以产生类似石头、水纹和细胞的球形纹理.可以较好的弥补使用Simplex噪声进行云建模的不足,使生成的云具有翻滚飘渺的形状,从而有更好的细节表现,以增加真实感.
使用此时的噪声进行云建模生成的云具有明显的团块特征,与现实中的云相距甚远.而噪声有着和正弦波一样的振幅和频率,由波的叠加可知,不同倍频的噪声可以很容易叠加得到更随机的波形.通过叠加频率更小的噪声可以得到细节程度更加丰富的纹理,从而可以为生成的云增加细节,有效的解决团块问题.这种方法被称为fbm,如公式(1)所示:
(1)
其中n为迭代次数,w为降低振幅的比例,s为提高频率的倍数.
噪声作为程序纹理具有伪随机性,在使用的时候没有必要每次重新生成,因此用于云建模的噪声纹理是预先生成的三维纹理,为了保证云建模的连续性,使用的两种三维噪声纹理必须是可平铺纹理,其中高分辨率的纹理作为云建模的形态纹理,低分辨率的纹理为作为云建模的细节纹理,为云的边缘增加细节.他们都有RGBA四个通道,两种纹理在不同通道中使用不同的噪声填充,形态纹理R通道为Simplex噪声,另外三个通道为三个不同频率的Worley噪声,细节纹理前三个通道为不同频率的Worley噪声,A通道不绘制纹理.表1为两种纹理的细节.
表1 噪声纹理细节
Table 1 Noise texture detail
纹理分辨率RGBA形态纹理细节纹理128∗128∗12864∗64∗64SimplexWorleyWorleyWorleyWorleyWorleyWorley-
2.2 Curl噪声
利用上述多噪声进行体积云建模获得的效果细节仍有待加强,于是引入Curl噪声加强干扰细节纹理,以增加云的不规则性和翻腾的效果.
Curl噪声是基于Perlin噪声的湍流速度场,这个速度场的是一个无源场,即散度处处为零.而这个条件是满足不可压缩流体的基本条件,所以能保证视觉上的可信.
3 体积云光照模型的求解
当光线照射在不同的物体上时,因材质不同有着不同的效果:被吸收、被散射和被反射.而云几乎可以认为是由小液滴构成的,当一束光线照射到小液滴时几乎只有反射和折射,这也是为什么云看起来那么明亮的原因,一束强度为L的光线从云中穿过后强度会衰减,计算公式为式(2):
L(x,ω)=e-σtΔxL(x+Δxω,ω)
(2)
其中,ω是视线方向,x是光线从云中射出的位置与方向,Δx是光线射入云的位置到射出云的位置行进的距离,e-σtΔx是大气中的Beer-Lambert定律,用于求解透射率.
3.1 相位函数的选择
由于现实中的云在光照充足的情况下有银边效果,可以使用相位函数计算,并且相位函数还能够计算散射光的角度和强度.云中的水滴比空气中的分子要大的多,所以云中的散射主要是Mie散射.由于Mie散射理论的复杂性,导致其相位函数难以计算.而Henyey-Greenstein相位函数可以有效的模拟Mie散射的前向散射的特性,并且计算难度比Mie散射简单许多,可以大大减少计算量.图1为两种相位函数的效果对比图,可以明显看出HG相位函数在前向散射上有与Mie散射近似,在后向散射表现略差.所以本文为出于真实性与实时性的角度考虑选择使用HG相位函数计算散射.公式(3)为HG相位函数
(3)
其中,θ为散射角度,g为非对称因子g=cosθ,取值范围为-1到+1,对应着不同的内部散射角度.
图1 相位函数图,实线:Mie,虚线:Henyey-Greenstein,g=0.99Fig.1 Phase function diagram,solid line:Mie,dotted line:Henyey-Greenstein,g=0.99
3.2 光照模型简化
通过上述描述得到需要求解的公式(4):
(4)
其中D是光线在云中需要追踪的距离,τ(x,x′)是光学深度,表示从x到x′路径累加关于σt的积分,当σt的路径长度是常数Δx可以使用τ(x)=σt(x)Δx简化公式(4),此时将路径分为多段长度相同的路径,σS(x′)表示散射的求解,p(ω,ω′)表示ω到ω′的相位函数,Li(x′,ω′)表示计算从ω′到达x′的入射光线,Ω4π表示所有方向的球体.
所有光源可以分为3个部分:来自太阳的直接照射,来自太阳的间接照射和来自天空的间接照射.此时公式(4)后半部分的积分转化为求解两部分光照,难以计算的部分是来自天空的间接照射.化简剩余的积分,计算从太阳和周围环境到x′的入射光线,通过σS(x′)计算散射,在x到x′之间因为光线的损耗,在计算之后仅能观察到光线的一部分,计算下一段dx′.继续简化,将光线在云中的透射率分成多段透射率求解,使用递归可以轻松算出结果,并且大大减少了计算量.使用公式(5)化简透射率求解部分:
(5)
其中x为光线入射的起点,Δx为光线离散化的步长,i为在云中进行离散化的步数.
3.3 环境光
环境光对于云的真实感具有非常重要的作用,在求解时将云看成是厚度无限且密度均匀的平板.
此时的密度是从上文进行多次光线追踪的计算中得到,来自天空和太阳的环境光可以使用密度除以4π和一个高阶散射损失因子计算.假设在点P计算环境光照,P点的光可能来自各个方向,主要可分为来自太阳和天空的顶部光和来自地面反射的底部光,对于顶部各向同性的环境光通过公式(6)求解.
(6)
(7)
其中积分部分为指数积分,由于是封闭的所以计算简单.
同理,将公式(7)中′+′换为′-′可以得到底部的环境光求解公式.
4 体积云的渲染
使用Raymarching方法渲染体积云,模拟阳光穿过体积云的过程,首先对需要使用到的噪声进行采样,在光线行进的每个步长中,使用采样的数据与云的覆盖率共同求解云的密度,使用每个像素上云的密度计算该像素上云的颜色与透明度.光线使用给定步长继续行进,直到透明度达到完全透明或光线到达体积云的边界.
为了获得像素的透明度,首先计算沿着光线每段步长中的透射率,然后将光线的透射率的进行求和.这是根据光照部分的Beer-Lambert定律在射线行进中进行求解.
为了计算云中每个像素的颜色,需要在每个步长中计算光照和环境光.在光照的计算中,从视点开始向太阳发射光线,通过射线球交点方法计算云的顶层和底层与光线的交点,并且再次使用Beer-Lambert定律来计算沿着该光线的透射率.通过光线的方向与光线角度求解Henyey-Greenstein相位函数.
5 实验结果与分析对比
实验平台为Inter(R)Core(TM)i7-5820K CPU 3.30GHz、16G RAM、显卡为NVIDIA GeForce GTX 1070,操作系统为64位Windows 10.
图2为使用本文方法生成的三种类型的云,图2(a)是积云,形态仿佛是棉花堆.当阳光斜射时,积云的明暗面很明显,如果阳光和云在同一方向,则云的中央阴暗,边缘特别明亮.图2(b)是高积云,常连成一片,底部成波浪状,其式样很多.图2(c)是层积云个体比高积云更大,外型柔和,结构不太明显.连成一片时底部具有波浪型态和明暗相间的灰色阴影.本文方法可以较好的模拟上述的三种云,并且能够达到实时.
图3为使用本文方法在不同时刻模拟的高积云,挑选了三个比较有代表性的时刻:图3(a)正午、图3(b)傍晚和图3(c)夜间,三个时刻模拟的是同一种云,每个时刻有不同的太阳位置,所以光线的方向各不相同,光线的颜色也不相同.正午太阳在最高点云的表现较为通透;傍晚太阳在侧面云的表现为银边效果;夜间月亮光线不足时,能够清晰的观察到云的轮廓,月亮下的云具有银边效果.本文可以较好的模拟出不同时刻光照条件下的云.
图2 不同种类的云Fig.2 Different kinds of clouds
表2为图2与图3中各个场景的平均帧率,可以看出各场景均可达到60FPS以上,所以本文的方法可以做到大规模场景体积云的实时模拟.
图3 不同时刻的云Fig.3 Clouds at different moments
图4为本文方法模拟的云与云的照片的比较,图4(a)为本文模拟的效果,图4(b)为真实的照片,可以看出本文的模拟效果在近处可以达到与真实照片近似的效果,由于需要保证实时性,在视点的远端不进行过多的渲染.
表2 各场景帧率
Table 2 Frame rate of each scene
场景积云高积云层积云正午傍晚夜间帧率134125148134136136
图4 与真实的云对比Fig.4 Compare with real clouds
图5为使用Perlin噪声生成的云与本文方法生成的云的对比,图5(a)为使用Perlin噪声的效果,图5(b)为本文的效果,可以看出本文方法在云的边缘细节绘制效果明显强于只使用Perlin噪声的效果.
图6为与文献[4]的效果对比,文献[4]使用蒙特卡罗积分和神经网络的方法,通过对已有的十多个云样本学习后再进行云模拟.图6(a)为文献[4]渲染34小时的效果,图6(b)为本文场景中一朵云的效果,文献[4]的云效果非常好,但是需要先预先学习多个样本,而且需要长时间渲染,无法达到实时,本文的云在层次细节与光照上无法达到文献[4]的效果,但有利于游戏等虚拟场景中进行大规模实时绘制.
图5 与Perlin噪声的云对比Fig.5 Compare with Perlin noise clouds
图6 与文献[4]对比Fig.6 Compare with the literature [4]
图7为与文献[5]的效果对比,文献[5]使用拉格朗日模型与体积噪声相结合的混合物理方法,能基于物理控制云的生成,但是在云的分布和细节上较差.图7(a)是文献[5]在圆球中大规模体积云模拟的效果,图7(b)是本文的效果,在云的分布上本文效果更加自然,云的形状效果更优.
图7 与文献[5]对比Fig.7 Compare with the literature [5]
图8为与文献[6]的效果对比,文献[6]使用基于元球的方法,通过求解高斯公式减少模拟过程中元球的数量,并且使用低分辨率的Perlin噪声为云的边缘增加细节.图8(a)为文献[6]的效果,图8(b)为本文场景中一朵云的效果,文献使用元球所以云的形态不如本文的连续.
图8 与文献[6]对比Fig.8 Compare with the literature [6]
表3为不同实验方法的帧率对比,文献[4]与文献[6]是小规模云模拟,大多着眼于一朵云的模拟,而文献[4]由于通过深度学习进行光照计算,计算量过大只能进行离线渲染,渲染时间从几分钟到几十小时不等,并且对计算机硬件要求极高;文献[6]将多个元球组成云,云的形状可控性强,但视觉效果往往不够自然,该方法可实时绘制,当视点离云越近帧率越低;文献[5]与本文为大规模云模拟,文献[5]在圆球中绘制云,每个圆球绘制一朵云,当绘制85个圆球时帧率为7,34个圆球帧率为24,14个圆球帧率为77,平衡了真实性与实时性,因为使用的是混合方法所以在视觉效果上较差;本文在空间中对云的密度采样,以保证大规模场景中不同种类的云建模的时候不会严重影响实时性,通过将光照模型分解化简大大减少计算量,同时使用多种噪声进行建模,保证了云的视觉效果.
表3 不同实验方法的帧率对比
Table 3 Frame rate comparison of different experimental methods
6 结 论
在使用Simplex噪声的基础上引入Worley噪声共同生成三维噪声,从云建模的层面上增强了云的真实感.由于噪声具有伪随机性,为了建模过程中减少噪声的生成时间,所以将所使用的噪声进行预生成处理以提高建模效率.同时引入了Curl噪声增强了体积云细节的不规则性和翻腾效果的真实性.根据光在云中传播的规律求解光照模型,通过大气中的Beer-Lambert定律求解光线的透射率,HG相位函数散射光的角度分布和强度,并且分别计算云的顶部与底部的环境光.最后使用Raymarching进行体积云渲染.实验结果表明本文方法可以对多种云进行有效的模拟,具有普适性;并且可以模拟出不同时刻光照条件下的云;并且在不同的云与不同的时刻下平均帧率均可达到60以上,能够满足实时性;并且模拟的云可接近真实的云.
今后的工作为以下两个方面:
1)根据已有的图像生成云,实现云生成的可控性;
2)改进散射效果,在保证实时的前提下,对相位函数进行改进,以获得比HG相位函数更好的后向散射效果,从而增加云的真实性.