帮忙做网站,优化营商环境应当坚持什么原则,有专门做电商网站的CMS吗,已经建网站做外贸比较常用的地形生成算法有三种#xff1a;四叉树算法,GeoMipmap算法#xff0c;移动立方体算法目前市面游戏采用的方案基本都是以这三种算法为基础实现的#xff0c;下面依次进行介绍四叉树算法很经典的算法#xff0c;在没有GPU的时代就已经出现了#xff0c;原始算法是纯…比较常用的地形生成算法有三种四叉树算法,GeoMipmap算法移动立方体算法目前市面游戏采用的方案基本都是以这三种算法为基础实现的下面依次进行介绍四叉树算法很经典的算法在没有GPU的时代就已经出现了原始算法是纯cpu的实现不过在现在已经可以将其实现为GPU-Driven的形式。这里主要介绍CPU上的实现GPU实现将在之后进行单独的介绍。四叉树顾名思义就是每个根节点最多有四个孩子的树其结构能够很好的表现平面的分化。算法简介初始化时为一个根节点视点靠近时四分每个节点对应一个网格分化公式距离/节点边长CL CL为自己设置的一个值CL越大越容易分化此外也可以根据屏幕占比进行分化这里也可以进行一个优化预处理生成一份陡峭度数据去干预分化越复杂的地形越易分化如果地形没有任何起伏那么完全不分化也是没问题的。下图展示了动态的分化过程到这里基本的思路就已经讲完了但还需要解决一个问题也就是“裂缝”见下如上图所示由于不同分化层级网格毗邻处顶点数不一致采样精度不同就会导致漏面的情况在经典算法中是这么解决的将网格分为5个部分其中上下左右四个部分会根据邻居节点的分化程度去控制网格的生成方式如下所以如果邻居的分化程度较低则会去掉一些顶点使边界顶点正好对齐来保证采样精度一致。此外也要保证相邻节点的lod层级最多相差1在根据公式分化后还要依次检测每个节点的邻居是否存在分化程度比自身高两个层级的节点是的话要强制分化该节点。这个算法其实不是很好目前也没看到哪个游戏采用这种方式。解决裂缝的方式还有很多下面主要介绍三种1.强制对齐2.向下生成一圈外围网格3.边界处按最密进行分化最后效果如下至此四叉树算法就介绍完了之后的实现也是采用的此算法。此外unity也是采用的此算法但老版unity没有采用GPUInstance导致dc奇多新版本虽然进行了优化但由于unity本身不开源无法进行定制开发所以还是不推荐。下面两种算法我没有进行具体的实现所以只是简介。GeoMipmap算法此算法是虚幻4采用的算法大致思路为将地图分为固定数量的mesh每个mesh根据lod生成不同精度的网格见下图lod为0时生成完整网格lod为1时会把黑色的顶点去掉用剩余的白色顶点去生成网格这个过程是完全在GPU进行的。移动端的话基本就采用的上面的两种方式。下面对比一下两种方式四叉树算法的网格近多远少且能通过GpuInstance进行优化dc大概在10左右面数在6w左右。当距离较远时极端情况只有一个mesh。由于地形一般包含多种植被如沼泽沙漠森林且移动端由于性能限制最多也只能采样3次所以1个mesh时会不能很好的表现整个地形面貌。但可以通过烘培一个低模远处用低模近处用四叉树的方式优化。Geomipmap网格固定dc固定大概在40-60左右顶点数在2w左右。距离较远时Mesh数量固定纹理采样不受影响。但为了减dc一般也会烘培一个低模。最后总结一下unity建议自己写四叉树虚幻直接用自带的geomipmap移动立方体算法上面的两种算法都存在一个缺陷由于是基于二维高度图所以不能表现洞穴地洞地形。而移动立方体算法则解决了这个问题。无人深空中即采用了此算法。该算法将场景看成由无限多个立方体组成。当立方体足够小时可以近似将穿过该立方体的面看做标准曲面曲面方程表示为F(xyz)a0a1xa2ya3Za4xya5yza6xza7xyz立方体存在8个顶点每个顶点都有一个状态空气中土壤中由0和1表示。8个顶点可以存在一个int中如00011001如果为边界则表示需要生成网格一共有2的8次方即256种情况除去对称的情况归纳为15种这里归为15种只是为了好分析实际编码时仍需256种情况单独考虑。针对每种情况将网格生成方式存在一个查找表中。这种算法存在一个二义性问题如图所示假设黑点为在土地中则下面两种生成方式均可满足。这里假设某一面所在的平面方程为zz0代入式F(xyz)a0a1xa2ya3Za4xya5yza6xza7xyz可以得到b0b1xb2yb3xyC0两边除xy即可得到一个双曲线方程求出该双曲线两条渐近线的交点根据正负即可决定最终该如何生成。看起来很简单但落实到实现还有巨多坑。其实现在看来这个算法生成的地形其实就相当于方块变小无数倍的“我的世界”生成的方块数是奇多的在无人深空中基本常态就是百万量级的顶点所以在移动端自然就被Pass了。