好看的地形,并且无论远近,都有细节存在。想要制作这种地形.需要自定义一些东西.
Unity中默认的地形shader,加上纹理涂抹系统,绘制出来的地形,近处还行,远处就变成了,纹理块了.变化有些可怜---如下图.还能看到平铺的纹理感.

如果想要近处和远处都有细节和变化,则处理方式很像Unity对人物皮肤等细节的处理方式一样.并且还要能叠加各种细节纹理,如Splatmap与Mask,或者通过高度控制Blend等.

(通常2000*2000的Terrain,叠加的ColorMap和FlowMap,Normal贴图也2k左右就行.)---注意ColorMap,可以采用特殊的条带型,节省性能.如下图

而地形更加专业的做法是,在第三方软件,如Gaea,或者World machine中做好.各种所需的地形Mesh+贴图+Unity内部自定义一些地形Shader.混合使用
甚至Splatmap也可以使用外部软件制作,不过Unity中实际上已经够用


带光照细节的纹理.

Tips:地形光照,如果光照方向固定的话,可以从第三方中烘焙,如果想要变化的话,可以考虑Unity内部构建,
地形为Mesh的情况,无论是光照贴图还是APV探针.都可以,也可以直接使用第三方中烘培好的带光照与阴影的,但是要注意和游戏中平行光方向一致化
地形为高度图转的Terrain的话,需要在Terrain设置中,打开全局光照贡献.才能正常烘焙吧.

手动制作自定义的TerrainShader
TerrainShader有些特殊.
雪的细节,草地绿色与深绿色,实际上是软件里面做好的---Gaea或者WM
然后叠加到游戏地形上面,地形是读取高度图转移到UnityTerrain系统中的,
然后使用特制的TerrainShader
特质Terrainshader
一个是全局基础着色部分,法线等.
一个是添加Mask给,雪,岩石层这些,
然后再根据,实际情况,或手刷,或算法刷上地形纹理贴图(地形的纹理层).
特质Terrainshader功能类似下面的Shader.

注意,这里平铺44次的是高度图.RGBA分通道的.
Mask用来混合高度信息,守望似乎也是这种类似的做法,用在普通纹理上
自定义TerrainShader
可以用ShaderGraph做,但是性能上,有待优化.
注意.现在版本Unity并没有支持Terrain的ShaderGraph,所以性能上,可能比不上TerrainLit这个默认材质.主要是因为GPU实例化功能,和一些,诸如切线空间的法线兼容性.还有8层的纹理并没有被原生支持.
还有用ShaderGraph无法接受到Unity地形的绘制纹理,与孔洞的SplatMap的情况.
要解决这一点就需要.手动创建一些特别的纹理接收节点.并且和Unity中默认地形shader的变量名称暗合.才能正确使用


_Control纹理也就是SplatMap,一个SplatMap纹理样本具有4个通道RGBA,每个通道都是一个纹理集的遮罩。
内置管线和URP它们使用一种称为“AddPass”的东西,这是“Firstpass”着色器的第二个着色器分配依赖。AddPass也使用_Control纹理。
在HDRP中,它没有AddPass,他们使用两个名为_Control和_Control1的控制纹理,可以在一个过程中处理所有8个纹理层。
如果想在HDRP中添加8个splat的支持,需要加一个Tags到shader中---
"SplatCount" = "8"---一些Tag可以控制是否开启8纹理模式
而通常的情况,则可以直接使用ShaderGraph---4贴图
可以看一下,默认地形shader的代码,里面的属性很清楚了.

可能想要性能和自定义地形Shader还是手写的会更好一些,或使用诸如MicroSplat这种第三方.