资讯详情

Building Worlds In Unreal 学习笔记——20-23 程序化植被/草Billboard材质/实时虚拟纹理(RVT)的使用

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效果如图所示
  • 平面长草,这就想到了以前Slope
    • 看看之前的SlopeMask 连到RGB上
  • 这两个方面结合在一起,使用乘法

新建一个Grass发现节点需要一个节点Grass类型的数据 建这个类 基本设置 选我们刚才的Grass

下图显示了几个问题

  • 草皮太厚,影响性能,网格太多
  • 太浓密的问题可以改变Grass的密度 但是你可以看到远处的十字架BillBoard(从视角确定纹理矩形朝向的技术称为BillBoard),它们的照明不是很对,很明显十字会出现
  • 边界很硬,很不自然
  • 只用了一种草,比较单调

3 问题解决

综上所述,有四个问题:1。合理管理草皮密度;2.修复草皮的刚性过渡;3.修复密度低造成的BillBoard照明异常;4.添加草的种类

3.1 密度管理

第一个是草皮密度

  • 管理草皮的密度,我们可以使用多种草,按照近中远来设定
    • 比如这种近景草,密度高一点到80 高密度也应减少多边形,设置最小LOD为3 同时,由于是特写近景草,初始距离为200,远端去除为1500
    • 复制到中景的草,设置
    • 复制中景到远景的草,改变参数
    • 结果如下:近中远三层显示管理密度,近草密度大,三角形少。对于远处的草,有更大的多边形和更小的密度

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定制一种材料

但是还有一个问题,很明显后面的草颜色很浅 原因是这个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 效果如下,首先是没混合 接着进行混合,效果达到了(似乎贴图精度不够所以有些糊)

标签: 国产smd铝电解电容rvt

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台