真实感海水的绘制
作者:Dawn 日期:2009-06-30
摘要:
海水渲染技术在地理信息系统、海洋学、数字游戏、电影特效等方面都有广泛的应用。本文从海水生成方法、大规模海水绘制技术、海水绘制细节处理、海水交互等几个方面进行了探讨,分析了国内外前沿的海水绘制技术,给出了一定的对比分析。文末展示了使用部分海水绘制技术绘制的海水的效果图。
关键词:
海水渲染, 菲涅耳系数, 海水交互, 网格映射, Perlin噪声
1 海水绘制研究的背景
海浪是自然现象的重要组成部分,对海水的实时模拟已经成为计算机游戏、虚拟现实应用以及电影制作的强有力的辅助工具,同时对于水力学、流体力学、波动力学、海洋学等都具有重要的实际意义。
目前,海水的绘制算法已有多种,比如:FFT合成技术、perlin噪声建模以及基于物理模型的Navier Stokes方程等等。今年来随着GPU技术的发展,FFT计算可以在GPU上完成,使得基于FFT技术的实时海水模拟成为可能[]。基于perlin噪声的海水建模也能得到较为真实的效果,其优势在于利于实现。而基于基于物理模型的Navier Stokes方程的绘制方法由于计算量大的原因,较少研究人员采用。而07年SIGGRAPH的一篇基于粒子的交互海水绘制的文章,提供了一种研究海水绘制的新思路,其实现的方法简单,耗费的资源少,最好的效果贴近真实。另外值得一提的是,海水绘制的相关技术如大规模海水的绘制、海水细节的表现以及良好的交互性都逐渐成为人们关注的热点。本文将从海水的生成方法、大区域绘制、细节呈现、海水交互等几个方面进行分析。
2 海水的生成方法
海水的生成方法有多种,正弦波叠加的方法不适应于模拟有高浪的海面,而FFT的方法在GPU加速的情况下能够获得较好的实时及真实感效果。基于N-S方程的方法,完全基于物理模型,虽然模型真实,但难以实时绘制。本为采用的Perlin噪声的方法,在海浪的模拟效果方面虽然略低于FFT的方法,但实现和GPU加速都较为容易。另外还有一种简化的2d波动方程,也可用于海水的模拟,本为在海水交互方面使用这种方法,见5.1节。下表为几种常见的海水建模方法的比较:
现对Perlin噪声的方法做一个详细的介绍。Perlin的一个特点就是随机值的连续性,正是由于这种特性,其适用于海水的模拟。为保证随机值连续,往往使用插值实现,可使用线性插值、二次插值、三次插值等几种方法使得随机值连续,当然计算量与插值效果成正比。下图是三种插值方法的效果对比。
为降低随机性,通常还使用平滑插值对随机值进行平滑操作,消除对比度较高的部分。
根据Perlin噪声函数依次计算每个海水网格点的高度,同时引入一个时间量作为参数,根据Perlin噪声的连续性,可得一个随机且连续变换的海面高度图,公式如下:
3 大区域海水的模拟
3.1 LOD技术
LOD的定义:不影响场景视觉效果的基础上,通过逐级简化景物的表面细节来减少场景的几何复杂性,从而提高绘制算法的效率。
对于海洋场景而言,层次细节的选择依据主要有一下几个方面:视点与地形之间的距离、视线方向、地表特征等
通常可使用四叉树、RAOM、Geomipmapping等LOD技术,各种LOD技术都需要考虑裂缝、突变等因素对绘制的影响。裂缝通常可使用多边形衔接或裙边技术解决,而突变往往使用线性插值来处理。
3.2 视点相关的投影网格法
投影网格的主要思路是,显存中始终保存一组网格,其总是显示于视野内,根据视野的变换,网格投影的位置也跟着变换,这样的化,减少了渲染网格的数目,使得无限大海面的渲染成为可能。但是,视野的频繁变换以及变换的繁杂计算都将影响最终的显示效果。但投影网格的方法为大区域海水绘制提供了一个不错的思路。
投影网格的思想不仅可用于水面面实现, 实际上空间内任何一个平面都可以作为投影面看待, 只要使用适当的坐标变换矩阵, 实现方法完全相同。我们还可以想象投影在一个球体表面的情况, 由此可以很好地表现地平线处的弧线效果, 但是会出现很多特殊的问题, 需要更多的限制条件, 这方面有待未来做更深人的研究。
另外,投影网格也有其缺点,网格的固定,使得海水的实时交互较难实现。转换视角过快,将带来一定的视觉误差。
4 海水细节的绘制
4.1 海水的反射及折射现象
海水作为透明物体,其漫反射颜色Cdiffuse由两部分按一定比例混合而成,一是来自天空的反射Csky,二是来自水下光线的折射Cunderwater。混合比例是由菲涅耳(Fresnel)系数决定的,Fresnel的计算公式如下:
其中Ssky、Sunderwater为比例系数。来自天空反射的颜色可通过相应的三维纹理坐标查找天空立方体纹理图获得,而水下光线折射可采用海底地形的颜色或默认的一个海水的颜色。对水面来说,当观察者和水面的角度越小时,反射效果越明显,角度越大时,折射效果越明显,称为菲捏尔效果。Fresnel系数的取值范围是[0.0,1.0],如果Fresnel系数是0.8,那么反射光线比例为80%,而通过水下折射到.达海水表面的光线的比例为20%。
4.2 海面的光照
使用以下公式计算光照对海面颜色的影响。ambient为环境光,diffuse为漫反射光分量,lightVecT为太阳位置的向量,normT为海面的法线朝向。
ambient = color*gAmbientLight
diffuse = max(dot(lightVecT, normT), 0.0f)*color*gDiffuseLight
4.3 水面刻蚀效果
水与光相互作用能产生一种弯曲的在海底形成的刻蚀效果,因此海面上就可以看到变幻无穷的花纹。GPU精粹中介绍了一种基于Shader的方法升级并提高了经典的算法。文中的算法步骤为:1)绘制海底表面;2);a.反射一条垂直的光线;b.使光线与海的网格相碰;c.逆向使用shell(光线折射定律)定律计算折射光线;d.使用折射的光线为“太阳”贴图计算纹理坐标;e.把纹理坐标应用到精细网格的顶点;3)渲染大海表面。
4.4 海水与陆地的融合
GPU精粹3介绍了一种使用深度及延迟渲染技术来绘制水与陆地友好融合的方法。下图为效果对比图:
文章里提到的方案是使用图像处理的方法进行边缘检测。首先将可能为水与岸的边界提取出(主要根据对比度来判断),然后将该边界进行图像处理,使最后的绘制结果更为真实。
5 海水的交互
5.1 物体与海水的交互-波浪
物体落入海中或者船只在海里航行,都需要涉及与海水的交互。在支持VertexShader3.0的电脑上可进行顶点纹理的读取,这个新的显卡管线的可编程特性利于海水交互的实现。可使用一个简化的2D波动方程来描述海浪的变化。实现过程需保存近两次水波变化的情况,然后在GPU中进行水波情况变化的计算。每帧更新,即可模拟海浪的变化。将最后计算出的海面高度变化值加上海浪生成时的高度,作为最后的绘制高度。
5.2 风与海面的交互
为避免生成的海水过于随机,所以需增加风对海面的影响,这里给出一个方向波公式:
其中 ,w是频率,c是波速,an是振幅。可根据输入的风力调整an 与w,根据风向调节p与q的比例。这样便考虑了风的交互。
另外,在SIGGRAPH2001文章Simulating Ocean Water里,也给出了基于风向的水面方程,该论文使用FFT来描述水面。
6 部分技术的程序实现及性能分析
6.1 绘制结果
部分技术可使用GPU进行加速,使得绘制帧率保持在100FPS以上。测试机器为P4 3.0,1G内存,NVDIA7900显卡。
7 展望
本文对海水仿真技术的各个方面进行了讨论。将来的工作主要有:
1)在GPU端实现FFT计算,将FFT用于海水绘制;
2)寻找一种将交互式技术与投影网格技术相结合的方法;
3)抽象一种合适的可调参数的风模型,将其用于海水的交互;
4)可以考虑加入海底深度对海水绘制的影响。
5)通过其他方法改善文章提到算法的不足。比如增强投影网格法海水的实时交互性。
8 参考文献
[1]Moreland,Kenneth,and Edward Angel. The FFT on a GPU. SIGGRAPH/
Eurographics 2003
[2]Claes Johanson Real-time water rendering Introducing the projected
grid concept Master of Science thesis
[3]Jerry Tessendorf Simulating Ocean Water. 2001 siggraph
[4]Perlin Noise.http://freespace.virgin.net/hugo.elias/models/mper lin.htm
[5]柳有权 刘学慧 朱红斌 吴恩华. 基于物理的流体模拟动画综述. 计算机辅助设计与图形学报. 2005.12
[6] 吴磊. 交互式实时水面渲染. 计算机应用研究
[7] Kim Pallister. 游戏编程精粹6.人民邮电出版社.2007
[8] Matt Pharr. GPU精粹2. 清华大学出版社. 2007
[9] Randima Fernando. GPU精粹. 人民邮电出版社. 2006