中国科技核心期刊      中国指挥与控制学会会刊     军事装备类重点期刊
Engineering & Application

Method of Rainy 3D Scene Real-time Based on Particle System

  • LIU Jian-chao ,
  • LIN Ya-jun ,
  • WANG Shu-yun ,
  • DONG Fei
Expand
  • Flight Simulation Training Center of Trainer, Naval Aviation University, Huludao 125001, China

Received date: 2020-04-30

  Request revised date: 2020-06-30

  Online published: 2022-05-07

Copyright

Copyright reserved © 2022

Abstract

In order to solve the practical engineering application problems such as slow rendering speed, low efficiency and poor effect of traditional 3D scene in rainy day, this paper proposes a method of rendering large-scale rainy day environment about the generation and movement of raindrops to simulate the whole process of raindrops landing. Based on the particle system, this paper presents a rendering method of large-scale rainy environment, from the generation and movement of raindrops to the whole process of raindrops landing. This method uses transform feedback technology to draw the movement of raindrops, realizes the rendering effects of raindrop coloring, splashing water, dynamic ripples and so on. Using the off-screen rendering characteristics of OpenGL and the programmed method, according to a texture, continuously generates a new normal vector texture representing ripples with animation circles, and realizes the algorithm flow of dynamic ripples. Through the analysis of the distribution, movement and wake of raindrops, the formation effect of raindrops on the surface of transparent glass is realized. Finally, this paper uses a pavement texture mask, the height is limited to [0,1], and realizes the water rendering effect of the road area, and gives the coloring algorithm.

Cite this article

LIU Jian-chao , LIN Ya-jun , WANG Shu-yun , DONG Fei . Method of Rainy 3D Scene Real-time Based on Particle System[J]. Command Control and Simulation, 2020 , 42(5) : 70 -75 . DOI: 10.3969/j.issn.1673-3819.2020.05.014

传统的雨天三维场景的渲染绘制速度慢,而且当面临海量雨滴的时候运动计算以及绘制效率低下,同时,雨天场景的绘制效果单一,往往只考虑雨天场景的某一种特效,例如,天空降雨过程,或者地面积水过程等,没有组织形成统一的雨天真实感场景。本文提出了一种基于粒子系统的雨天实时渲染方法,该雨天场景由统一的形式表示组织而成,涵盖了雨天场景的多种特效,包括天空降水过程、雨滴与物体碰撞的水花飞溅过程、地面积水与生成涟漪过程、在透明物体(如玻璃等)表面形成细微的雨珠雨痕等过程。该方法具有速度实时且真实感较好的特点,能够满足大规模雨天环境下自然场景的绘制需求,对虚拟现实与游戏系统具有较大的应用价值[1,2]

1 雨天绘制技术

1.1 帧动画纹理贴图

模拟雨水天气的一种渲染方式是基于图像的,这种方法一般是先从实际的雨天视频中抽取出雨水的动态纹理,然后,将这张纹理与渲染出来的场景图像进行混合,要实现动态的过程,就要通过回滚这张纹理的形式来实现。
这种方式类似于将准备好的图像一帧一帧播放,也就是帧动画纹理贴图的技术。基于图像的方法能够应用更多的后处理技术,使得雨水渲染出来的视觉效果比较丰富,随着背景的不同可以产生变化[3]。由于并不是真实的物理仿真,所以它的缺点也很明显:1)对雨水观察久了之后,就会发现它们的运动轨迹重复度很高;2)在绘制过程中很难对雨水的运动方向进行调整,视线相对于水平面的倾角过高时容易看出破绽;3)无法对雨水的位置进行调整和更新,也就无法实现它们的相对运动。

1.2 粒子系统

粒子系统是一项在游戏物理仿真、计算机动画和计算机图形学里面广泛使用的技术,这项技术的基本原理是利用大量非常小的点、模型等图形对象来模拟某种“模糊”的现象,这些现象通常很难被传统的图形学绘制技术渲染出来。粒子系统常被用在绘制一些杂乱无章的系统、自然景象或者化学反应产生的某种现象。由于现实中的降雨现象通常是由无数的雨滴组成的,这些细小的雨滴正是一个个的粒子,因此,采用粒子系统能够很好地对这类现象进行模拟。
很多文献将每一个雨滴建模为一个粒子,将雨滴的降落过程建模为粒子的下落运动,通过每帧对粒子的位置、速度和绘制状态进行更新,精确地控制每一个粒子在当前场景状态下的物理运动。在得到粒子的位置之后,就可以对这些粒子运用不同的绘制技术来实现渲染的效果,这里可以使用体绘制的方式精确模拟光照效果,也可以使用公告板技术简单地进行渲染[4,5]
以降雨为例,由于这种技术可以记录每一个雨滴当前的状态,所以,可以进行更多基于物理的仿真模拟。比如,可以实现雨水在视点往前运动时迎面扑来的相对运动效果,可以将每一个区域的降水量记录下来以实现积水效果,可以在不同的光照条件下实现不同的渲染效果。
基于粒子系统的雨水着色可以使用简单的纹理贴图,对下雨视频进行纹理的提取,而Transform Feedback技术充分考虑了光源、视点、雨滴三者之间的关系,得出了十分逼真的雨滴纹理库。另外,考虑环境中各种光源对雨滴的影响,通过计算雨水对光的折射反射,可以得到很逼真的雨水渲染效果。

1.3 Transform Feedback技术

传统的粒子系统在实现时,每一帧都需要在CPU上对逐个粒子进行更新。要在大规模的户外场景里使用基于粒子系统的雨水特效,则需要大量粒子的更新模拟,实时要求高的应用无法承担上百万粒子更新带来的计算负载。显卡具有强大的并行运算能力,粒子系统更新这种重复性很高的工作显然适用于显卡的并行计算,然而,以前的GPU毕竟不像CPU一样的灵活,GPU只是为了图形渲染而设计的,因此,必须通过图形学领域的语言来操控。在Shader Model 4.0之前,如果想使用GPU进行非图形的处理几乎是不可能的,因此,如果当时想在GPU中进行粒子的更新与输出,就必须将这个过程转化为对图像的处理过程。Shader Model 4.0的提出,使得GPU端绘制管线上的输出可以直接作为下一帧的输入,这个过程不再需要从GPU端往CPU端回流。Shader Model 4.0中的这个新特性在DirectX中的实现技术叫作Stream-output,在OpenGL中叫作Transform Feedback,都是指将GPU的计算输出直接作为绘制时的输入。如图1所示。
图1 Shader Model 4.0以前的可编程绘制管线
使用Transform Feedback技术,可以轻松实现上百万粒子的实时更新,对大规模场景里的粒子系统来说,是非常合适的实现方式。如图2所示。
图2 Transform Feedback所处的阶段

2 粒子的生成

降水现象都可以通过粒子系统来仿真模拟,但是,在大规模场景中要将粒子系统进行适量的剪裁,本文引入了局部降水空间的概念,将粒子系统的仿真限制在视点周围的局部空间中。针对积水场景,本文通过修改顶点法向配合纹理mask的方式,间接修改场景模型的光照计算方式以实现场景被水淋湿的效果[6,7]
为了便于控制降落雨滴的运动轨迹,本文将采用粒子系统技术实现降水的绘制,整个粒子系统的更新计算由GPU来并行执行,也就是可以使用Transform Feedback技术来实现大规模粒子系统。在户外场景中,不可能实时地仿真整个场景所有地区的降水情况,而且,在现实生活中,人们也观察不到远处雨水的形态,因此,我们只关心视点周围空间的雨滴。本文首先在视点周围建立一个降雨空间,让雨水在这个空间中运动,只需要实时地更新渲染这个空间中的粒子,即可渲染出足够真实的降雨效果。

2.1 定义粒子

首先,决定需要的粒子数目M,以及场景的尺寸,即水平面的长L、宽W。
其次,定义M个粒子的属性,每个粒子的(x,y)坐标为:
x=f*L- 1 2L,f(0~1之间的随机小数)
y=g*W- 1 2W,g(0~1之间的随机小数)
式中,f为初始位置,g为初始高度。
将每个粒子的属性数据转存到GPU上,每个粒子的坐标数据(x,y)分别设为水平坐标的(x,y)值,z设为0,开始高度和种子值都作为顶点属性存储。

2.2 粒子算法实现

将粒子的水平坐标规范化到[0,1]坐标范围,作为查找深度纹理的依据。给出具体算法步骤,如图3
1)设r为画面裁剪半径。
2)计算粒子在雨空间中的高度h。在计算高度以及之后的场景深度时,都是以雨水开始面为起点,纵向朝下为高度增加方向。雨空间的高度与雨水下落速度的比值即为一次雨水落下循环所需的时间t。每一帧开始渲染前都获得从上一帧开始所经过的时间t',从上一帧开始雨水落下的距离h为:
d'=H*t'/t(H为雨空间高度)
h=H*t'/t+h'(h'为雨水开始高度)
3)计算粒子与观察点的向量。规范化后计算该向量与单位垂直向量的正交,在这里,垂直方向就是(0,0,1),所得到的R即为面向观察者的水平向量,生成面向观察者的矩形。
4)计算矩形的四个顶点坐标。对一个粒子(x,y,-h)来说,由此得到的细长矩形的四个顶点(假设矩形长为2.0,宽为0.3)为(a,b,c,d)。

a=(x,y,-h)-0.15R

b=(x,y,-h)+0.15R

c=(x,y,-h+2.0)-0.15R

d=(x,y,-h+2.0)+0.15R

几何着色器GS弹出这四个顶点,形成一个图元,给碎片着色器FS进行着色。

2.3 雨滴着色

得到每一个雨滴的位置后,就可以将这个雨滴扩展为billboard的形式,将雨滴纹理贴上以实现雨水的快速绘制。如图4,这个billboard的面法向与水平面垂直线正交,且朝向当前视点。公告板绘制方式的质量很大程度上取决于纹理的质量。本文使用公开文献的雨滴纹理数据库,这个数据库提供了在所有光照条件下,不同的观察视角下雨水的纹理图。着色流程如图4
图4 雨滴着色流程图
图4,在雨滴的着色阶段,首先,计算出视线与水平面的夹角θview、光线与光平面的夹角θlight以及视线水平面的投影和光线水平面投影之间的夹角Φlight,使用这三个参数计算出相应的纹理页顶坐标,然后,采样预先载入的雨水纹理,最后,使用光照参数计算基本的雨滴照明颜色,与采样的纹理颜色相结合得到最后的着色结果。由于雨水是半透明物质,为了得到最终正确的半透明效果,一种方法是在绘制前将雨滴从后往前进行排序,但是,本系统采用的是另一种更节省计算资源的方法,在绘制时开启图形的混合模式,设置正确的混合参数。
具体算法流程如图5所示。
图5 雨滴着色流程图
相比于传统雨滴着色,本文设计的雨滴着色过程与方法简单可靠,大规模实时渲染时不卡滞,已经在多个视景系统中应用。

2.4 水花与涟漪

为了表现下雨天的水面,除了反射之外,还要有雨滴落到水面产生的涟漪,当降水强度比较大时,雨水砸到水面上还会溅起水花。涟漪的实现是通过扰动路面的法向实现的,因为水面的法向是垂直向上的,而水面涟漪的法向不是垂直的,只要在涟漪的地方更改法向就可以了。本系统采用了一种通过叠加涟漪法向纹理的方法,类似于法向贴图的技术。这种方法需要每一帧都计算一个新的涟漪法向纹理,但是,由于涟漪的位置是随机生成的,所以,计算量不算太大,而且,生成的一副涟漪法向纹理可以应用在整个路面上。涟漪法向纹理的计算基础是一副斑点图,如图6,这张图是每通道8位、共32位的四通道图像,红色通道存储规范化后的斑点圆心到该纹素点的距离,绿色和蓝色通道存储从圆心开始指向该点的方向,Alpha通道是随机的灰度常量,用来决定随机的涟漪生成时间,根据这四个通道的数据以及当前设置的降雨强度就可以计算出某一时刻唯一的涟漪法向纹理。水花的渲染采用帧动画纹理的方法,设定帧动画的持续时间,然后,根据水花生成的时间与当前渲染时刻选择帧动画序列中的图像进行纹理贴图,同样地,可以采用插值的方式使帧动画过渡更加自然。
图6 雨滴生成涟漪的纹理图

3 雨珠在透明玻璃表面成形效果

3.1 雨滴的分布状态

雨滴在透明物体如玻璃窗上的分布状态,实现了两种模式:
1)雨滴较少且较大,玻璃表面的雨滴容易在重力作用下滑落;
2)雨滴密集且较小,但大多是静止的,只有个别雨滴在接触其他雨滴后打破稳态下落,形成一道较长较明显的痕迹(在现实中可参考饮水机内壁)。
这两种模式在程序的数据结构层面也采用了不同的方法:第一种模式将雨滴排布成一个大的链表,所有操作都是基于这个链表来实现;第二种模式将玻璃划分为片格,每个片格上的雨滴组织成一个链表。
采用不同的数据组织方法,利于在不同模式下减少每帧运动的计算量。两种模式可以实时切换。

3.2 运动部分

3.2.1 雨滴的碰撞融合
雨滴在玻璃窗上可能发生接触,接触的结果往往就是融合。同样根据对现实场景的观察,本文实现了这一效果的绘制。
首先,当两个雨滴的表面发生接触时,两个雨滴就会以肉眼难以观察的速度迅速合二为一。为了将这一效果表现得更为真实自然,主要采用了以下两种方法。
1)相互融合式
当两个雨滴速度矢量判定为不相反,并且,距离小于某一阈值(记为第一阈值)时,两个雨滴的速度将会加上一个相向的分量,将在接下来的几帧中更快地接触,表现为一个过程而不是瞬间。
当速度矢量判定不相反,并且,距离小于另一个阈值时(记为第二阈值,第二阈值小于第一阈值),两个雨滴发生融合,合并为一个新的雨滴,它的体积、形状、速度、位置都是根据先前两个雨滴的这些参数按大小加权计算得到的。这些计算在原理上满足动量守恒定律。为了让视觉效果更自然,其中加入了一些修正。
2)吸入式
根据实际观察发现,当两个雨滴的速度都比较小,近乎静止,而且,其中一个体积比另一个雨滴大一些时,有可能出现小的雨滴逐渐被吸入大的雨滴的现象,对这种现象做了特别的实现,以模拟现实场景。
上述过程中的参数基本都是经验参数(如两个阈值、体积比例的次方、大小权重等),是经过多次的调试和修改得到的,以视觉最接近真实效果为目的。
3.2.2 雨痕(雨滴路径)的绘制
雨滴在玻璃窗上移动时会留下一层水膜形成的痕迹。雨痕的宽窄取决于雨滴的大小,亮度取决于遗留时间(会慢慢蒸发)。同时,考虑雨痕的平整表面,为雨痕的绘制加上了镜面反射光效果。
雨痕的形状反映了雨滴的移动路径。在实际情况中,雨滴受到玻璃表面细微不平整和风力等外力影响,其移动轨迹往往是随机的连续曲线,尤其是在一开始重力加速时间比较少,并不以垂直下落占主要地位时。
对雨滴的速度进行了随机连续调整,使得它的轨迹形成一条自然的、“歪歪扭扭”的曲线段。

3.3 尾迹现象

根据对实际场景的观察,我们发现:较大的雨滴在其移动痕迹(遗留的水膜)上会因为玻璃表面形状的微小不均一而形成小的静止雨滴,看上去成了较大移动雨滴的尾迹。而且,这种尾迹雨滴往往是形成连续的一段段。根据一些随机化的参数在雨滴的遗留痕迹上生成了这种小的尾迹雨滴,它初始是一些特定的点,随时间逐渐聚集水膜而形成小雨滴。然后,这种小雨滴也会随时间同水膜一起缓慢蒸发。

4 积水场景的渲染

下雨天给人们的另一个视觉特点就是潮湿的地面,在雨停后,湿漉漉的地面反映了这是刚刚下过雨的痕迹,从某种角度上来说,湿滑的路面有时比空中飘落的雨滴更能引起人对下雨天的注意。湿滑路面表面覆盖了一层水分子,水分子对光线的吸收系数很大,光线到达地面后,大部分光子被水分子吸收,反射的光子占比小,漫反射的能量小,所以,湿滑的路面看起来比干燥时的路面颜色要暗[8]。这部分效果可以通过直接修改路面本身的漫反射颜色来实现。凹陷程度比较大的路面会形成积水,积水的一个很重要的特征就是它的镜面反射属性,高光和倒影都是积水的重要视觉特征。由于本系统是使用延迟着色框架实现的绘制引擎下的一个模块,本文提出的积水渲染方法是改变水洼处的法线,通常我们观察到水面都是类似镜面反射性质的表面,因此,改变该点处的法向为垂直水平面向上即可使该点呈现出水面的效果,同样,水面的倒影也要遵守菲涅尔效应。另外,积水和周围普通路面之间还需要一个平滑的过渡,可以改变该点的材质属性,以便在后续的延迟着色中进行正确的光照计算[9,10]
当雨停之后,路面上的水经过阳光的照射变成水蒸气蒸发,路面慢慢恢复原来干燥时的反射属性。积水越多的地方变成干燥路面所需要的照射时间越长,要实现这样的效果,首先要定义路面上各点的凹陷程度。
在实际应用中,不可能通过构建复杂的点面模型来代表地面,这是非常耗费系统资源的,因此,需要用一些特别的处理方法,将一张平面纹理表现得让人看起来它是凹凸不平的。本文使用的是一张路面纹理mask,这张纹理存放了对应路面纹理每一个纹素的高度信息,可以把这张纹理mask称为高度图。这张高度图除了可以通过设计师在程序运行前设计好,也可以在运行过程中通过噪声函数生成,采样高度图获得的高度限制在[0,1]。在片元着色器采样漫反射颜色纹理进行着色期间,可以使用同样的页顶纹理坐标采样这张高度图,假设采样出来的高度值为h,积水系数为flood_level(这是一个跟降水强度相关的观察系数),为了表现出积水与干燥路面的过渡效果,还需要准备一张干燥路面的法向贴图normal map、路面顶点输入的法向original normal[11]。计算着色的伪代码算法如下:
算法 计算积水着色
在视景中实现积水效果如图7图8所示。图7为不同潮湿程度的机场跑道俯瞰视图,图8为不同积水程度的路面近景。
图7 不同潮湿程度的机场跑道俯瞰视图
图8 不同积水程度的路面近景
采用本文方法进行视景仿真过程中,视景渲染速度达到60 fps,即每帧16.667 ms,清晰度高程分辨率达到30 m,影像分辨率达到0.5 m,符合通用视景仿真标准,但经过计算,视景渲染速度和分辨率还可以继续提高,这取决于实际飞行控制段的仿真计算和工程需求。

5 结束语

本文在总结传统雨水渲染方法流程的基础上,利用强大的GPU硬件技术参数,简化了雨滴形成和渲染流程,详细地给出了空中的雨滴通过粒子系统技术实现,在大规模场景下需要对粒子系统的降水模型进行适当的简化,本文将粒子的运动限制在视点周围的一个局部空间内,并对粒子的更新和着色分别做了解释。然后,针对一部分增加降雨场景逼真度的细节,比如积水效果,给出了实现算法和相关讨论。
[1]
王康. 动态三维合成视景及其视景仿真研究[D]. 西安: 西安电子科技大学, 2014.

[2]
Furukawa R, Naito M, Miyazaki D, et al. Auto-calibration Method for Active 3D Endoscope System Using Silhouette of Pattern Projector[C]//Image and Video Technology. Heidelberg: Springer, 2018: 222-236.

[3]
徐泽骅, 李胜. 面向大规模户外场景的实时绘制系统[D]. 北京: 北京大学, 2017.

[4]
AHMED A. Geometric Correction for Uneven Quadric Projection Surfaces Using Recursive Subdivision of Bézier Patches[J]. ETRI Journal, 2013, 35(6):1115-1125.

DOI

[5]
赵圆圆. 雨场景中的雨滴与多种物体交互模拟[D]. 秦皇岛: 燕山大学, 2016.

[6]
薛松, 翁冬冬, 刘越, 等. 增强现实游戏交互模式对比[J]. 计算机辅助设计与图形学学报, 2015, 27(12):2402-2409.

[7]
陈华杰, 余小清, 唐经洲, 等. 基于粒子系统与 LOD 技术的实时雨雪效果模拟[J]. 计算机仿真, 2008, 25(4):194-197.

[8]
王长波, 杨志亮, 张鑫. 虚拟雨景中路面湿润效果的实时建模与绘制[J]. 计算机辅助设计与图形学学报, 2008, 20(6):713-717.

[9]
唐玉蕾, 袁赞, 吴志红 . 基于 GPU 雨场景的实时模拟[J]. 计算机工程与设计, 2014, 35(6):2188-2191.

[10]
董鸿鹏, 王春财, 张波. 飞行模拟器视景系统的设计与实现[J]. 计算机应用, 2018, 38(S1):228-231, 235.

[11]
Kaneda K, Zuyama Y, Yamashita H, Nishita T. Animation of Water Droplet Flow on Curved Surfaces[C]// Proceedings of Pacific Graphics, 1996: 50-65.

Outlines

/