Building Worlds In Unreal 学习笔记——20-23 程序化植被/草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定制一个材质

  • 我们找到它的材质,发现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)的使用相关推荐

  1. Building Worlds In Unreal 学习笔记——07-11 岩石树落木灌木绘制/溪水着色器/潮湿与焦散贴花/后处理

    Building Worlds In Unreal 学习笔记--07-11 岩石树落木灌木绘制/溪水着色器/潮湿与焦散贴花/后处理 Lec07 岩石与树 Rocks and Trees 1 Folia ...

  2. Building Worlds In Unreal 学习笔记——03-06 地形贴图/地形材质/修正重复/近景位移

    Building Worlds In Unreal 学习笔记--03-06 地形贴图/地形材质/修正重复/近景位移 Lec03 地形贴图 Landscape Textures 1 Quixel Bri ...

  3. Building Worlds In Unreal 学习笔记——24-28 UE4.26的河流系统/自动河床材质/浮力/交互水面

    Building Worlds In Unreal 学习笔记--24-28 UE4.26的河流系统/自动河床材质/浮力/交互水面 Lec24 用UE4.26的水来做一条河 River Water wi ...

  4. 深度学习笔记(23) 卷积维度

    深度学习笔记(23) 卷积维度 1. 卷积步长 2. 卷积输出维度 3. 三维卷积 1. 卷积步长 在这个例子中,用3×3的矩阵卷积一个7×7的矩阵,得到一个3×3的输出 输入和输出的维度是由下面的公 ...

  5. 2020-4-20 深度学习笔记20 - 深度生成模型 3 (实值数据上的玻尔兹曼机)

    第二十章 深度生成模型 Deep Generative Models 中文 英文 2020-4-17 深度学习笔记20 - 深度生成模型 1 (玻尔兹曼机,受限玻尔兹曼机RBM) 2020-4-18 ...

  6. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    Hadoop学习笔记-20.网站日志分析项目案例(一)项目介绍 网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edis ...

  7. Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法

    Ext.Net学习笔记20:Ext.Net FormPanel 复杂用法 在上一篇笔记中我们介绍了Ext.Net的简单用法,并创建了一个简单的登录表单.今天我们将看一下如何更好是使用FormPanel ...

  8. 几何光学学习笔记(23)- 5.6 远心光路

    几何光学学习笔记(23)- 5.6 远心光路 5.6 远心光路 1.物方远心光路 2.像方远心光路 5.6 远心光路 光学仪器中有相当大的一部分仪器用来测量长度.一种是光学系统有准确的放大率,使被测物 ...

  9. 2020-4-22 深度学习笔记20 - 深度生成模型 5 (有向生成网络--sigmoid信念网络/可微生成器网络/变分自编码器VAE/生产对抗网络GAN/生成矩匹配网络)

    第二十章 深度生成模型 Deep Generative Models 中文 英文 2020-4-17 深度学习笔记20 - 深度生成模型 1 (玻尔兹曼机,受限玻尔兹曼机RBM) 2020-4-18 ...

  10. 编译原理学习笔记20——符号表

    编译原理学习笔记20--符号表 20.1 符号表的组织与操作 20.2 符号表的内容 20.3 利用符号表分析名字的作用域 20.1 符号表的组织与操作 符号表 符号表的作用与组织 符号表的整理和查找 ...

最新文章

  1. 程序员真香!IT 业 2020 年平均工资最高
  2. 第二次冲刺阶段第四天
  3. 学习python需要什么基础-学习Python需要哪些基础知识?
  4. PHP基本连接数据库
  5. Linxu 进程描述符task_struct
  6. Spring boot配置嵌入式Servlet容器
  7. C--数据结构--树的学习
  8. JAVA annotation入门
  9. jsfl读取xml,图片,并生成swf
  10. springboot情操陶冶-web配置(六)
  11. 微信小程序启动过程分析
  12. 前端直接读取文本文件内容
  13. LeetCode Count of Smaller Numbers After Self
  14. java微信小程序毕业设计 java微信活动报名志愿者小程序系统毕业设计开题报告参考
  15. 【大咖说】激活数据价值,永洪科技智胜法则
  16. 鲁大师12月新机性能/流畅榜:小米系包揽性能榜前三,流畅榜上限再突破!
  17. tabbaritem 图片太大解决方案
  18. APMserv常见问题
  19. 金工如何运用计算机思维,金工的实习心得体会
  20. docker run --privileged参数(容器权限全开,不利于宿主机安全,宿主机容易重启)(与/usr/sbin/init共用)

热门文章

  1. 全面设防 让广播风暴远离局域网
  2. [RK3288] 相机照片进行翻转
  3. 金沙滩开发板单片机学习笔记(2)
  4. 计算机管理员绩效指标,网络管理员绩效kpi考核标准..doc
  5. 排序—时间复杂度为O(n2)的三种排序算法
  6. 苹果开发者账号--关于邓白氏编码的申请
  7. 如何通俗易懂的跟别人讲一下“人工智能”的发展历史?
  8. 使用Python爬虫爬取淘宝商品并分析
  9. mysql免安装部署_MySQL免安装版配置部署
  10. 特斯拉又发生车祸!电池夜间还自燃3次