3D系列4.7 水面
现在是本系列最复杂的部分:水面。但这不是最难的部分;只是需要多个步骤才能实现,但这非常值得:真实效果的水面会让场景更加有真实感。
因为水面绘制包含几个步骤,所以在进入第一步之前,我想最好首先预览一下整个过程更好地理解它。对3D游戏而言,大致有两种水面:海水和湖水。区别在于振幅和波长:对海面来说,需要很多在顶点着色器中进行调整的顶点。
可见教程5.15 在3D世界添加水面学习如何创建一个漂亮的海面。
对本例中的湖水来说,我们处理的是完全平整的表面,在表面上需要创建波浪。因此,我们只需要两个三角形绘制平面!水面效果完全在像素着色器中进行。
记住,在像素着色器中,主要问题是:水面每个像素的颜色是什么?你可以简单地将一张波浪的纹理放置在平面上。但在真实情况中,水面的颜色取决于周围的环境:类似于一面镜子,让我们可以看到周围场景的反射。但水面还是部分透明的,我们也可以看到水面之下的沙地,这叫做折射颜色。所以水面最终的颜色是反射和折射的组合。
我制作了一个流程图,你可以在这张图中找到每个章节所处的位置:
首先,我们需要知道每个像素的反射和折射颜色,所以需要将这两个贴图绘制到两张纹理中。如果我们只获取反射颜色,那么水面看起来就像一面完美的镜子。但是真正的水面不会看起来象镜子,水面之上还有波浪。所以在像素着色器从两个贴图中采样颜色前,我们还要给每个顶点的纹理坐标上施加一些小变形,用来模拟波浪。
然后这两个颜色混合在一起,当我们垂直观察水面时,只看到折射颜色(即水面下的沙地)。当水平观察水面时,只看到反射颜色。这个混合因子叫做菲涅尔项(Fresnel term)。
现在我们获得的颜色是非常纯净和干净的水面颜色,要让它更真实,最后我们需要混合一些蓝灰色。(作为一个小扩展,你也可以在像素着色器中从地形高度图中进行采样,这样水面中更深的部分的折射颜色为深蓝色。)
但我们还需要一些凹凸映射,这样就可以添加一个镜面高光反射(阳光直射的地方会直接反射)。
在下面的截图中,你可以看到不同的步骤:靠近相机的地方,当我们垂直观察水面时,看到的是折射颜色(沙地)。随着视线和水面间的夹角变小,反射占的比重越来越大。看一下山的反射是如何被波浪变形的。非常靠近边界的水面偏蓝,这是最后一步产生的。
发布时间:2009/12/14 上午8:18:38 阅读次数:6854