海水的绘制 - Read.DOC

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
海水的绘制 - Read

海水的绘制 一、概述 电影《泰坦尼克号》想必大家都很熟悉。在影片开头那个堪称最经典的镜头中,泰坦尼克号徐徐地离开南开普顿港口驶向茫茫的大西洋L)集成到了GPU中,从而大大降低了CPU的负担,GPU的并行处理功能一举突破了以往在复杂的几何计算过程中,CPU速度过慢所引发的瓶颈。随后,NVIDIA推出了Geforce3,更是为桌面显卡开创了一个新的时代。GeForce3是第一款可编程的GPU,拥有独立的顶点渲染单元(vertex shader)和象素渲染单元(pixel shader),可用以实现丰富的特效和逼真的视觉效果。 目前,水波的绘制算法已有很多种,比如:Fourier合成技术、perlin noise建模以及基于物理模型的Navier Stokes方程等等。《水世界》, 《泰坦尼克号》这些电影就是用FFT(快速离散傅利叶变换)建模来绘制逼真的海水。但这种方法比较复杂,速度也慢一些,因为FFT运算只能在CPU上运算,无法使用GPU的功能。最为简单的水波生成方法是正弦波叠加技术,这是一种空间域的Fourier合成技术,通过将一系列不同频率、相位、振幅的的正弦波叠加起来产生所需的水波。其突出的优点是速度快,可由GPU的并行处理功能来承担建模运算,但缺点是只能模拟小振幅的水波。只有动态的水波还不够,必须要有一个特制的光照模型,否则生成的海水看上去一点也不真实。本文应用vertex shader实现多个正弦波叠加来拟合动态的水面;使用立方体纹理图(cube map)模拟海水的外部环境,用pixel shader来完成特制的光照模型。在800x600的分辨率下,能达到每秒30帧的速度(使用的显卡是Geforce FX 5200),实时地展现具有真实感的海水动画。 二、水波的建模 运用正弦波叠加技术的波纹函数定义为: 其中:Ai为第i个正弦波的振幅 L i为第i个正弦波的波长 Dix、Diy为第i个正弦波的前进方向 S i为第i个正弦波的前进速度 t为时间 上述的函数实际上定义了t时刻水波的高度场。当t连续变化时,就得到了水波的运动。将该波纹函数作为位移函数扰动景物表面,可产生所需水波的动态效果。 理论上,任意波形都可使用无数个正弦波叠加而成。不过为了实时生成水波,本文只使用了四个正弦波叠加,因此速度是保证了,但是形成的动态水面只是一个粗糙的水面轮廓。为了弥补细节上的缺失,可将一个预先定制的Bump mapping(凹凸纹理映射)映射到水面轮廓上,来展示水面细小的波纹,从而提高真实感(如图1所示)。 凹凸纹理映射是一种无需修改表面几何模型,通过景物表面法向量的扰动,导致表面光亮度的突变(光亮度是法向量的函数),是模拟表面凹凸不平质感的有效方法。向量(0,0,1)在凹凸纹理映射中表示未经扰动的法向量,扰动后的法向量存储在一个二维数组里,称为凹凸映射图。对高度图(height field)进行处理,就可以构造一个凹凸映射图。在具有的高度图中,用h(i , j)表示储存在(i , j)位置的高度值。于是可先计算出该位置的在U和V方向上的切向量,进而通过U(i , j)与V(i , j)的叉积得到该处的法向量(公式见下)。 显然前述运用正弦波叠加技术生成的波纹曲面的法向量不会是(0,0,1),所以无法直接使用凹凸映射图。解决的方法是:在波纹曲面的每一个顶点位置,利用该处的切向量构造一个切线坐标系(见图2)。在该局部坐标系下,顶点的法向量总是指向z轴正方向,即(0,0,1),这样就可以根据二维的纹理地址直接获取凹凸映射图里扰动后的法向量。剩下的问题只要在每个顶点处利用下面这个矩阵,该矩阵可将对应的凹凸映射图法向量从局部切线空间转换到世界坐标系(B、T、N分别是切线空间的三个坐标轴)。 其中: directx 9.0带来的一项新功能是高级渲染语言(High Level Shading Language,简称HLSL)。在directx 9.0 推出以前,如果不使用nvidia公司推出的cg,只能用汇编语言编写vertex shader和pixel shader,非常麻烦。使用HLSL,不用再考虑那些硬件细节,把精力集中在算法上,而且HLSL是高级语言,代码非常容易阅读。本文的演示程序就采用HLSL语言编写在GPU运行的顶点渲染和像素渲染的自定义程序,来替换原来固定的渲染流水线。具体的vertex shader代码如下: //----------------------------------------------------------------------------- // Global variables //-------------------

您可能关注的文档

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档