模拟动态水的算法有很多种,比如:perlin noise, FFT, NSE, sine wave等等。为了使水更逼真,还应该实现其最基本的属性,那就是反射和折射了。
讲到环境映射可能就会想到cube map,当然cube map可以用来反射周围环境,但是它的使用对象只局限于物体于环境来说是很小的基础上的。若是对局部近距离物体进行反射时,会有很明显的差错。因此就需要实时获取周围环境并渲染到相应纹理,再投射到水面上。
折射的实现其实和反射差不多,只是截取对象水面下的那部分,此外还要考虑的就是Fresnel term(用来混合反射和折射)。最后用各种算法来扰动纹理坐标就可以得到不错的效果了;)
下面这张图是我运用该方法实现的反射效果,水波算法是用CPU计算的NSE算法。
此外,光照到水面上的反射光可以用phong model实现。水面下还有视域及caustic effect(就是水面上折射下来的光的效果)
自然界最常见的水实现起来却那么麻烦。。
// 附上EXE,要求显卡支持GLSL