一、水面实现方法
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 纹理动画所实现的水面一般由大量平板组成。
三、水面的VB和IB
l 纹理动画实现的水面很少有需要动态变化的,因此创建静态的VB和IB以提高渲染速度成为了一个优化的手段。
l 具体实现参看代码
四、魔兽水面纹理算法
l 魔兽水面经过打光处理,所以我们必须添加一个光源,和一个材质。
l 同时,为了将光的影响和水本身的纹理因素添加到一起,由于水本身的纹理较暗,我们使用ADD算法,使得光对水面的影响更加明显。
l 最后,水纹理在Alpha通道中存的高光信息,通过MODULATEALPHA_ADDCOLOR算法使之影响到场景中。
l MODULATEALPHA_ADDCOLOR:Arg1的RGB + Arg2的RGB*Arg1的Alpha
l 这里只需要为Arg1和Arg2都取Current就可以了。
五、总结
l 水面的实现技术包括网格化水面、纹理动画、硬件BumpEnv和各种不同的水面Shader算法。
l 用纹理动画实现水面,必须依照纹理的特性而选择不同的纹理算法。
l 对于魔兽的水面,除了打光外,我们开启了两条纹理通道,分别使用了ADD算法和MODULATEALPHA_ADDCOLOR算法。