![8b28b48c8d769145247d851d9cdbfe08.png](https://img-blog.csdnimg.cn/img_convert/8b28b48c8d769145247d851d9cdbfe08.png)
最近在搞道路生成,终于完成了一版demo,主参考了一些3A大厂的分享,自己补全了一些细节。
由于本人贴图制作水平所限,效果还远没有达到最优。
后面计划做个分享,先打个草稿。
一,背景
道路生成,目前最为大家熟知的两个范例是《farcry5》和《幽灵行动》。
farcry5是根据手工编辑的路径生成,幽灵行动则是根据A*寻路的路径生成。两种方式各有利弊。前者美术控制力更强,更适合对玩法要求严格的区域。后者效率更高,适合外围区域。
无论哪种方式,区别仅在于曲线来源,有了曲线之后如何获得可信的视觉效果(朝3A靠拢),也是一个难点。
那位说,道路又不是大气散射体积光能量护罩螺旋丸,能有啥效果?
![b16eff8bf5c92d0363df851407f116db.png](https://img-blog.csdnimg.cn/img_convert/b16eff8bf5c92d0363df851407f116db.png)
其实特别有,比如下面这个:
Create a Post-Apocalyptic Road in UE4(https://www.youtube.com/watch?v=kJuiSERx_AI)
![46b113ada3121c03e69d11206af3e717.png](https://img-blog.csdnimg.cn/img_convert/46b113ada3121c03e69d11206af3e717.png)
这是quixel官方发的一个教程视频,讲如何利用quixel资源用手摆贴花/模型+刷顶点色的方法拼一段照片级写实街道。虽然脏乱差得有些夸张,但不得不说真香。
下面是google地图上找的几处真实道路:
![87a50bbf0441de73720497a5c50dc6c2.png](https://img-blog.csdnimg.cn/img_convert/87a50bbf0441de73720497a5c50dc6c2.png)
![f030433c2ce1a25f8b3b8c8a8f77c58c.png](https://img-blog.csdnimg.cn/img_convert/f030433c2ce1a25f8b3b8c8a8f77c58c.png)
总结为一句话:瑕疵很重要。
二,技术选型
最开始我曾尝试用houdini暴力生成路面高模:
![835d0ab644fcd0cafd9700027226958c.png](https://img-blog.csdnimg.cn/img_convert/835d0ab644fcd0cafd9700027226958c.png)
但这样做有两个问题:
(1)不灵活不通用,不同风格外观的路面需要不同的算法。
(2)面数太高。
所以,细节还是要靠贴图/法线来表现。
但是tiling贴图的重复感是无法接受的,即使用多层tiling贴图通过刷顶点色混合,也无法根除重复感。
还有一个思路是每种路预制多段,去排列组合把整条路填满,若预制段数较多且排列得当,就能让人不太感觉到重复。但如果路的种类多的话工作量会比较大。
最后是《幽灵行动》的思路:
《幽灵行动》中道路细节的实现方法和quixel街道视频类似,主要靠贴花,只不过贴花不是手摆,而是生成的:
Ghost Recon Wildlands Terrain Tools and Technology(https://www.youtube.com/watch?v=kzthHcbG9IM)
![69166623c3c1f0809ac05b3f10855bb3.png](https://img-blog.csdnimg.cn/img_convert/69166623c3c1f0809ac05b3f10855bb3.png)
![416c0ae62338296e38071c5b68a604d5.png](https://img-blog.csdnimg.cn/img_convert/416c0ae62338296e38071c5b68a604d5.png)
![0e4268ecc527c561a2f427ebdbb29cea.png](https://img-blog.csdnimg.cn/img_convert/0e4268ecc527c561a2f427ebdbb29cea.png)
视频后面进一步提到海量贴花性能如何优化,是用virtual texture。
后来又看到《坦克世界》的文章,用vt贴花实现的土路车轮印,效果很棒:
https://80.lv/articles/world-of-tanks-graphical-update-technical-overview/
![9ce55696d7cbeed43d2486508dc5fd52.png](https://img-blog.csdnimg.cn/img_convert/9ce55696d7cbeed43d2486508dc5fd52.png)
另外,基于vt可以解决基于mesh时很难解决的两大难题:
(1)可以解决道路与地形穿插问题。(显然)
(2)可以解决交叉口uv接缝问题。(你说交叉口uv应该怎么分?)
所以走vt路线是很值得考虑。
恰好ue4.23新增了vt功能,其中runtime virtual texture可以将任意mesh渲到vt上:
Virtual Texturing | Live from HQ | Inside Unreal(https://www.youtube.com/watch?v=fhoZ2qMAfa4)
![22c96511f892d683747a5b44d36c5fb2.png](https://img-blog.csdnimg.cn/img_convert/22c96511f892d683747a5b44d36c5fb2.png)
简直天时。
![2b9c6dbb1ec82c037159becd541b3c73.png](https://img-blog.csdnimg.cn/img_convert/2b9c6dbb1ec82c037159becd541b3c73.png)
三,实践
1,路面和交叉口生成
路网曲线:
![2f0218cb8f4e6d081429277c098e6745.png](https://img-blog.csdnimg.cn/img_convert/2f0218cb8f4e6d081429277c098e6745.png)
根据宽度生成路面:
![01e18a0ffe06f5f0814c98f7651f7a85.png](https://img-blog.csdnimg.cn/img_convert/01e18a0ffe06f5f0814c98f7651f7a85.png)
生成交叉口:
交叉口以贴花形式盖上去,边缘做成半透明,即可避免纹理接缝。
![3be4b16b6f4f229edb634573b8f0f2d3.png](https://img-blog.csdnimg.cn/img_convert/3be4b16b6f4f229edb634573b8f0f2d3.png)
交叉口分为三类,需分别处理:
(1)同种公路交叉口。
![dbc2fa30c7f632d0b485434d8701684d.png](https://img-blog.csdnimg.cn/img_convert/dbc2fa30c7f632d0b485434d8701684d.png)
(2)异种公路交叉口。
![a6d5932955cc05d7d95f085eef6fa777.png](https://img-blog.csdnimg.cn/img_convert/a6d5932955cc05d7d95f085eef6fa777.png)
(3)公路与土路交叉口。
![57cc78bf5fe9af3a5a348f61f1c06d6d.png](https://img-blog.csdnimg.cn/img_convert/57cc78bf5fe9af3a5a348f61f1c06d6d.png)
2,贴花生成
![d49561c97475f062e7cc79f365c1769b.png](https://img-blog.csdnimg.cn/img_convert/d49561c97475f062e7cc79f365c1769b.png)
裂纹贴花:
![dc8c99102c466e3d7355e2f38bf9d8d7.png](https://img-blog.csdnimg.cn/img_convert/dc8c99102c466e3d7355e2f38bf9d8d7.png)
补丁贴花:
![f63fa99f89d53d2418151e0b2c20e03c.png](https://img-blog.csdnimg.cn/img_convert/f63fa99f89d53d2418151e0b2c20e03c.png)
删除重叠贴花算法演示:
![916a013421fc430b4e8e55812a2756af.png](https://img-blog.csdnimg.cn/img_convert/916a013421fc430b4e8e55812a2756af.png)
车轮印:
通过假想路网中有一些车辆沿随机路径靠右行驶,模拟出轨迹。
![97791786fa6348b069611a2d8779dd19.png](https://img-blog.csdnimg.cn/img_convert/97791786fa6348b069611a2d8779dd19.png)
车轮印分两类:
(1)公路上的黑色车轮印。
![997545fcefbd36008635895791e6b084.png](https://img-blog.csdnimg.cn/img_convert/997545fcefbd36008635895791e6b084.png)
![371ae022a8efebd402bd4435409ac3b0.png](https://img-blog.csdnimg.cn/img_convert/371ae022a8efebd402bd4435409ac3b0.png)
(2)土路上及土路与公路交界处的土车轮印。
![42ce7af6f1fe49ff796b2b17fc8d07f2.png](https://img-blog.csdnimg.cn/img_convert/42ce7af6f1fe49ff796b2b17fc8d07f2.png)
![4cdbabb8a994ef3ff3e039b4cf631239.png](https://img-blog.csdnimg.cn/img_convert/4cdbabb8a994ef3ff3e039b4cf631239.png)
![cb13abacff858609a49a2f88211cff71.png](https://img-blog.csdnimg.cn/img_convert/cb13abacff858609a49a2f88211cff71.png)
3,贴图制作
贴图是quixel里找的,通常无法直接使用,需要用quixel mixer加工。我对mixer还没怎么研究,弄出来的结果自己不太满意。
(1)基础路面贴图
公路1基础路面贴图:
![24bf0b1586dde9f15d325d90eeda0cfd.png](https://img-blog.csdnimg.cn/img_convert/24bf0b1586dde9f15d325d90eeda0cfd.png)
公路2基础路面贴图:
![a3047b72f68d711d541ed6287e5937d4.png](https://img-blog.csdnimg.cn/img_convert/a3047b72f68d711d541ed6287e5937d4.png)
与《幽灵行动》一切路面细节均靠贴花不同,我希望尽量减少贴花数量,所以把那些特征不是很强、对tiling不敏感的细节直接做到路面基础贴图上。特征明显、不宜tiling的细节才用细节贴花表现。
(2)细节贴花
每种路材质不同,如果共用同一套细节贴花,会不搭。所以每种路需要单独一套专属的细节贴花。
以下是公路1的细节贴花:
![1324c77fe65dcc38b76212cd7be3a430.png](https://img-blog.csdnimg.cn/img_convert/1324c77fe65dcc38b76212cd7be3a430.png)
![c7f2f8998682d6ce5c146b5c643221ff.png](https://img-blog.csdnimg.cn/img_convert/c7f2f8998682d6ce5c146b5c643221ff.png)
以下是公路2细节贴花(偷了点懒,部分细节贴花复用了公路1的(经过校色),当然,这样做对效果是不利的):
![d892d65e9a5ffa748a29e40ce0fb7bc7.png](https://img-blog.csdnimg.cn/img_convert/d892d65e9a5ffa748a29e40ce0fb7bc7.png)
上图中的裂纹贴花是我自己在mixer里画的(因为在quixel中找不到合适的),但因画mask水平太差,贴花上带了大量的非裂纹区域,这样是有问题的,比如会盖掉下面的有用细节,只能先凑合一下了。
等以后有时间打算好好研究研究mixer和sd,摸索一下扫描材质+过程化mask的贴图制作流程。
4,工具链
可直接利用ue4的道路工具(landscape spline),因此美术工作方式无需任何改变。又因美术在使用landscape spline时已经添加了路面,故houdini中实际上无须生成路面,只生成贴花就可以了,减少了很多数据量。
![7a0acd1040c9a8f90ce6968bab0a4414.png](https://img-blog.csdnimg.cn/img_convert/7a0acd1040c9a8f90ce6968bab0a4414.png)
5,未来需要改进的
(1),路边过渡处理不到位。
目前路边与地形的过渡只是简单半透明,虽然可以通过mask来产生一些变化,但一方面会有很强tiling感,另一方面表现不出土蔓到路上(带厚度)的感觉。
试过用土的贴片覆盖到路边,效果比半透明强,但当地形材质比较丰富时,若想让贴片颜色与地形颜色完美匹配,需要让贴片(static mesh)共用地形材质,而ue4不支持这种共用。所以还得再想想别的办法。
(2),裂缝里长草未实现。
这个houdini端实现不难,但若考虑与ue4端互通的完整流程,工程上有点儿麻烦。
不过因为这个效果本身比较出彩,未来有时间还是应该搞一下。
对于上述两点,下图是一个比较好的参考:
![19236e5d962f59c1b9870c91695e35c9.png](https://img-blog.csdnimg.cn/img_convert/19236e5d962f59c1b9870c91695e35c9.png)
补充:
裂缝长草参考照片
![da4f8bc1371f49680a1958a7f66ca849.png](https://img-blog.csdnimg.cn/img_convert/da4f8bc1371f49680a1958a7f66ca849.png)
(3)ue4.24的vt有一些改进,比如加了height通道,可能可以用来提升某方面效果,有时间应该试一下。
--2020-1-24
实现了裂缝长草
难点是草点位置与裂纹贴花上的纹理对上。
![2e8f1144a000abc7a7c557ca3615e29a.png](https://img-blog.csdnimg.cn/img_convert/2e8f1144a000abc7a7c557ca3615e29a.png)
![06a93bf64d9fdc524325107cc07a59d2.png](https://img-blog.csdnimg.cn/img_convert/06a93bf64d9fdc524325107cc07a59d2.png)