Unreal Engine的地形系统称之为Landscape,每个level里面可以存放多个Landscape的Actor(但不能对它们进行连续编辑,也就是说相邻两个landscape是不能被同一个brush修改的)。地形被均匀的切割成多个小的地块,这些地块名为Landscape Component,每个Component可以持有最多2x2个SubSection。而每一个SubSection是由多个quad组成的,这些quad是地形topology的最小单位。由于地形mesh的顶点信息记录在heightmap里,也就是顶点纹理中,所以它的分辨率尽量是二的指数幂。因此quad行和列的数量肯定是一个奇数,例如31x31,63x63等,对应的顶点数量为32x32个和64x64个。

相邻两个Component的边界处的顶点信息是一致的,它可以保证在渲染时不会产生crack,当然vertex shader中还有相应的stitch算法能够消除由于邻接的patch使用不同lod而导致的t-junction现象。根据地形的视觉误差计算结果,每个LandscapeComponent会自动的选择对应的lod,高等级的lod会比低一个等级的lod所对应mesh少一半的quad。所以63x63的quad,只会有6个lod(63x63,31x31,15x15,7x7,3x3,1x1),如果想增加lod的数量,只能去增加subsection的quad数量,换句说每个Component最多只能退化成2x2个quad。这对于比较大的地形来说drawcall数量就可能变得很多,因为地形culling的最小单位是Component,如果是一个subsection的quad数量为63x63,且有2x2个subsection的component,假设一个quad是1m的大小,那么一个component最多可以覆盖126米的范围。随着lod的升高,mesh会越来越稀疏(即三角形数量变少),当使用最高等级的lod时,126米的区域会用4个quad来表示。当前component如果可见,最多会形成4个drawcall(如果这四个subsection的screen size差异不是很大,它会自动合并成一个drawcall)。在视锥内且不没有被遮挡的Component一旦很多,那么相应的drawcall也会暴涨。通过调高subsection的quad的数量来减少drawcall似乎不是一个好的办法,因为如果culling粒度太大,会降低culling的效率,导致很多不在视锥内或者被遮挡的三角形依然会被处理。而且由于不同的lod,它对应的mesh的稀疏程度不同,导致drawcall里面处理的顶点数量也不尽相同。

ue4的实现是基于金字塔状的geometry mipmapping的平铺结构,而unity的地形是基于quadtree的层级结构,它们各有各的优势。首先ue4的地形块之间数据耦合度很小(每个component拥有自己的weightmap和heightmap,这些数据不需要跨component进行读取),它可以为每个component计算当前帧的lod值,互相比较独立,完全能够并行处理,只是收尾阶段要获取四个邻居的lod值,把它们传给shader用来做stitch。但是unity的实现需要从根部开始遍历这颗四叉树,如果当前的等级满足要求就不再往下递归,直接把当前等级的顶点信息提取出来,应用到一个固定的17x17个顶点的topology上。这样就保证了每个drawcall处理的顶点数量都是一样的,只是由于邻居的lod可能与自身的lod不同,需要选取不同的indexbuffer而已。为了减少topology的模式缓存数量,lod算法要保证相邻两个patch之间的lod差不能超过一,否则就会出现crack。而ue4的stitch算法似乎没有这些顾虑,弹性也因此更大。

由于unity的地形patch是用quadtree管理的,所以为了并行化视锥culling,它需要把quadtree遍历阶段的结果先缓存起来,放入到一个线性数组中,等到后面再与其他的renderer一起处理。反观ue4的地形,虽然每个component单独管理一个patch比较灵活,但是drawcall的数量会相对较多,尤其是那些较为平坦的地块,或者是距离摄像机较远的地块,基于quadtree的方法可能就只会使用到一个16x16quads的patch去表达,而ue4的方案如前所述,由于component覆盖的区域面积是固定的,所以它会生成更多的drawcall,甚至要处理更多的三角形。不仅如此,由于mesh退化程度有限,远处的mesh在光栅化后可能会出现overshading。

现代的桌面显卡和图形api对于drawcall和顶点处理似乎不那么敏感了,但是像素的处理由于量级太大,所以很难忽略它对性能的影响,尤其是纹理的采样和overdraw。ue4方案利用shader的static permutation的功能,有效的降低了材质中纹理的采样数量。不过如果unity能早日祭出virtual texture(不需要运行时混合多层的纹理)这一利器就另当别论了。

unity如何往下挖地形_Unreal Engine地形系统辨析(一)相关推荐

  1. unity如何往下挖地形_如何在unity地形上挖坑?

    其实在很久以前我就研究过在Unity里如何对模型进行顶点控制的一些东西,并能够实现点筛选和挖坑.只是很大程度上挖坑的精确度取决于模型网格的疏密程度.如果网格顶点过于密集的话,就会影响运算的效率.关于挖 ...

  2. unity如何往下挖地形_Unity3D地形挖坑

    接着上次的二维面和三维面功能,在借助了高亮插件的点缀之后,能够达到一个让人满意的三维线效果. 最近研究了一下对Unity自身的地形做高度控制的一些东西,有一点小小的成果,现在就分享给大家. 其实在很久 ...

  3. unity如何往下挖地形_Unity3D分割地形Terrain

    在制作地形的时候通常是直接刷出整个地形,但是在实际使用中也许地形过大,我们不能直接把整个地形完全加载,这样对内存的消耗很高,所以有时需要一小块一小块的加载地形.这时就需要把制作好的地形分割成几块后, ...

  4. unity通关射线检测实现3d模型自适应地形起伏

    unity通关射线检测实现3d模型自适应地形起伏 该方法是一种取巧的方式,不通关人物碰撞器什么的,很简单的一种思路 通过在模型的位置每次移动时向下发射一条射线检测,检测到地面碰撞器时,获取碰撞点的坐标 ...

  5. UNITY编辑器模式下static变量的坑

    UNITY编辑器模式下static变量的坑 在unity中写编辑器扩展工具,如在编辑器中加个菜单,点击这个菜单项时执行打包功能. 类如下,其中的静态变量,如果每次进来不清空,则LIST会越来越大,打包 ...

  6. 【蓝鸥Unity开发基础三】课时3 Terrain地形系统【未完】

    [蓝鸥Unity开发基础三]课时3  Terrain地形系统[未完] 推荐视频讲师博客:http://11165165.blog.51cto.com/ 一.Terrain地形系统 Terrain地形系 ...

  7. Unity 3分钟,将你的Terrin 地形转为FBX

    Unity  3分钟,将你的Terrain 地形转为FBX(Maya) 制作思路: 1.Terrain导出raw图像文件>> 2.进入PS将图像转换JPEG格式>> 3.在Ma ...

  8. Unity Android平台下插件/SDK开发通用流程

    本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与 ...

  9. unity游戏引擎下的UGUI(2)

    unity游戏引擎下的UGUI(1)unity游戏引擎下的UGUI_m0_57997518的博客-CSDN博客 4.Image Source Image(放图片)(图片要转换为2D and UI) C ...

最新文章

  1. android资源替换方案overlay,Android 运行时资源替换----Runtime Resource Overlay
  2. 磁盘被占满   系统出现 no space left on 报错(block被占满/inode被占满)
  3. 简介nandflash、norflash、ram、sram、dram、rom、eeprom、flash的区别
  4. k8s部署rook-ceph
  5. 小程序 input 换行_小程序 input双向数据绑定
  6. 如何轻松地将可访问LAN的Pod部署到Kubernetes集群上
  7. ELK下常见启动错误
  8. Windows中,文件所在路径查找命令
  9. 2019 第四季度计划
  10. pcl对点云进行直通滤波
  11. linux c语言头文件 在另外的地方,linux下的c语言的头文件在windows下头文件是哪几个?...
  12. 基于Python3爬取百度百科内容(可自己输入关键字)
  13. (2)R包,GO.db调研(数据库构建角度解析)
  14. BP神经网络及其设计的一般原则
  15. 常平计算机培训班,东莞常平十大CAD培训班排名(如何为初学者学习CAD)
  16. 数据可视化|用热力地图进行数据分析
  17. vscode汇编环境配置
  18. (轉貼) 馬英九特別費案起訴書全文 (News)
  19. sql语句连接查询.
  20. ProtoBuf与网络通信

热门文章

  1. 质量审查一体化智能平台 搭建总览图
  2. SpringBoot整合Redis 主从复制_02
  3. 如何将本地代码推送至远程仓库_命令简化版本
  4. Jenkins_GithubFork程序_入门试炼04
  5. docker安装linux安装mysql_怎么启动mysql-linux 怎么安装mysql?怎么在docker搭建mysql8?docker安装mysql...
  6. php socket主动推送消息,PHP使用WebSocket主动推送【微信小程序接收】
  7. 多线程:三大不安全案例
  8. java map清除值为null的元素_Java中的集合框架大总结
  9. java中什么是task_20171018java总结——Spring任务调度task:scheduled-tasks
  10. java查看蓝牙mac地址_Java如何获取主机的MAC地址?