找回密码
 立即注册
查看: 727|回复: 0

ue4.26 virtual heightfield mesh初探

[复制链接]
发表于 2021-1-4 13:41 | 显示全部楼层 |阅读模式
一,virtual heightfield mesh作用
现在3A游戏地表一般都会使用高度置换(tessellation+displacement)来增加细节。
例如《幽灵行动:断点》:
《幽灵行动:荒野》:
https://www.youtube.com/watch?v=z_D4zyoNz1k
但是ue4在这方面确一直不理想:
1,ue4的landscape也可以开tessellation,但精度不够。
2,ue4.23开始支持virtual texture,但没有配套的tessellation支持。
尤其是VT贴花,对于提高地表和道路的表现力非常重要,不支持高度置换效果大大折扣。
最近ue4.26发布,推出了virtual heightfield mesh功能(实验阶段),给实现地表高精度凹凸细节提供了可能。
以下是官方在4.26 Release Highlights | Inside Unreal(https://www.youtube.com/watch?v=OchRhhRaE5s)中展示的效果(能不能别用卡通风格的《堡垒之夜》来展示):
virtual heightfield mesh OFF:
virtual heightfield mesh ON:
按官方的文案说,virtual heightfield mesh将替代传统landscape渲染,各方面指标都更优
那么,这么好的功能,怎么用呢?
二,基础用法
目前相关资料非常少,找了半天只到一个演示基础用法的视频:
https://www.youtube.com/watch?v=nraO6_rT96M
https://www.youtube.com/watch?v=4BJIVqoF6_A
视频主要演示了:
1,如何在地面材质中使用高度图产生heightfield:
2,如何将模型投射到heightfield上,使模型成为heightfield的一部分。
这个跟houdini的heightfield project功能有点像:
houdini heightfiel project
需要注意的是视频作者也是自己摸索的,并不一定最优、最标准的用法,而且有些问题他还没找到解法“This topic is very new and there is no source for it and some of its problems I still do not know what the solution is”:
但无论如何,这个视频使我们能运行出virtual heightfield mesh的初步效果,可谓功德无量。
三,目标与困难
我希望用virtual heightfield mesh实现三个功能:
1,地表材质支持高度置换。
2,VT贴花支持高度置换。
3,支持将模型高度投射到地面。
其中 地表材质支持高度置换 在视频中已给出演示,没问题。
困难一:
套用视频中的方法处理 VT贴花支持高度置换,虽然可以使贴花产生真凹凸,但同时会遇到一个致命问题,如果贴花mesh本身没有严格贴合地面,则贴花会将地面拔起来,如图所示:
也就是说,虽然我们希望的合成结果是groundHeight+decalHeightmapHeight,但是ue实际给我们合成的结果却是groundHeight+decalHeight+decalHeightmapHeight。那有没有办法把其中的decalHeight去掉呢?遗憾的是它这个逻辑似乎是被写死到virtual heightfield mesh模块内部了,在上层无法更改(至少我目前没有发现)。
将模型高度投射到地形上 视频中给出了演示,但存在如下缺陷:
困难二:
经试验,模型投射的行为是与原有高度场取max,即只能越投越高,而无法通过投射来实现将原有heightfield抹平或挖坑。
例如下图,在带有凹凸的地面上投射道路模型,如果道路模型比地面高,因为投射结果是两者高度取max,路面将仍然保持平整。但如果道路模型比地面低或者与地面持平,因为投射结果是两者高度取max,最后道路也变成凹凸的了。显然这不我们想要的结果,我们想要的是道路投射上去以后能将地面上原有的凹凸压平(即不是取max,而是replace)。
困难三:
模型投射时,模型在地面之下部分的颜色也会投射到地面上。极端例子是,即使模型完全在地面之下,其颜色仍然会被投到地面上。
例如,下图左边是正常效果,右边是将石头模型下拉到地面之下的结果。
困难四:
模型投射的结果,侧面会产生纹理拉伸。
四,解决困难
前面我们列举了遇到的四点困难。其中困难三、四相对较轻,因为都可以通过模型制作规范和放置高度的规范来基本避免,而且由于我们的场景走的是过程化生成,根本不用手工摆放,所以要满足这些规范也非常容易,并没有多大成本(即使那些人工调整的部分,也可以通过一个自动化工具进行自动纠正)。当然,后面有精力还是希望能彻底解决困难三、四,亦或许等virtual heightfield mesh完善以后就自然支持了。
所以迫在眉睫,不解决不能用的困难主要是一、二。
困难一有两种解决思路。
思路1:让贴花严格贴地。
这个确实是能做到的,如果地表是水平面,则只要让贴花的高度与水平面相等;如果地面是平面但有斜度,则只要让贴花也进行相应旋转与之吻合即可;如果地面不是平面而是曲面,则对贴花进行细分,然后让贴花的所有顶点都贴地即可。这些都可以通过自动化工具实现,所以并不会增加美术的工作量,但问题是地面为曲面的情况占大多数,而将贴花进行细分,增加了面数,不理想。
思路2:实现即使悬空也不会将地面拔起来的VT置换贴花。
前面说了,合成逻辑groundHeight+decalHeight+decalHeightmapHeight貌似在virtual heightfield mesh模块内部写死了,在上层无法更改。但也并不是没法解决,经过将近一周的反复试验(差点放弃)最后找到了一个workaround。因为ue很复杂,模块之间会有一些功能重叠,关键时刻就可以拉兄弟一把(由于项目还没上线,只能先提示到这儿了)。
效果如下图所示(贴花悬空,但没有将地面拔起来,而是将凹凸投射到了路面上):
此workaround同时也解决了困难二。
补充:
前面提到的视频作者还发过一段游戏演示,展示了运行时挖坑的效果:https://www.youtube.com/watch?v=jpziodzkuGU
起初我以为它也是用virtual heightfield mesh实现的,后经 @杨轩@大菜鸟 提醒,它用的只是传统的tessellation(因为视频发布时ue4.26还没出,且地面布线模式符合tessellation特征)。
五,结果
做了三个支持virtual heightfield mesh的材质:
M_VHFM_landscape、M_VHFM_decal、M_VHFM_mesh
分别用于landscape,VT贴花,mesh投射。
弄了一个包含土地和道路的简单demo,其中:
地形使用M_VHFM_landscape
道路、道路上的土渍、裂纹、补丁、脚印、鹅卵石均为贴花,使用M_VHFM_decal
鹅卵石以外的石头是模型,使用M_VHFM_mesh
效果如下:
没有模型,所有凹凸都在landscape上:
注:这里说明一下为什么不直接将石头模型放在地表,而是将其也渲到了heightfield里。其实对于石头模型而言,直接放置在地表效果会更好些,但进heightfield的好处是可以利用VT的性能优势,支持更大量的石头。
我这里所用的贴图资源精度都不是很高(2K及以下),但地表细节凹凸仍然带来更强的真实感,如果在美术上再好好整一下,达到《farcry5》或《幽灵行动》的品质不是不可能。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-24 04:03 , Processed in 0.100582 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表