Building Worlds In Unreal 学习笔记——20-23 程序化植被/草Billboard材质/实时虚拟纹理(RVT)的使用
Posted 清清!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Building Worlds In Unreal 学习笔记——20-23 程序化植被/草Billboard材质/实时虚拟纹理(RVT)的使用相关的知识,希望对你有一定的参考价值。
Building Worlds In Unreal 学习笔记——20-23 程序化植被/草Billboard材质/实时虚拟纹理(RVT)的使用
- Lec20 程序化植被 Procedural Grass & Foliage for Landscapes
- Lec21 草Billboard材质优化 Grass Billboard Material
- Lec22 使用实时虚拟纹理优化性能 Landscape Optimization Using Runtime Virtual Textures
- Lec23 实施虚拟纹理的材质混合 Landscape Material Blending With Runtime Virtual Textures
本系列学习资料来源,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
效果如下,首先是没混合
接着进行混合,效果达到了(似乎贴图精度不够所以有些糊)
以上是关于Building Worlds In Unreal 学习笔记——20-23 程序化植被/草Billboard材质/实时虚拟纹理(RVT)的使用的主要内容,如果未能解决你的问题,请参考以下文章
Building Worlds In Unreal 学习笔记——29-30 水坑与涟漪
Building Worlds In Unreal 学习笔记——01-02 概览与引入
Building Worlds In Unreal 学习笔记——12-14 瀑布/雾与光/总结与展望
Building Worlds In Unreal 学习笔记——03-06 地形贴图/地形材质/修正重复/近景位移