当前位置: 查字典论文网 >> 基于GPU的实时雾效模拟

基于GPU的实时雾效模拟

格式:DOC 上传日期:2023-07-06 00:30:12
基于GPU的实时雾效模拟
时间:2023-07-06 00:30:12     小编:

摘 要:雾效模拟在三维仿真领域中是一个重要的研究方向,在复杂的三维仿真系统中模拟雾效对系统的实时性和真实性都提出了较高的要求。在分析传统雾效模拟方法的基础上,提出了一种基于GPU的实时雾效模拟方法。基本思想是建立一个表示雾随高度渐变的指数函数,然后根据提出的算法公式在GPU上实时计算出雾浓度,最后将所计算出的雾效因子与片元颜色进行混合计算。实验证明,该方法能够实时生成真实感较强的雾效。

关键词:平流雾;雾密度;雾效因子;GPU;实时性

中图分类号: TP391.9

文献标志码:A

Real-time simulation of fog on GPU

HU Gui-ju1, WU Zhi-hong1,2, WANG Dan-xia1

1. College of Computer Science, Sichuan University, Chengdu Sichuan 610064, China;

2. Key Laboratory of Fundamental Synthetic Vision Graphics and Image for National Defense, Sichuan University, Chengdu Sichuan 610064, China

)

Abstract:Fog simulation is an important research topic in the field of three-dimensional simulation. It puts forward high requirements on real-time performance as well as realistic rendering results for complex three-dimensional simulation system. By analyzing the traditional simulation methods of fog, the authors proposed a Graphic Processing Unit (GPU)-based method to simulate the fog effect in real-time. The basic idea was to employ an exponential function to simulate the fade of fog with height. Then a GPU implementation of this formula was presented. And finally the fog color was blended with the fragment color according to the fog factor. The experimental results show that the proposed method can generate strongly realistic fog in real-time

Key words:advection fog; fog density; fog factor; Graphic Processing Unit (GPU); real-time

0 引言

雾效对增强三维绘制场景的真实感起着很重要的作用,特别是当其运用于户外场景模拟时,能制造出很好的环境氛围[1]。真实感雾效不仅广泛应用于大场景游戏、电影特效、动画和广告等领域中,还被大量应用于军事演习仿真、机场塔台模拟机等仿真系统中。特别是在航空领域的应用中,由于雾是航空事故的最大诱因,大雾中飞行员看不清跑道,易使飞机偏离跑道或过早过晚接地,从而导致空难。同时,浓雾也会使航空港瘫痪[2]717。因此,雾效模拟在航空领域仿真训练中具有极其重要的作用。

根据雾的形成过程不同,可以分为辐射雾、平流雾、上坡雾和蒸发雾等。根据气象学家的统计分析,一般是在夜间或早晨时出现辐射雾,然后随着气温的升高辐射雾逐渐变成了平流雾。同时,雾也受高度的影响,一般雾只在接近地面的数百米空间中生成。但在计算机图形学领域,对雾的仿真模拟最常见的是模拟全局雾,即假设整个场景被笼罩在均匀密度的雾中,只考虑雾随着视点到物体的距离变化而变化。这种简易方法能够满足一般的应用,如游戏等,但对航空领域这些比较专业的应用行业,这种没有结合气象学专业知识的方法不能真实地模拟出自然环境中的雾效。

为了模拟出真实的自然环境雾,需要对常见自然雾进行统计分析。由李秀连等人[2]提供的统计数据表可知,在重雾日天气下,平流雾持续时间最长,对环境的影响最大。所谓平流雾,就是指当暖空气流到冷地面上降温而凝结成的雾[2]720,是一种能见度在1@km左右的持续性浓雾[3]。因此,如何模拟生成平流雾,对自然环境雾效模拟起着重要的作用。

虽然OpenGL提供雾效模拟的接口函数,但它并不能很好地模拟自然环境雾。粒子系统是另外一种经常使用的雾效模拟方法,文献[4-9]使用粒子系统生成雾效,但随着粒子数的增加,达不到实时性要求。为更好地体现真实性和实时性,本文提出了一种基于GPU的实时模拟和渲染平流雾的方法,并对该方法的实现流程进行了详细介绍。

1 传统雾效模拟方法分析

1.1 基于OpenGL的方法

OpenGL生成雾效时,使用雾效混合因子将雾的颜色和片元的颜色混合起来[10]。OpenGL提供的雾效混合函数可以进行雾效模拟,也可以通过指定雾坐标来显示不同的雾效果。

OpenGL的雾效模拟是根据下面三个雾方程之一进行计算的:

f=e-dc(1)

f=e-(dc)2(2)

f=(end-c)/(end-start)(3)

其中:c为视点坐标系内视点到物体的距离;d为雾的浓度;start,end分别为雾开始和结束的位置。 f的值会被裁剪到[0,1],并按如式(4)和已有片元颜色Cr和雾的颜色Cf混合而得到片元的最终颜色C。

C=f×Cr+(1-f)×Cf(4)

OpenGL虽然可以通过计算视点和片元之间的距离来生成全局雾效果,或者通过设置雾坐标来生成体积雾效果,却不能从高度上体现出层次雾效果,即OpenGL生成雾方法满足不了雾的层次渐变性要求。JCAB在2001年GDC会议上提出的生成雾方法,实现了全局雾和体积雾的混合运用,但由于是基于CPU计算的[11],无法运用于大场景模拟多种雾效果中,不能满足实时性要求。

┑3期

胡贵菊等:基于GPU的实时雾效模拟

┆┘扑慊应用 ┑30卷

1.2 粒子系统模拟雾方法

由于采用OpenGL传统方法生成雾,不能在同一个场景中生成多层雾效果,一种解决方法是采用粒子系统多层堆积模拟形成体积雾。目前根据三维绘制引擎如OSG等提供了粒子系统模块,虽然生成的雾比较真实,但这些方法大都是基于CPU计算的,当粒子的数目达到一定的数量后(5B000个以上,见图1),由于CPU负荷过大,出现画面迟钝现象,运行效率明显降低,基本上达不到实时要求。

图片

图1 基于OSG粒子系统模拟雾生成图

2 基于GPU绘制实时雾算法

2.1 基本思想

由于基于CPU计算的雾模拟方法,一般只考虑雾浓度和雾坐标,而没有考虑雾随着高度的变化而发生渐变的现象,不能从高度上体现出雾的层次效果,满足不了复杂三维场景对雾效的需要。本文提出一种基于GPU的模拟绘制平流雾的算法,将雾随高度的变化而发生渐变的现象通过一个指数函数加以表达,并通过在GPU上实时地计算一个曲线积分来表示雾的浓度。

2.2 平流雾算法

Ъ偕柙谑澜缱标系内视点位置为Ow,由视点发出的视线上任意一点P可以表达为如下的参数方程:

P(t)=Ow+Dwt(5)

其中Dw是视线的方向。如果Dw采用单位向量,则参数t有明确的几何意义,即视线上的点P到视点O的距离。

现在假设雾的密度函数为ρ(x,y,z),从视点O到世界坐标系中的任意一点(xp,yp,zp)的雾浓度可以通过第一类曲线积分进行计算:

D=∫l ρ(x,y,z)ds(6)

由于世界坐标系中的任意一点都可以由式(5)进行参数化,即:

xp=Owx+Dwxt

yp=Owy+Dwyt

zp=Owz+Dwzt(7)

因此式(6)可以转化为如下定积分:

∫l ρ(x,y,z)ds=∫t2t1 ρ(x,y,z)(Dwx)2+(Dwy)2+(Dwz)2dt

其中:t1,t2分别对应点Ow┆和(xp,yp,zp)在参数方程(7)下对应的参数值。一个简单的事实是,将Ow┆代入式(7)后,发现不论D怎么取值,其对应的t1=0,而t2的取值取决于怎么设置Dw。Dw最简单的取值方式是直接令

Dw=Ow-(xp,yp,zp)(8)

则(xp,yp,zp)在参数方程中对应的t2=1。综合式(7)、(8),则式(6)可以表达为如下定积分:

∫l ρ(x,y,z)ds=∫10 ρ(x,y,z)(Dwx)2+(Dwy)2+(Dwz)2dt

最后,式(4)中的雾效因子可以通过如式(8)计算得到:

f=e∫l ρ(x,y,z)ds=e∫1 0ρ(x,y,z)(Dwx)2+(Dwy)2+(Dwz)2dt(9)

现在来考查使用不同雾的密度函数得到的不同结果。

假设使用均匀密度的雾,即:

ρ(x,y,z)=d(10)

其中d为一个常数。

将式(10)代入式(9)可以计算均匀密度雾下的雾化因子:

f=e-d(Dwx)2+(Dwy)2+(Dwz)2(11)

注意在式(8)下,(Dwx)2+(Dwy)2+(Dwz)2的实际几何意义就是点(xp,yp,zp)到视点Ow┆的距离。比较式(1)和(11)可知,这两个公式实际上是一样的。因此在采用式(1)的情况下,OpenGL实际上是假设雾的密度是常数,这也印证了在1.1节中的论述。

为了模拟雾随着高度而渐变的物理现象,采用如下的雾密度公式:

ρ(x,y,z)=d×e-cz(12)

其中:c是一个常数,代表雾随着高度的衰减因子;ρ(x,y,z)代表场景中任一点处的雾密度;z由雾的位置所决定,表示雾的高度。

将式(12)代入式(9),可以最后得到带有高度衰减的定积分:

∫l ρ(x,y,z)ds=∫10 ρ(x,y,z)(Dwx)2+(Dwy)2+(Dwz)2dt=d┆e-cOz(Dwx)2+(Dwy)2+(Dwz)21-e-cDzwcDzw(13)

最后结合式(13)与式(9),得到雾效因子f:

f=┆e∫l ρ(x,y,z)ds=ede-cOz(Dwx)2+(Dwy)2+(Dwz)21-e-cDzwcDzw(14)

2.3 平流雾的参数描述

г谝陨系男鹗鲋,实际使用了式(12)中的两个参数d和c来描述平流雾。这两个参数的值对最后计算得到的雾化因子f有决定性的影响。但在具体应用中,这两个参数的意义都不是十分明显,用户更习惯使用雾的能见度和高度来进行表述。

用户习惯使用能见度来描述雾的浓度,而不是使用┦(12)中代表雾在零高度下的密度值。为了便于用户更方便地控制雾,本文提出使用如下方法来完成能见度到d的转换。

在零高度下,雾的密度就是常数d,即式(10)。假定用户指定的能见度为v,则可以认为在距离视点v处的物体的雾化因子为0。根据式(4),则在这个时候像素的颜色完全由雾的颜色决定,而物体原本的颜色对像素的最终颜色没有贡献,即:

f=e-dv=ε(15)

其中ε为趋向于0的常数。

根据式(13),可以得到常数d和能见度v之间的转换式:

d=ln(MAX)v(16)

其中MAX是为了求解式(13)而采用的一个非常大的数。

同样,用户对雾随着高度变化的衰减常数c也没有一个直观的认识,在实际应用中用户更常采用的描述是雾的高度h。为了在雾的衰减因子c和雾的高度h之间建立联系,本文认为根据式(12),雾在高度h处的密度为0,即:

e-ch=ε(17)

类似地,可以求得c的表达式:

c=ln(MAX)h(18)

根据式(16)和(18),用户对平流雾的描述就可以采用更直观的能见度和高度。

3 平流雾的具体实现

在计算平流雾的雾化因子的过程中,需要计算每个像素对应的点在世界坐标系中到视点的距离,并根据2.2节中定义的公式来完成雾化因子的计算。OpenGL无法满足上述功能,同时由于运行效率的原因,也不能在CPU上完成上述计算。因此,利用现代GPU[12]的可编程性,将上述算法完全实现在GPU上。

在vertex shader部分,完成固定图形管线除了必须完成将物体顶点坐标由物体坐标系转换到窗口坐标系,还需要将顶点转化到世界坐标系中。但是OpenGL Shading Language中只提供了gl_ModelViewMatrix将顶点坐标转换到视点坐标系,要将顶点转换到世界坐标系,还需要知道Model矩阵。由于View矩阵在每帧都是固定的,并且可以通过gluLookAt()函数中的设置计算得到。Ы得到的View矩阵M┆view通过uniform参数传递进vertex shader,通过如下计算便可以得到Model矩阵M┆model:

M┆model=(M┆view)-1×M┆modelview

其中M┆modelview是model-view矩阵。

通过M┆model可以将顶点坐标转换到世界坐标系中,并将其放入gl_TexCoord[0]中传入fragment shader。

在fragment shader中,根据传入的世界坐标系下的坐标和雾化因子的计算公式,便可计算得到雾化因子,最后根据式(4)进行颜色混合计算。

4 实验结果

实验环境在单台PC机(AMD Athlon 64 X2 Dual Core Processor 4400+; 2B048@MB RAM; NVIDIA GeForce 7800 GTX)上进行,实验环境系统为塔台模拟机系统。

为实现基于GPU的实时雾效模拟,在Visual Studio 2008下使用OSG图形系统实现主程序部分,使用着色器语言GLSL实现基于GPU的相应程序。采用本文方法后,其帧率结果如表1所示。

分析表1,可见采用该方法模拟雾效后,系统已经具有很好的实时性。其实验效果如图2~5。其中图2是没有启用雾效时的场景图,图3是全局雾效果,图4是平流雾效果图,图5是改变雾浓度后场景图。

表格(有表名)

5 结语

本论文在基于OpenGL传统模拟雾方法的基础上,对OpenGL雾方程进行改进,提出一种实现平流雾的算法,然后利用OSG与基于GPU的GLSL程序实现了平流雾效果,并将其运用到复杂三维场景塔台模拟机系统中,开发出了真实感强的雾化效果,并达到了系统的实时性要求,实验验证了可以将该方法运用于室外大场景仿真系统中。在未来的研究中,可以结合视点、物体和雾三者之间的关系,根据本文提出的算法对雾效方程进行改进运用,可以模拟生成辐射雾等多种雾效。

参考文献:

[1]湛永松,杨明浩,石民勇,等.保持自然特征的烟雾快速生成系统[J].系统仿真学报,2007,19(19):4460-4464

[2]李秀连,陈克军,王科,等.首都机场大雾的分类特征和统计分析[J].气象科技,2008,36(6):717-723

[3]熊秋芬,江元军,王强,等.北京一次浓雾过程的边界层结构及成因探讨[J].气象科技,2007,35(6):781-786

[4]EBERT D S, PARENT R E. Rendering and animation of gaseous phenomena by combining fast volume and scanline a buffer techniques [C]// Proceedings of the 17th Annual Conference on Computer Graphics and Interactive Techniques. New York: ACM Press, 1990: 357-366

[5]STAM J. Stable fluids [C]// Proceedings of the 26th Annual Conference on Computer Graphics and Interactive Techniques. Los Angeles, California, USA: ACM Press, 1999: 121-128

[6]FEDKIW R, STAM J, JENSEN H. Visual simulation of smoke [C]// Proceedings of the 28th Annual Conference on Computer Graphics and Interactive Techniques. Los Angeles, California, USA: ACM Press, 2001: 15-22

[7]童若锋,陈凌钧,汪国昭,等.烟雾的快速模拟[J].软件学报,1999,10(6):647-651

[8]YNGVE G D, OBRIEN J F, HODGINS J K. Animating explosions [C]// Proceedings of the 27th Annual Conference on Computer Graphics and Interactive Techniques. New York: ACM Press, 2000: 29-36

[9]DOBASHI Y, NISHITA T, YAMAMOTO T. Interactive rendering of atmospheric scattering effects using graphics hardware [C]// Proceedings of the 2002 ACM SIGGRAPH/EUROGRAPHICS Conference on Graphics Hardware. New York: ACM Press, 2002: 99-108

[10]OpenGL体系结构审核委员会.OpenGL编程指南[M].北京:人民邮电出版社,2005

[11]JACB. Implementing volumetric fog without using texture stages [EB/OL]. [2009-06-10]. http://www.jcabs-rumblings.com/GDC2001.html

[12]ROST R J. OpenGL 着色语言[M].北京:人民邮电出版社,2006

全文阅读已结束,如果需要下载本文请点击

下载此文档

相关推荐 更多