这里是普通的地址制作,后面再说LOD地形。
地形的原理就是一个很大的模型,一般上面凹凸不平,并且不是一整张的贴图而是通过一张“透明图”来将三张不同的图片素材混合在一起来做到实际地形的效果,如图;
下面我将建立一个64*64格子的地图:
--- 你需要65*65个顶点
--- 准备一张高度图65*65大小,作为每个顶点的Z坐标:PS里面建立一个650*650的图 => 图像=>灰度,滤镜=>渲染=>分层云彩,缩小到65*65,然后另存为*.raw格式
这个raw格式的文件由65*65个字节组成,每个字节就是对应一个像素点的灰度值(0-255)。
--- 准备一张透明图65*65大小,随便网上DOWN一张图片稍加处理下即可:每个像素点都有RGB值,
根据RGB值的分布公式=第一张素材*Ralpha+第二张素材*Galpha+第三张素材*Balpha,表示不同的图片根据既定的比例透明度混合(会在shader里面计算)
--- 准备三张地形贴图小素材,比如我的三张48*48的小图
高度图: 透明图: 根据透明图来混合的三张图源,为了更好的看到效果所以我选择了接近RGB的素材:
制作步骤:
1-3D环境搭建,这个在前面几章有说明,这里就不提了
2-绘制65*65个顶点的正方形网格,X、Y的话可以在程序中计算好,间隔应该是固定的,至于Z你可以先填0,这样的话就是一个平坦的地形。
3-在第二步里加入从高度图中读取的高度,成为Z,因为是0-255的,你可以视情况统一缩放,这样地形就不平坦了
4-接下来为了在shader里面对三张素材混合,在不同的点显示不同的混合贴图样式,你将读取透明图的信息,将每个像素点的坐标对应到相应的地形顶点中的VB里面去。
5-shader里面进行混合显示:
"tex ft0, v1, fs0 <2d,linear,repeat,nomip>\n"+
"tex ft1, v1, fs1 <2d,linear,repeat,nomip>\n"+
"tex ft2, v1, fs2 <2d,linear,repeat,nomip>\n"+
"mul ft0,ft0,v3.x\n"+ // 原图1*参数1
"mul ft1,ft1,v3.y\n"+ // 原图2*参数2
"mul ft2,ft2,v3.z\n"+ // 原图2*参数2
"add ft0, ft1, ft0\n" + // 混合图2 ADD
"add ft0, ft2, ft0\n" + // 混合图3 ADD
"mov oc, ft0\n" // 输出
代码由于较多暂时就不全部贴出来了,请在范例工程中自行查看:范例工程5 密码 22g6
范例工程提供,启动后5秒前是平坦的地形,为了看出和透明图差不多的样貌,5秒后开启高度图就是比较像样的地形了(参考第一张图)。
以下是关闭了shader中灯光效果的,更容易看清楚