APP下载

实时水面模拟方法研究

2010-01-01刘晓平谢文军

图学学报 2010年1期
关键词:法线面片纹理

刘晓平, 谢文军

(合肥工业大学计算机与信息学院VCC研究室,安徽 合肥 230009)

自然现象的模拟一直是计算机图形学研究的热点,其中水面的模拟对自然场景的意义尤为重要。由于水面的物理原型十分复杂,实时地对其进行精确描述相当困难,因此研究者们一直在寻求真实感和复杂度之间的平衡点。文献[1]中Nick Foster 等人建立了基于Navier-Stokes 方程的水面模型,模型精确但求解复杂,不适合实时计算。文献[2]例举了线性生成海面网格的方法,采用逆FFT 计算,求得一定数量的线性函数叠加描述波浪,该类方法追求统计学上的模拟,未考虑物理精确性,有待于与流体动力学理论的结合;而在游戏等需要快速生成水体的场合,往往采用perlin 噪声[3]等噪声源的预计算生成水面,该方法可以生成视觉效果良好的水面,但无法结合物理计算。近年来,由于硬件技术的发展,尤其是可编程图形硬件的出现,基于GPU 像素级的可编程能力,实时模拟较复杂的水面成为可能,各种模拟方法也随之产生。

而在水体渲染方面,初期常用的方法是构建均匀的三角网格,通过定点的高度变化显示水面,文献[4]以三角网格为基础,引入LOD 思想提高绘制速度,和折射反射计算,建立了完整的海浪模型,但此种方法在较大海域时必然由于网格量的增大导致速度缓慢。而近来Cg 语言的片段编程能力使得用少量面片模拟水面成为可能,文献[5]提出了一种通过预生成噪声纹理的方法,结合少量的顶点数,通过查询纹理图模拟细节,该方法获得了较好的噪声源,但在渲染大水面时,所需的噪声图大小也增大,严重消耗了系统资源。文献[6]采用了渲染到纹理的方式,实时生成折射、反射纹理,并将绘制水面所需的面片数简化到了两个,方法也具备较好的沉浸感,但其中的扰动、凹凸和波光效果仍依赖纹理输入,渲染效果自然受到纹理大小和质量的制约。

因此,为避免复杂的计算和对外部输入的依赖,基于文献[6]的用两个面片显示水面的方法,本文提出了一种基于GPU 的实时生成和渲染水面的方法。该方法仍使用折射和反射纹理的方式。而不同的是,纹理生成后,水面合成及模拟步骤均在GPU 片段程序中实现。由于片段程序中显卡已对物体进行了光栅化操作[7],计算量不会随的水面大小变化,故不需要附加进行LOD处理,也不需要附加消耗显存资源。通过定义完整地光学模型,可以达到了良好的的水面渲染效果,且基于可编程显卡的强大的流计算能力,本方法对渲染速度的影响很小。

1 本文方法

由于本文采用的是两个三角形面片组成水面,在OpenGL 中,绘制的水面即位一个巨大的矩形,四个顶点的初始纹理坐标分别为(0,0), (0,1), (1,0), (1,1),在顶点程序中将未经过投影变换的顶点三维坐标和纹理坐标传入片断程序。片段程序在光栅化时,将根据各像素点的相对位置进行这些值的插值处理,使得可以获得各像素点对应的空间坐标和纹理坐标,作为计算波形的参数。

1.1 水波的模拟

为进行后续的扰动和凹凸计算,本文要求水波的生成函数近似可导,以显式获得水面上任一点的法向量。而由于缺乏位运算,缺乏全局缓存,以及数据精度的限制等[8],导致了GPU 不能实现perlin 噪声等经典的噪声函数。

因此,考虑GPU 运算的这些特点,文献[9]基于线性叠加理论,提出了在顶点程序中使用若干不同相位,不同频率的正弦波的幂函数叠加的方法模拟水面。该方法体现了水波在波峰和波谷时所受的重力影响,且波的数量足够多时可以获得较复杂的水面,但如图1 所示,幂函数无法生成波谷处过渡平缓的曲线。

图1 3 种函数波形对比

因此,考虑GPU 对指数函数的硬件支持,以及显式求导的快速,本文采用余弦的自然指数函数叠加

其中 t 为时间参数,N 为叠加函数的数量, Dnx, Dny为波移动的方向分量,f requencen为波的频率, speedn为波的推进速度,参数A 为 控制振幅。这种方法在保证波浪模拟的同时,不会增加的计算负担。

由于法线N 与这两个方向向量 xN 、yN 均正交,且 xN 、yN 不重合,因此有

1.2 折射与反射纹理扰动与合成

需要对生成的折射纹理与反射纹理进行合成,由于每一点的高度和法线都不同,则该点的折射及反射方向与平静水面相比会有一定偏差。因此,为显示提高所绘水面的真实感,需要在合成折射、反射纹理时,进行符合物理原理的扰动。

忽略水面高度的起伏量,如图2 所示,对于反射,可见水面法线的变化使得原本沿视线VO而在纹理面上得到的查询点的Q1 点发生偏移,移动成为P1′点;而如图3 所示,对于折射,查询点Q2 点位置移动到了P2′点,其移动趋势与反射相反。

图2 反射扰动原理

图3 折射扰动原理

扩展到二维的纹理查询空间,由法线的x,y分量乘以扰动参数,分两个方向计算

其中dC 为经验常数,在计算反射时为正,计算折射时为负,且折射时小于反射。将得到的( Du,Dv)与纹理坐标相加,再乘以投影纹理的矩 阵便得到扰动后的折射、反射纹理坐标。而后引入了菲涅尔(Fresnel)效果的进行合成,最后的合成结果为

1.3 水面光照模型

折射和反射扰动在一定程度上增加了水面的真实感,但不能带来水面的起伏感。而水面的起伏在视觉上很大程度上来自于水面上的明暗交替和粼粼的波光。依据图形学中对光照基本分量的定义,以及水面的光学特点,定义一定的光学模型,以确定像素的最后颜色。

环境光分量环境光体现了物体来自分散在场景中各个方向光影响的效果,在水面现实中分量用于表现水的原有颜色,由于水的颜色与所 视深浅相关,因此采用公式 Ambient = Ka× waterColor × (N ⋅ eyeDirection)计算出该点水 的颜色(如图4(a))。

漫反射分量漫反射量与光到达物体表面的入射角度成正比,快速计算时采用光源到点的方向向量L 和法线N 的点乘作为强度参数 diffuse =Kd× lightColor × max ( N ⋅L,0) (如图4(b)),由于水面的透明,受到满反射 光的影响极小,因此 dK 可以设定为接近于0 的 小数,或者可直接忽略该项。

镜面反射分量镜面反射分量用于表现主要反射方向附近的反射光,由于水面可视为光滑表面,因此为表现出波光粼粼的效果,镜面反射项尤为重要。镜面反射的计算也要考虑到观察者的位置,因此将光线与视线的均值H 与法线N的点乘作为控制参数,鉴于水面的光滑特性,应设定较高的光滑参数shininess 使得高光区(波光)较小(如图4(c))

合成对3 个分量进行合成,得到光照系数light =ambient+diffuse +specular ,得到实现最终的光照模型如图4(d)所示。

图4 光照模型合成示意图

2 实验结果与分析

本文方法在Intel P4 3.0,2G 内存,nVidia 6600GT 显卡硬件环境下,实现效果如图5 所示。由图可见,该方法较好地表现了场景和物体在水面的倒影,水面下物体的折射,水面扰动和光学模型。

实验数据见表1。可见算法可以达到实时,且在相同场景下,还其他方法进行了实验:其中,三角网格法才用其中网格法采用了128*128 的较小规模的网格;噪声纹理法1 为文献[5]方法,结合了32*32 的网格和128*128 的噪声图;噪声纹理法2 为文献[6]方法,采用了两个三角面片,和512*512 的噪声图;而本文方法由8 个正弦指数函数叠加。

由对比可看出,三角网格法虽然有精确的模型,可以显示接近物理真实的效果,但速度十分缓慢;而依赖查询纹理的方法,仍需要控制纹理大小和面片数量,达到速度和精度的平衡;相比之下,使用GPU 进行水波生成和实时运算几乎不需要消耗显存资源,且无明显的速度损失,视觉真实感也较好。

图5 场景演示

表1 运行结果对比

3 总结与展望

自然场景尤其是水面的仿真是近年来的热点之一。尤其是可编程图形硬件产生以来,用较少量的面片绘制复杂的水面成为可能。本文采用GPU 的片段处理器编程技术,实现了一整套实时的水面模拟方法,包括生成水波、计算法线、折射与反射的扰动合成以及光照模型的建立,避免了现有快速渲染效果对输入纹理质量的严重依赖;同时基于片段处理器的像素级操作的特点,避免了扰动时对深度计算需要和LOD 操作。最后通过实例,验证了本文方法的具有良好真实感效果和实时性。但由于GPU 的限制,一方面基于物理的计算速度尚无法在处理较大的区域时达到实时;另一方面由于片段处理器尚不支持位操作,不能生成良好的噪声。导致现阶段只能采用线性叠加的方式,若叠加所用的波源较少,在高角度观察时仍能感觉到波浪的规律性。

[1] Nick Foster, Dimitri Metaxas. Realistic animation of liquids [J]. Graphical Models and Image Processing (S1077-3169), 1996, 58(5): 471-483.

[2] 聂卫东, 等. 基于线性海浪理论的海浪数值模拟[J].系统仿真学报, 2005, 5(17): 1037-1044.

[3] Hugo Elias. Perlin noise [EB/OL]. http://freespace. virgin.net/hugo.elias/models/m_perlin.htm.

[4] Jerry Tessendorf. Simulating ocean water [Z]. SIGGRAPH 2001 Course notes, 2001.

[5] Yuri Kryachko. Using vertex texture displacement for realistic water rendering [M]. GPU Gems2, 2005. 283-294.

[6] 马 骏, 朱衡君, 龚建华. 基于Cg 和OpenGL 的实时水面环境模拟[J]. 系统仿真学报, 2006, 18(2): 395-400.

[7] Randima Fernando, Mark J Kilgard. The Cg tutorial— the definitive guide to programmable real-time graphics [M]. Addison Wesley, 2004. 14-19.

[8] 吴恩华, 柳有权. 基于图形处理器(GPU)的通用计算[J]. 计算机辅助设计与图形学学报, 2004, 16(5): 601-612.

[9] 方建文, 于金辉, 马文龙. 图形硬件加速的实时水面绘制[J]. 计算机工程与应用, 2006, 42(15): 86-88.

猜你喜欢

法线面片纹理
基于定位法线的工件自由度判定方法及应用
三维模型有向三角面片链码压缩方法
基于BM3D的复杂纹理区域图像去噪
初次来压期间不同顶板对工作面片帮影响研究
使用纹理叠加添加艺术画特效
椭圆法线定理的逆定理
TEXTURE ON TEXTURE质地上的纹理
甜面片里的人生
消除凹凸纹理有妙招!
双曲螺线的副法线曲面的相关性质研究*