自动检测海岸线,生成海浪网格







  谈这个主题不得不又提到Farcry,它实在是室外场景渲染的领先者。在Farcry中,沿着海岸线连绵不绝的海浪玩过的人肯定都有印象,十分接近我在海南看到的景象了。在Farcry中由于海岸线漫长,如果这些海浪网格都由手工编辑无疑是个单调且巨大的任务。最近按着自己的想法试着由程序自动检测海岸线并生成海浪网格。经过几天的调试,居然已经非常接近Farcry中的效果,这使我相信Farcry就是这么做的。当然要完全达到Farcry中的效果还要仔细调整程序,也要美术付出相当的努力。下面就简单谈谈其中的方法。



  图中橙色区域代表陆地,浅蓝色区域代表水面。绿色网格代表高度图网格,可以是一个地形单位(一个Patch),也可以是任意范围的地形。深红色曲线代表海岸线。整个检测及构造过程分为下面几步:

    1.遍历地形网格的所有边,如果一个边的一个端点高于水面,另一个端点低于水面,则通过差值找到这条边和水面的焦点并加入链表。通过遍历可以找到图上1至14点。
    2.由于第一步遍历时是按网格顺序的,并不能保证得到的顶点是按海岸线顺序排列的,所以需要进行一次排序保证这些点按海岸线顺序排列,也就是图上标号的顺序。需要指出的是第6和13点由于距离前一点太近在排序过程中被抛弃。
    3.计算海岸线上每一点在水平方向的法线,法线方向指向水面方向。
    4.因为地面网格精度很低,生成的法线一般变化比较突然,不平滑,所以对上一步生成的法线进行多次过滤(与旁边的顶点法线相加取平均值)。
    5.将海岸线上每一点沿法线方向扩展一定宽度得到另一组顶点。
    6.根据前面得到的两组顶点生成表示海浪的三角形网格条带。
    7.为每一个顶点计算正确的UV和颜色值。

    经过上面的步骤就可以绘制海浪效果了,不过要达到Farcry中的效果还需要合适的贴图和适当的VertexShader和PixelShader。这里面也有一些技巧,这里就不细说了。

原文地址:https://www.cnblogs.com/cproom/p/485748.html