三维实时动态海底环境渲染研究
2021-12-10丁静静马国军曾庆军
丁静静,马国军,2,朱 琎,曾庆军
(1.江苏科技大学电子信息学院,江苏 镇江 212003;2.镇江市智慧海洋信息感知与传输重点实验室,江苏 镇江 212003)
1 引言
三维海洋环境的可视化渲染包括海面、海底和水体环境,一直以来都是虚拟可视化方面的热点问题,在航海模拟、海战仿真、海底探测和海底开采等方面有重要意义。目前,对海洋环境的虚拟可视化主要集中在对海面和地形的模拟与应用。
在海底地形方面,海底地形的建模和渲染是海底仿真的关键技术[1,2]。文献[3]将海底地形TIN模型转换为OpenFlight三维数据模型,经过分层设色的纹理映射,构建海底地形模型,该方法包含的三角形面片数大、加载时间长。文献[4]利用Virtual Planet Builder工具对海底地形数据进行建模,提出层次细节法构建各种规模的分块分页地形数据模型,生成的海洋三维场景地形模型,更加真实的绘制地形,但工作量大且只适用简单的小场景地形。文献[5,6]提出基于HSL颜色模型的海底地形多色渐变渲染与配色方法,对于起伏不明显的地形,HSL模型与RGB模型几乎没有区别。
在海水与地形、光线交互时,主要产生刻蚀和光束现象。刻蚀和光束作为复杂的物理现象,是由于投射的光线被反射或折射而形成的。文献[7]将刻蚀图技术引入水下光照的渲染,运用光线行进技术渲染水下光束,结合FFT水面的周期性对刻蚀图进行改进,但大大降低了绘制的效率,且无法动态实现海底环境的可视化。文献[8]在光照图像基础上利用深度学习网络对刻蚀图进行分类与筛选,增强刻蚀的效果,但并没有改变刻蚀的可视化方法。文献[9]提出设置水面和水下双相机,根据前视点与海平面的高度差来自动切换相机;在水面下,考虑折射、Godray与雾化效果的海底地形,绘制出逼真的海底效果,但加大了绘制的难度。
上述可视化方法对整个海底环境的动态可视化从地形绘制、刻蚀生成和光束渲染等三方面考虑,在系统性和全面性方面略显不足。同时,在可视化过程中,数据处理过程复杂,处理效率低。针对上述问题,提出地形、刻蚀、光束和气泡多元素融合的渲染方法,将高程数据模型转换为obj模型,通过简化模型与GPU提前加载模型,加快绘制速度;通过将模型与法线纹理相结合,增强绘制效果。通过分解器与计时器相结合,实现动态刻蚀渲染。在此基础上通过将光线步进算法和粒子系统相结合,实现光束和气泡的仿真渲染,在简化数据处理流程的同时,可以高质量的实现海底环境动态可视化。
2 基于数据模型的地形建立
三维地形生成是动态海底环境渲染中最重要的部分,地形数据有模拟数据和真实数据两种类型。模拟地形数据通过软件生成,然后进行插值计算,但无法真实反映海底地形的情况。真实地形数据通过直接测量的方式或从现有地形图上采集,利用声纳、电子海图或遥感卫星海洋高程图来获取。利用真实地形数据进行建模时,根据数据类型采取相应的处理方法。为增强海底地形生成的真实性,本文采用遥感卫星海洋高程图数据来构建三维地形,设计将地形数据和纹理数据相结合的三维地形渲染方案,如图1所示。
图1 地形渲染实现方案
2.1 地形数据处理
数字高程模型(Digital Elevation Model,DEM)是高程Z关于平面坐标X、Y两个自变量的连续函数,是一个有限的离散表示。数字高程模型是单纯的单项数字地貌模型,不包括坡度、坡向等,其数据组织表达方式主要有规则矩形网格和不规则三角网。本文采用的DEM为TIF格式,其数据显示如图2所示。
图2 DEM数据显示图
数字高程数据在图中通过不同颜色来表示深度的大小,蓝色表示深度较浅,红色表示深度较深。从图2可以看出,地形的数据量庞大,直接处理速度会非常慢。将TIF格式的图像转换为obj模型的文件再优化和简化,可加快处理速度。
将TIF格式的图像转换为obj模型的过程如下:
1)提取数字高程值。利用python库中的getdata函数,根据数字高程模型图像的大小及空间分辨率输出高程值的大小和下标,本文图像的宽度为3264像素,高度为1344像素,波段数为1,位深度为32,比例尺(72DPI)为1:72223,空间分辨率为19.109257米/像素;
2)生成obj模型。从图2可以看出,海底地形数据起伏不明显,利用blend软件通过调整数据的比例大小以优化模型;
3)简化模型。虽然obj规范简单,但仍然需要很大的空间来导出几何和网格/材质组合,因此需要进行清理操作,将obj文件中重复的顶点数据、纹理数据合并以减小文件大小,加快模型的载入和渲染,obj模型优化前后的效果如图3所示。
图3 obj模型优化前后
2.2 纹理数据处理
纹理数据主要是指纹理图像,本文的纹理数据为地形的法线纹理。由于光线的反射由法线决定,因此法线的获取和计算是影响渲染效果的决定性因素。
凹凸映射使用纹理改变模型表面的法线,该方法并不是真的改变模型的顶点位置,而只是让模型看起来凹凸不平。为节约计算资源和降低复杂度,本文采用法线映射实现凹凸映射,用法线纹理直接存储表面法线的方向。在实时渲染过程中,顶点法线无需直接计算,OpenGL以纹理参数的形式连续的传递给GPU,从而确保了GPU像素着色器可以快速实现。
像素的分量为[0,1],而法线方向的分量在[-1,1],此处需要做映射
(1)
式中,normal表示法线分量的大小,pixel表示像素分量的大小。
2.3 地形渲染
准备好地形模型和纹理数据后,即可进行GPU的渲染。利用OpenGL中的顶点着色器、几何着色器和片段着色器实现,其主要步骤为:
步骤1:在顶点着色器中设置光照模型。现实世界的光照是极其复杂的,会受到诸多因素的影响,因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,所用的模型为冯氏光照模型(Phong Lighting Model)。冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。
把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色(也就是人们所感知到的颜色)。图形学中将这两个颜色向量作分量相乘,结果就是最终的颜色向量,创建光源并设置属性,包括位置、方向,设置亮度增益为0.02、散射增益为0.005;
步骤2:设置颜色模型为 RGBA模型;
步骤3:建立Mesh对象。将加载的海底地形的obj模型通过Mesh绘制海底地形;
步骤4:纹理贴图。通过OpenGL将绘制的地形与纹理数据相结合,分为两步:
1)设置纹理环绕方式为重复纹理图像;
2)设置纹理过滤模式。在渲染需要的细节分辨率超过第0层时,开启线性滤波;否则,选用多级渐远纹理降低漫游时由于视点运动产生的渲染图像上的瑕疵。
3 基于光学的刻蚀和光束可视化
当光线进入水中时,会发生反射和折射现象。水面的不均匀性会导致光线聚集或发散,同时,水中存在的大量悬浮颗粒。使得光线能量衰减,部分光线会偏离原来的传播方向,形成光束;其它光线传播到海底并照亮地面形成刻蚀。当水面波动时,刻蚀也会波动。
在海底环境实时渲染中,刻蚀和光束的仿真主要有以下两个难点:①刻蚀和光束的模拟要表现出实时动态的顶点变化;②刻蚀要能够适应漫游相机在远、近、高、低等不同视点位置,平视、俯视、仰视等不同视角时的视景真实性需求。
3.1 刻蚀渲染
要准确的绘制光的刻蚀效果,需要根据光的折射定律,计算光线在水中的折射方向,如图4所示。
图4 光线折射原理
式中,p1为入射点,p2为交点,r为折射光线单位向量。
计算光线和海底的交点需要遍历整个海底,而海底的凹凸不平使得公式计算量非常巨大。海面的不停变化使刻蚀也随之变化,此时采用动态纹理的方法,在GPU中进行折射运算,加快绘制效率。将刻蚀贴图的纹理投影到场景中的物体上,省去了对大量光线折射与反射的实时计算。刻蚀的可视化过程为:
1)刻蚀纹理的制作。获取待渲染海底区域当前时刻之前连续n个时刻的静态水刻蚀纹理图像,所述静态水刻蚀纹理图像中相邻图像的时间差小于预设的时间间隔L(x);
2)法线纹理生成。将刻蚀的纹理图像转换成法线纹理图像,增强视觉效果;
3)刻蚀滤波。为了提高图像质量,渲染前对刻蚀图进行滤波。由于光子相对分散的区域会出现低采样,造成刻蚀图噪声较大。本文采用基于GPU的高斯模糊来降低噪声,随着模糊半径(radius)的增大,图像越模糊。本文在模糊半径为3时,达到较为满意的效果,如图5所示。
图5 刻蚀图滤波
4)刻蚀渲染。将纹理图像生成的顶点纹理写入显存,在逐帧渲染时通过OpenGL以参数形式传递给GPU顶点程序,对每个顶点进行纹理采样,同时设置折射率和水深,计算折射方向,确定新的顶点位置。
3.2 光束渲染
光散射是一种自然现象,散射效果可以为场景带来真实感。当遮光物体被光源照射时,在其周围呈现光的放射性泄漏,称为体积光。由于光可以从任何地方散射到相机,使得体积光难以实时模拟[10]。在模拟散射过程中,利用封堵器操作技术以消除或增加所得光轴的明显复杂性,并通过增强光轴边界来强调物体的形状[11];也可以通过计算体积软阴影,以交互式直接实现体积可视化[12,13]。
对水下光束的模拟,假设L(x)为光线能量的变化函数,x为该光线在某一处的位置,如图4(b)所示。L(x)的函数式定义为:
L(x)=I·α(p1,x)·β(x,e)·p(θ,g,α,h)·c
(3)
式中,I为光线照射到海面某点的光强,α(p1,x)为光线的衰减函数,p1和x分别为光线的起始点和光线路径上的采样点,β(x,e)为从眼睛位置到光线位置的衰减函数,e为观察点的位置,p(θ,g,α,h)为海水的散射相位函数,θ为光线与摄像机位置的夹角,g为前向相位函数非对称因子,α为前向相位函数的权重,h为后向相位函数的非对称因子,c为散射系数。
上述光束的渲染需要大量的计算,本文通过GPU对刻蚀图进行采样,大大加快渲染速度。绘制光束需要在片元着色器中设置亮度增益和散射增益,利用光线行进技术,设置采样步长对刻蚀图进行采样,根据衰减函数计算亮度值。
具体步骤为在OpenGL主程序中渲染一个全屏的矩形;在片段着色器中,从近裁剪面开始,光线行进视景体,沿着视线方向对水刻蚀纹理图像进行采样。采样的步长决定了仿真精度,步长值大,精度较低;步长值小,精度较高,但渲染速度低。采样的步长值根据水刻蚀纹理的位置到视点的距离与光线总长度的比值来确定,将步长值限定在(0.01,1)的范围内。
将当前采样点投影到光源空间,用得到的x,y分量作为光束纹理坐标采样刻蚀图;所述x,y 分量为当前片元的窗口相对坐标;采样值作为本采样点对片元的强度贡献,并加入指数衰减,计算最终的片元强度;所述光线上位置处的片元强度利用式(3)计算。
亮度增益设为0.02,散射增益为0.005。
4 气泡渲染
气泡是海底动态环境中的重要组成部分,气泡的渲染主要通过粒子系统模拟。粒子系统是一个具有“生命”的系统,可以生成一系列运动演化图像,从而可以模拟动态自然场景。
粒子系统的模拟是在世界空间几何体中实现的,首先使用顶点着色器将局部空间的几何体变换到世界和人眼空间,在人眼空间完成常规渲染,然后在世界空间用粒子系统完成气泡的模拟,流程如图6所示。
图6 粒子系统产生粒子流程图
该粒子系统算法的详细步骤为:
步骤1:产生新的粒子。初始化每一新粒子的数量、位置和速度,气泡初始化位置为海底地面。粒子的位置和速度向量保存在两个缓存中,缓存中的每个顶点代表一个单一粒子;
步骤2:设置气泡运动轨迹。设置粒子运动的速度为时间的一半,位置为时间和速度的乘积,方向向海面方向运动,粒子的速度有最大值限制;
步骤3:在顶点着色器中进行碰撞检测,由此得到新的位置和速度向量,然后写入缓存中;
步骤4:判断粒子是否超过海面的高度,如果超过,就删除粒子;否则,重复步骤3;
步骤5:进行点的光栅化和在片元着色器中进行颜色渲染。对气泡纹理进行变换,修改alpha通道透明度,使其更具有真实感。
图7 气泡纹理透明度变换
5 实验与分析
实验地形数据采用黄海地形数据,经纬度坐标系为WGS84。左上角坐标为(121.81640625,35.68359375),右上角为(124.0576171875,35.68359375),右下角为(124.0576171875,34.7607421875),左下角为(121.81640625,34.7607421875)。海深大约在-30到-90米之间。计算机为windows7系统,编程环境为Visual Studio 2015和OpenGL三维图形库,CPU 为AMD E1_2100 APU,主频内存大小为2GB,图形卡为AMD Radeon HD8210,显存为2GB。
本文利用obj模型与纹理相结合的方法,加快绘制速度。在光线方面,在顶点着色器中进行反射变换和在片元着色器中进行光线行进,极大利用GPU的加速功能;在气泡的粒子系统中利用双缓存技术,加快了绘制速度。图8为本文算法的绘制结果,分别从平视、仰视和俯视等角度展现渲染效果。
图8 本文海底绘制效果
文献[14]基于空间体剖分和积分运算的绘制效果如图9(a)所示,文献[15]基于刻蚀体理论和光线绘制法的绘制结果如图9(b)所示,文献[7]基于刻蚀图技术的绘制效果如图9(c)所示。
图9 参考文献绘制效果
为了比较不同算法,分别从光束、散射、气泡和海底环境等方面,比较不同方法的绘制效果和绘制速度,结果如表1所示。
表1 本文方法与其它方法绘制效果对比
从总体来看,本文算法实现的气泡和动态刻蚀增加了海底环境渲染的动态感和真实感。图8与图9(a)相比,首先本文构建了一个复杂的崎岖不平的大地形环境,形成的光束也比较明显,而文献[14]只有刻蚀,且积分计算耗费大量时间,绘制速度慢。将图8与图9(b)相比,其次在光束方面本文利用GPU对刻蚀图采样更加具有真实感,加快绘制速度。将图8与图9(c)相比,最后本文海底地形复杂,且通过动态纹理实现刻蚀的可视化渲染,而文献[7]只有静态的刻蚀图。
6 结束语
海底环境渲染是虚拟可视化的重要研究方向之一,在军事,民用方面都有重要意义。本文提出地形,刻蚀,光束和气泡相融合的多元素渲染方法。首先通过真实的高程数据建立obj模型,简化模型同时利用GPU加速,在加载地形过程中可以达到秒加载,加载效率提高了98%,其次在绘制刻蚀、光束和气泡过程中,绘制速度达到15fps,满足实时绘制要求。实验结果表明可以兼顾绘制效果和效率。