Building Worlds In Unreal 学习笔记——20-23 程序化植被/草Billboard材质/实时虚拟纹理(RVT)的使用
时间:2023-11-03 16:37:02
Building Worlds In Unreal 学习笔记-20-2323 植被/草的编程Billboard材料/实时虚拟纹理(RVT)的使用
- Lec20 程序化植被 Procedural Grass & Foliage for Landscapes
-
- 1 寻找参考/资产下载
- 2 遮罩&Grass节点尝试&四个问题
- 3 问题解决
-
- 3.1 密度管理
- 3.2 过渡(TAA模拟透明度变化)
- 3.3 草的多样性
- 3.4 远处BillBoard光照错误
- 4 Grass绘制树
- Lec21 草Billboard材质优化 Grass Billboard Material
- Lec22 利用实时虚拟纹理优化性能 Landscape Optimization Using Runtime Virtual Textures
-
- 1 性能考察
- 2 实时虚拟纹理
- 3 效果
- Lec23 实施虚拟纹理的材料混合 Landscape Material Blending With Runtime Virtual Textures
-
- 1 模糊问题修正
- 2 混合
-
- 2.1 高度图VT
- 2.2 高度mask
- 2.3 混合RVT
本系列学习资料来源,Ben Cloward油管空间,B站的搬运翻译
Lec20 程序化植被 Procedural Grass & Foliage for Landscapes
使用UE4的Grass程序化绘制植被的工具很强大,但也很耗能
因此,本节教学主要围绕如何使用Grass但不损失很多性能
1 寻找参考/资产下载
我们在这里,打开谷歌地图寻找街景
- 我们观察到,大多数植被都是野生高草,有绿色和死亡
- 山坡上有泥土和岩石,以及针叶林,云杉,松树
- 所以我们会在地上种草,在山上种树
去Bridge下载这些植物
https://quixel.com/assets/uddmcgbia - Thatching Grass
https://quixel.com/assets/tefocd1r - Swamp Grass
https://quixel.com/assets/rbdoo - Grass Clumps
以及UE4商城之前做过小河的云杉树
2 遮罩&Grass节点尝试&四个问题
我们希望草生长在地势较低的平面上
- 地势较低,这就想到了以前做过的高度mask
- 这是以前的高度Mask与颜色相连的结果
与我们想要的相反,高黑低白
- 所以做以下修改,OneMinus和Saturate效果如图所示
- 这是以前的高度Mask与颜色相连的结果
- 平面长草,这就想到了以前Slope
- 看看之前的SlopeMask
连到RGB上
- 看看之前的SlopeMask
- 这两个方面结合在一起,使用乘法
新建一个Grass发现节点需要一个节点Grass类型的数据
建这个类
基本设置
选我们刚才的Grass
下图显示了几个问题
- 草皮太厚,影响性能,网格太多
- 太浓密的问题可以改变Grass的密度
但是你可以看到远处的十字架BillBoard(从视角确定纹理矩形朝向的技术称为BillBoard),它们的照明不是很对,很明显十字会出现 - 边界很硬,很不自然
- 只用了一种草,比较单调
3 问题解决
综上所述,有四个问题:1。合理管理草皮密度;2.修复草皮的刚性过渡;3.修复密度低造成的BillBoard照明异常;4.添加草的种类
3.1 密度管理
第一个是草皮密度
- 管理草皮的密度,我们可以使用多种草,按照近中远来设定
- 比如这种近景草,密度高一点到80
高密度也应减少多边形,设置最小LOD为3
同时,由于是特写近景草,初始距离为200,远端去除为1500
- 复制到中景的草,设置
- 复制中景到远景的草,改变参数
- 结果如下:近中远三层显示管理密度,近草密度大,三角形少。对于远处的草,有更大的多边形和更小的密度
- 比如这种近景草,密度高一点到80
3.2 过渡(TAA模拟透明度变化)
如何过渡,可能会想到在消除距离上做一些改变
鼠标移到提出距离,可以看到说明
我们想要fade,可以在草的材质里去使用PerInstanceFadeAmount这个节点
- 找草球的父材,这是Bridge自带材质球
- 先来看看这个所谓的PerInstanceFadeAmount是什么节点
可以看出,随着移动,去除边缘的草正在变黑
- 对于草,我们不能做透明度渐变,因为消耗太高,我们可以用这个节点来假装
对于每一个像素,TAA只会选择显示和不显示,但会在时间维度上混合像素值,造成透明的假设
所以我们会变成这样
3.3 草的多样性
根据前三种草的设置,将其他模型放在后面,f可以随意调整多少?density和cull distance
3.4 远处BillBoard光照错误
下个问题这个问题Lec介绍
4 Grass绘制树
我们希望树木出现在土壤中,即低海拔缓坡
将这个Dirt的Mask看基本颜色
这样设置树Grass
比如大树
小树,去得更近
然后多来几个
Lec21 草Billboard材质优化 Grass Billboard Material
远处的草是十字形的Billnboard,我们需要改进它
- 点开随便一个草,在LOD最近,是好的
但是LOD当级别较大时,交叉Billboard,光线不好看
我们将专门进行十字交叉Billboard定制一种材料
-
我们找到了它的材料,发现了它的材料LOD3用的是自带的草地材料
在文件夹中找到它,复制一份
-
修改材料如下,删除粗糙度,使用speedtreebillboard节点,让相机向量代替表面法线,然后用这个材质替换
-
效果如下,远处交叉不再明显
切换到法线视图,非常平滑
但是还有一个问题,很明显后面的草颜色很浅
原因是这个billboard例如,它的地图颜色稍亮(红框),所以打开它Color Overlay
以及SSS颜色强度也降低了一点
Lec22 使用实时虚拟纹理优化性能 Landscape Optimization Using Runtime Virtual Textures
1 性能考察
既然要优化性能,那么首先第一步就是确定性能
按下~ 输入stat unit
game和draw是CPU做的,所以很明显我们的GPU消耗很大
-
打开GPU的状态
可以看到基础绘制部分就花费比较多
-
查看shader复杂度
可以看到我们的草和树的shader还可以,但是地形不太行,我们用实时虚拟纹理去优化它
2 实时虚拟纹理
我们看看我们的shader,确实够复杂的,我们对每个像素实时计算所有这些东西
但是并不是每个像素每一帧都会改变
实时虚拟纹理是,我们只渲染一次,然后之后每次都参考那个渲染出的纹理绘制
打开项目设置,选择启动虚拟纹理,然后重启UE4(这一找到一篇虚拟纹理的原理专栏)
添加一个新的
到材质里加入虚拟纹理,从指令上性能变好了
3 效果
到场景一看,似乎有点糊
做一些调整,修改一下分辨率和图块大小
- 参数设置
提高分辨率就正常了
Shader复杂度降低了
基础绘制的秒数减少了,帧数提高了(然而电脑是i7九代+2060 似乎性能提升不太大,但确实是提升了)
舍弃了一点地图的分辨率,增加了性能
但是该方法用存储换性能,我们需要一个大的空间来存RVT
Lec23 实施虚拟纹理的材质混合 Landscape Material Blending With Runtime Virtual Textures
1 模糊问题修正
上节中,RVT会有些糊,其实并不是分辨率的问题,打开我们基础的材质函数
以相机深度来插值远近,这一般来说没问题
但是在RVT的预渲染中,是没有相机这一概念的,所以这个远近混合也没用
怎么办呢?也就不要去搞什么重复了,为了RVT我们放弃这个远近混合
用这个RVT版本的材质函数,去替换之前的版本
但是山上的纹理,有很可怕的tilling,我们要重新思考如何去除重复,这个,以后再说
2 混合
本节利用RVT去让与地面相交的物体,进行材质混合
我们在场景中摆放一些东西的时候,边界是很生硬的
我们可以从RVT中获取纹理来与它混合,达成一个柔和的边界
2.1 高度图VT
可以这么做的前提是我们存了高度图
对于高度图,我们不需要很精确的数据,保存默认设置选择高度图数据即可
放入Volume
2.2 高度mask
找到岩石材质的父材质(这里开始和Ben佬的示范不是一个东西,不过思路是一样的)
打开它,是默认的材质
我们需要一个mask来判断地形在哪里,我们要混合的程度有多大
首先用这个方式判断离地距离是多少
像素的离地距离加上object bounds(也就是物体的边界,物体的xyz长度 ,类似于以几何中心为原点,输出三个方向的半径,我们取B也就是取出高度的一半)
减去参数控制的物体直径
把下图的值连到粗糙度里看看缓冲区
记得把自己的地形材质切换成RVT版本
可以看到分层了,但是锯齿状边缘很严重
我们在saturate前面接一个除法
可以看到比之前的锯齿过渡顺畅一点了
有了mask就可以采样了
2.3 混合RVT
将上面的mask插入alpha,原本的属性插入B,地图的属性插入A
效果如下,首先是没混合
接着进行混合,效果达到了(似乎贴图精度不够所以有些糊)