本文节选自洪流学堂公众号技术专栏《大话Unity2018》,未经允许不可转载。
洪流学堂公众号回复专栏
,查看更多专栏文章。
大智:“Unity2018.3已经发布有一段时间了,这次更新内容还是比较大的,这周我们来着重学习一下之前学习过的内容在2018.3中的重大更新。今天我们看一下地形系统有哪些惊喜的变化。”
地形系统的更新主要功能包括:
- 多地形块的支持
- 新的地形资产类型
- 新的地形画刷
- 新的地形绘制工具
- 性能大幅提升,充分利用GPU
- 开放地形API接口
下面我们一起来逐一研究一下具体的变化吧!
地形更新2018.3
Unity2018.3包含了地形系统的较多更新,主要体现在性能和易用性方面。
地形系统改进了制作地形的工具,在性能方面可以更充分地利用GPU。增加了HDRP和LWRP的支持,也兼容了内置渲染管线和现有的地形系统。
可以看出Unity在大地形方面已经有所布局,这次更新只是第一步。
多地形支持
现在Unity对多个地形块的支持更友好了。可以管理相邻地形的连接,然后可以跨地形无缝绘制,这在之前需要自己写脚本才能实现。
现在可以通过Create Neighbor Terrain工具快速扩展相邻地形块。
勾选Terrain Settings中的‘Auto connect’,地形会自动和相邻地形连接,使用相同的分组ID。这样在进行地形绘制时,可以跨地形无缝绘制。
新的地形资产类型
现在新增了两种和地形相关的资产类型,可以简化工作流,分别是TerrainLayer和Brush资产。
TerrainLayer
TerrainLayer来源于原地形系统对应的地形纹理材质,但是原来不同地形之间的地形纹理材质不能通用,需要手动添加。通过独立资产的方式可以让你独立于地形来定义地形材质,这样你可以在不同的地形之间复用这些材质,修改起来也更方便。
经过上面添加后,会在工程中多一个NewLayer的资产,可以对这个资产进行重命名、移动、编辑修改。在其他地形中也可以直接复用这个材质。
Brush画刷
画刷资产代表了用于绘制和雕刻地形的GPU画刷形状。现在可以自定义画刷,包含自定义纹理以及参数,更好地调整画刷形状。
参数包含:
- Falloff 衰减曲线
- Radius Scale 半径尺寸
同时你也能看到,现在画刷会有一个预览效果,这也是得益于画刷操作现在运行在GPU上,速度更快。
支持R16纹理
Unity现在支持R16格式的画刷纹理(一个通道有16bit,传统的纹理一个通道8bit)。这种类型的纹理会带来什么好处呢?
传统8bit的纹理能表示的数值范围比较小,在地形上可能会出现“阶梯”状的不平滑的效果。
而16bit的纹理表示的数值范围比8bit大得多,可以让地形更平滑。
新的地形绘制工具
新的地形绘制工具没有直接包含在引擎中,你需要手动导入到Unity中使用。
下载地址:https://github.com/Unity-Technologies/TerrainToolSamples
安装方法:
1、下载Github的版本库,可以下载.zip或clone代码(如果不知道怎么操作,可以回去复习147课Github相关的操作哦)
2、将Editor和Shaders文件夹复制到工程中(需要Unity2018.3或之后的版本)
3、编译后你就能在地形工具中看到这些小工具了。
如果你在下面使用工具时发现没有效果,注意确认一下画刷的Opacity属性是不是太小了。
Utility(工具)
Bridge 建桥工具
这个工具可以让两个点之间变成平面
- 在起点Shift加点击
- 在终点左键点击,两次点击中间的区域就根据画刷的形状变平整
同时这个工具也给出了一些参数,你可以实践研究下这些参数的作用。
Clone 克隆工具
这个工具可以让一个点复制另外一个点
- 在被克隆点左Ctrl加点击
- 在克隆点左键点击,克隆点就会呈现和被克隆点一致的地形信息
Mesh 网格工具
这个工具可以让你根据网格的形状修改地形的起伏。
- 左键点击来根据mesh抬升地形
- Ctrl + 左键点击根据mesh降低地形
- 按住Shift可以对网格进行旋转、缩放和位置修改。
Sharpen
这个工具可以让地形变得更陡峭。
Slope Flaten Height
做平滑地形的同时保持原来一定的坡度。
Erosion 侵蚀
顾名思义,就是在地形上做出侵蚀的效果。
Erode Height (Simple) 侵蚀高度
这个工具的作用是:在地形上点击左键,画刷区域的最高点不变,其他区域会变低,增大了落差。
Ridging Erosion 成脊侵蚀
成脊侵蚀是什么意思呢?就是将地形侵蚀成一个山脊。看下面的图可能会更直观。
Terrace Erosion 梯田侵蚀
将地形侵蚀为梯田状。
其中有两个参数:
- Terrace Count:梯田的阶数。这个数值越大,两个阶梯之间的高度差会越小。
- Interior Corner Weight:阶梯内部保留原来高度的权重,这个需要你自行体验,看看这个属性不同数值的差异。
Transform
Pinch Height 挤压高度
- 左键点击进行挤压(有点像成脊侵蚀)
- Shift+左键点击进行膨胀(挤压的反向操作)
Smudge Height 涂抹高度
你可以想象拿着一个画刷在一个画布上随意涂抹的效果。
Twist Height 扭曲高度
Twist我们在之前的Shadergraph课中见过,是扭曲的意思。
这个工具需要在高度有落差的地方使用,可以形成旋涡状的扭曲。
性能方面
Unity为地形增加了GPU-instanced的渲染路径。在大多数情况下,GPU实例化可以显著减少draw call的数量。经过测试,大多数情况可以减少超过50%的CPU消耗(实际情况取决于运行的平台和使用场景)。
启用后,Unity会将所有大型地形数据,比如高度图和splat贴图等转换为GPU上的纹理。Unity会使用GPU实例化来复制单个网格、采样高度图纹理来生成正确的几何体,而不是使用传统的方法在CPU上为每个地形块生成网格。CPU的负载会有数量级的降低,因为几个实例化draw call就可以替代上千个自定义网格绘制。
同时呢,还可以改善加载时间。为什么能改善加载时间呢?现在Unity可以用GPU来构建basemap(预混合的LOD贴图),就不用预先构建占用存储空间了。GPU非常擅长这种事,速度很快。这也意味着,如果你要写自定义的地形shader,现在可以重写'build basemap'的shader并且生成匹配的basemap LOD贴图。
可编程的GPU工具
在编辑器中,Unity现在开放了地形的编程接口,你可以编写自己的地形工具,在GPU上实现跨地形块的无缝拼接、起伏雕刻和纹理绘制。
API包括:
- TerrainPaintTool
,一个地形工具的基础类 - TerrainPaintUtility,包含修改地形数据的工具方法
Unity也将现有的地形工具都转到了GPU上进行运算。除了使用这些工具更流畅,也提供了更大的画刷尺寸,更好地画刷预览以及可以跨地形块的地形绘制(自动无缝拼接)。
总结
大智:“相信这些地形的更新会给地形带来很多增强,不管是在制作过程还是运行过程的性能。”
今日思考题
大智:“制作一个地形试试吧,看看新的地形能给你带来什么?”
小新:“好嘞!”
大智:“收获别忘了分享出来!也别忘了分享给你学Unity的朋友,也许能够帮到他。”
洪流学堂公众号回复专栏
,查看更多专栏文章。
《大话Unity2018》,大智带小新学Unity2018的有趣经历,让你学Unity更简单。
所有订阅《大话Unity2018》的用户,可在《大话Unity2019》上线时获得1元换购资格。