水面与纹理动画

本文介绍了水面效果的不同实现方法,从早期的纹理动画到现代的Shader技术。详细解析了纹理动画的工作原理及其在游戏开发中的应用,例如《魔兽世界》中的水面效果就是通过特定的纹理算法和光照处理来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、水面实现方法

l 最找人们考虑水面,往往将其考虑为一堆三角形组成的网格,网格的规则抖动便构成了波纹。但是,这种方法可以让场景比蜗牛还慢,因此只用作研究。

l 早期水面的实现方法基本上都是纹理动画,这种方法直到今天为止还在使用。纹理动画最简单最基础,对美工的要求比较高,对程序要求相当低。

l Bump Env技术出现后,水面的实现方法便开始多样起来,这些水面为场景的真实性做出了不朽的贡献。

l Shader改变了水面实现的方式,它使得人们创建动感的水成为了可能。

l Shader实现的水面可以完美地显示出波动和其他特殊的效果。

二、纹理动画原理

l 类如电影胶片,纹理动画将循环播放一组纹理,并用这组纹理来描述动画。

l 纹理动画的用途相当广泛,水面只是这些应用中比较出彩的一种。

l 平均每s毫秒顺序播放一个纹理,播放完毕后重头开始播放,以此便可实现纹理动画

l 动画更新函数

Void Update( float fElapsed )

{

m_fElapsed += fElapsed; // 更新时间

if( m_fElapsed >= s ) // 如果到了需要切换纹理的时间

{ ++Texture_Index; // 切换纹理标号

if (Texture_Index >= MAX_TEX_INDEX) // 如果已经播放完毕

{ Texture_Index = 0; } // 重头开始播放

m_fElapsed = 0.0f; // 重新计时

}

}

l 渲染函数

Void Render()
{
//
根据当前的纹理标号进行渲染
SetTexture( m_Textures[Texture_Index] );
DrawPrimitive();
}

l 纹理动画所实现的水面一般由大量平板组成。

三、水面的VBIB

l 纹理动画实现的水面很少有需要动态变化的,因此创建静态的VBIB以提高渲染速度成为了一个优化的手段。

l 具体实现参看代码

四、魔兽水面纹理算法

l 魔兽水面经过打光处理,所以我们必须添加一个光源,和一个材质。

l 同时,为了将光的影响和水本身的纹理因素添加到一起,由于水本身的纹理较暗,我们使用ADD算法,使得光对水面的影响更加明显。

l 最后,水纹理在Alpha通道中存的高光信息,通过MODULATEALPHA_ADDCOLOR算法使之影响到场景中。

l MODULATEALPHA_ADDCOLORArg1RGB + Arg2RGB*Arg1Alpha

l 这里只需要为Arg1Arg2都取Current就可以了。

五、总结

l 水面的实现技术包括网格化水面、纹理动画、硬件BumpEnv和各种不同的水面Shader算法。

l 用纹理动画实现水面,必须依照纹理的特性而选择不同的纹理算法。

l 对于魔兽的水面,除了打光外,我们开启了两条纹理通道,分别使用了ADD算法和MODULATEALPHA_ADDCOLOR算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值