UE4 BenCloward教程
Ben Cloward材质课
课程贴图设置
如果实现的效果不是很好可能是贴图压缩设置问题,因为教程很多贴图都是混合的,因此虚幻引擎可能无法准确的判断出贴图的正确压缩以及颜色设置,因此将贴图设置成是最好的质量。
什么是着色器
扭曲着色器
解析:此贴图相当于将不同的noise灰度图分别储存到3个通道中。
其中扭曲效果由此连接法产生,连接法的作用是为其不同地方添加很小的偏移数值实现扭曲。
其中time节点和texcoord节点相加可以使Texture Sample的贴图在对角线处匀速移动,于是为Time节点乘以不同数值的float 2 节点可以实现非线性运动,通过不同数值的灰度图的叠加可以打破重复度。
可以参考海洋材质的水的移动制作思想
特效翻页动画(图像序列视图/Flipbook序列图)
**Flipbook 序列图:**在DCC软件中如maya,blender,houdini,embergen 把制作好的流体,烟雾等等,烘焙成序列帧的形式,到UE4的材质里用flipbook节点播放,或者在粒子里用subuvindex播放。粒子特效纹理,相当于一个66=36帧的动画。
flipbook节点是专门读取这种贴图而存在的。
其中乘以0.8的意义:如果不乘以0.8,那么此着色器得到的是每秒30帧的动画过程,如果需要的是输出每秒24帧的动画那么只需要乘以0.8就可以得到符合视频的动画效果。因为300.8=24。
6的意义是指纹理是6*6帧的。
如果不使用FlipBook可以使用此节点连法。
这里的time的结束时间是1.5,乘的数值是24(最终输出视频的每秒帧数),结果是36,36对应的是第36个的贴图,floor使线性的函数变成了,意义是使一个连续的动画变成了有间隔的动画。
frac节点的意义是只输出小数点后的数值。
循环输出对角线从左上角到右下角的动画:
使可以从1~6,6~12,12~18,18~24,24~30,30~36依此播放。
环境材质混合
基础实现:
vertexnormal的B通道得出模型从下到上-1~+1的数值,其中add加的数值控制的是混合范围,Power控制的混合的对比度,数值越大则边界线越明显,clamp使数值保持在0~1的范围之间,可以用saturate代替,此过程得到的是一个黑白图,无论模型旋转到什么角度都会使另一个材质混合在上方。
法线贴图在切线空间中。VertexNormal是在世界空间中(由节点的WS(world space)可以得出)
将数学计算替换成
其中TransformVector作用是转换空间
通过将法线的切线空间转换为世界空间再进行B通道的遮罩
可以得到这样的遮罩黑白图
可以使混合是依据法线细节的。
着色器性能优化
第一种查看着色器复杂度方式:alt+8快捷键进入着色器复杂程度视图,绿色为简单,红色为中等,白色为复杂。
第二种:进入材质窗口中观察着色器执行的指令数量。但这不是一个很好的方式,因为并非所有的指令都是消耗相同的时间。
第三种:也是最准确的一种,将着色器应用于要使用的平台,对比着色器应用前后的性能差距。
优化着色器的方法
第一种:删除没有提供任何效果的节点连线。
get rid of anything you’re not using
第二种:重构数学实现方式,使用不同的方法实现相同的效果。
举例:通过减乘加替换power节点可以节省需要的指令数,减乘加的思想解释:其中乘法的数值控制的是对比度强弱的程度,此处减0.5乘1加0.5是无对比度,运算思想是使接近0.5的数值(灰色)进行运算后向白色靠近,而小于0.5的数值进行运算后向黑色靠近,依据此运算思想达到增加对比的效果而且使着色器指令更少。
第三种:将数值结合到一起运算
举例:
将相同的运算方式但是不同数值的数学整合到一起再分成不同通道使用。
举例二
将贴图合并,例如将只带有黑白信息的ORM贴图合并到一起。
凹凸与视差贴图
首先凹凸与视差节点的输出都是针对贴图的坐标UV的,它们依赖高度图。高度图中的白色为凸出,越白越凸出
BumpOffset与视差节点(POM)都是通过视觉效果实现的凹凸感,过程是通过渲染多张相同的材质效果但是带一些偏移来形成凹凸的视觉效果。
凹凸节点使用:
一般使用时通常只需要控制HeightRatio的数值来控制凹凸强度。
POM节点是bump节点的进阶用法,它可以获得相比bump offset更好的效果,但是相应的性能消耗也会提高。
一般只会使用这么多节点
其中Height Ratio控制凹凸强度
Min Setps(默认为2) Max Step的数值越大得到的效果越好。 heightmap Channel控制的是要读取的高度贴图属于哪个通道的,例如如果将高度图放到了G通道就将0,1,0,0输入。
再进阶(栗子的课程):
会有锯齿效果:
配合dither temporal AA可以模糊锯齿 DTAA可以理解为抖动像素,让不同深度的像素产生混合效果来来实现融合边缘的效果
。
织物着色器(不更改光照模型的情况下模拟)
其中camera vector 和pixelNormalWS进行dot运算的结果是类似菲涅尔的效果(边缘黑中间白)
然后power控制的是对比度,乘法运算控制的是强度。
反向和不反向的相加到一起是为了既能够控制中间的亮度也能够控制边缘的亮度(为了能够模拟不同布料的效果)
将法线贴图从切线空间转换为世界空间再与camera vector 进行dot运算的作用是使菲涅尔效果是能够根据模型细节变化而变化的,(可以参考环境材质混合中使用法线贴图的作用)。
体积冰着色器
其中作用是根据摄影机的改变纹理会跟着改变,法线贴图的作用是使表面不是光滑的(0,0,1),是带有细节的。
除100控制的是纹理整体向远离摄影机位置偏移的大小,利用贴图替换100可以实现有些远离摄影机有些不远离。
后面乘1/512,是匹配贴图的分辨率。
MatCap着色器
首先了解一下MatCap纹理
制作MatCap着色器的主要思想是无论摄影机处于什么位置,物体总是以相同的纹理图案呈现在窗口上面。
如果只是单纯的将顶点法线空间转换为视图空间的RG通道赋予贴图UV会得到因此经过数学运算后
其中带G通道进行了负号运算是为了进行垂直翻转。
摇曳树叶着色器
雨水着色器
首先要了解下雨的特点
下雨后路面颜色改变,物体表面吸水会让颜色变暗饱和度变高。
粗糙度降低,并且要注意有些物体是表面渗水的有些物体是表面不渗水的。
还有涟漪,水坑,水珠,流淌水滴的特点。
雨的湿度着色器
首先颜色饱和度的控制通过desaturation去饱和度节点控制,为其设置一个负值可以增加饱和度。
这里是得到一个饱和度更高颜色更暗的颜色设置。
材质函数写法:
其中0.07和0.3控制的是有水的地方的粗糙度和高光。
水的高光值是比默认材质0.5的高光小的。
表面水珠着色器
首先解析制作效果所需要的贴图
红绿通道:
红绿通道是用来配合append一个数值为1的标量来充当法线的
蓝色通道:这是一个时间偏移遮罩,这个遮罩让每个雨滴都在不同的时间出现
alpha通道:小黑点们代表我们想让他们成为静止的水滴,白色的代表我们想让他们动起来的水滴,动静结合
材质函数写法:
此处主要对水滴的UV进行了改变,这里水滴改成了依照世界坐标的形式,并且可以通过更改Rain的输入值来更改水滴的强弱。并将输出改成了MASK和Normal
流淌雨滴着色器
依然是先介绍所需要的贴图。
第一张:
红绿通道:用来制作法线贴图(需要乘2减1加一个数值为1的通道才能得到正确的法线效果)
蓝通道:控制雨滴的掉落轨迹
alpha通道:时间蒙版,为了使雨滴落下的时间是不统一的
第二张:
三个通道都是有一片区域为从1到0的一小块渐变
作用是制作雨滴的遮罩,使雨滴不是统一颜色的。
材质编辑器:
首先复习一下材质节点的作用:
world positon 绝对世界位置,作用是输出每个像素的世界位置信息
sign:正数输出1,零输出0,负数输出-1
round: 对小数部分四舍五入
实现此材质效果适用于任何模型,(纹理是随着世界空间平铺的)只针对XY不针对Z
但是这种效果我觉得使用全局一致纹理也能达到差不多的效果。
整体:
转换为材质函数:更改了一下数值使其更符合现实;输入雨的强度来控制水滴的强度(0~1),输入表面渗入性来更改是否有雨滴的流淌速度。(但是我觉得这两个输入应该反过来)
雨滴涟漪着色器
首先此连接目的是制作材质函数,为的是针对不同模型可以快速的使用此函数添加涟漪效果。
首先了解一下贴图
R通道:制作动态涟漪效果使用
GB通道:配合增加一个通道制造法线
A通道:时间mask,使涟漪出现的时间有差别。
先看涟漪材质的连接
函数制作以及改进版:
教程中在涟漪数量那里,乘了一个圆周率并将sine的周期改成了6.283185,我不知道为什么要这么改。
删除了控制涟漪速度的节点,因为等一下再创建一个材质函数,作用是将四个不同涟漪效果合并成一个涟漪效果,然后再创建一个最终的材质函数,在这个最终的函数中制造四个不同的数值赋予给涟漪函数和涟漪合并函数,最终输出法线。
合并涟漪效果函数:
最终涟漪函数:
水坑着色器
制作水坑着色器首先需要一个能够代表水坑位置的黑白图,此处使用之前课上的一张贴图的G通道图来代替。
制作水坑仍然使用根据绝对世界位置映射贴图的方法。
这里解释一下这为什么Puddles参数能控制蒙版的大小,可以直接看当Puddles为0时,减去0,除以一个特别小的值,那么蒙版就几乎全白,再1-x就几乎全黑就是无水坑,当Puddles趋向于1时,减去的数增加,除的数增大,黑色的就越多,然后再反转就得到了白色的。
风吹涟漪材质函数:
完整雨水着色器
材质:
弄到材质函数中:
目前上面版本的shader可能是我们的下雨shader里性能消耗最昂贵的一种
所以我们要做的是,创建这个shader的不同版本
这取决于要施加雨水的对象的类型是什么
如果要把这个shader用到地板上,那么puddle肯定要的,但是我们不需要drips(因为他从侧面流下)
如果我们知道在雨中的这个物体没有大的平面,那么我们可能不需要puddle,需要drips和drops
所以可以的话我们需要根据这个shader创建这几种不同的版本,取决于应用的表面类型,去除不需要的效果
另外,在用蓝图做游戏的时候,我们这个shader所需要的参数可能是会从蓝图那边来(比如暴雨的启动和结束)
我们就需要了解蓝图以及如何从shader外引入值,这些自行了解即可
程序化噪点
主要使用这个节点
perlin noise介绍:
这是一个无限的非重复图案,图上展示的只是一小部分。我们通常不会直接使用它,因为我们可以以它为基本图案并对其进行大量修改。
右边这个图是我们比较熟悉的,PS中的渲染云彩滤镜就是使用了perlin noise
我们可以通过组合噪音来创建各种不同的噪音图案
perlin noise 的个别应用:
perlin noise 广泛应用于地形生成过程纹理。
它是各种程序化生成的内容游戏的基础。
生成perlin noise的核心代码:
当上面这些代码被shader编译的时候,大约会变成61个像素着色器的指令和8个纹理样本,Perlin噪声图用的时候,通常循环3~8次来获得所需要的图案作为mask(8次的话,就有488个指令和64个纹理样本)这样做虽然是可行的但是因为消耗过于昂贵,因此需要另外找其他办法。
方法一:利用三维空间重合perlin noise 将8个纹理样本合并为1个纹理样本。但是这样做会导致内存体积占的过于庞大这是它的缺点。并且要使用它的话需要使其在所有三个维度进行平铺,并且由于它是平铺的,因此不再是无限且非重复的。但是我们可以挑选彼此不对齐的纹理来隐藏平铺的效果。
在UE4中:如果选择3d纹理那一项,我们就是对Peilin噪声的体积纹理进行采样,而不是做代码中的各种数学运算
噪音节点的细节:
湍流的是否勾选决定了noise的组合方式,使用湍流noise更圆润
关卡的大小决定了noise的精细程度,最小输出和最大输出控制的是噪音的黑白程度。并且最小输出代表着黑色的值的大小。
一共可以选择这么多种噪音生成方式,一般使用第三个。
Voronoi可以生成这种noise。
枯木积雪着色器
核心连法:
作用:利用根据世界位置投射的noise使每个使用此材质的树都拥有不同的雪的覆盖。
层积岩着色器
环境艺术家创造了一大堆岩石,我们要做的是把这些岩石塞在一起成为岩层
但是真正去做的时候,这些岩石就像是一堆混乱的石头,有什么方法能够让他们看起来像是放在一起的结构,方法便是程序化噪声
使用的贴图:
使用案例:将不同的岩石资产更好的拼接在一起。
与世界坐标对齐 World-Aligned Shader
水流着色器
涟漪着色器
其中DeriveNormalZ_Function的作用是输入法线的XY信息通过计算得到Z的数值并附加XY最终输出正确的法线信息。
雨滴涟漪根据情况添加。
水深着色器(根据水深得到河流不同地方的透明度)
首先先回顾一下节点的介绍
Scene Depth:这个节点只适用于具有半透明属性的材质,它的作用是得到当前视口摄像机的位置与透过使用着色器的物体(河流)所看到的下一个物体之间的距离。
pixel depth:得到当前视口摄像机与像素之间的距离
绝对世界位置:物体每个像素的位置信息。
首先先看ben教程中的计算水深的方法
此计算过程主要思想是通过相似三角形得到水深。
Scene Depth除以PixelDepth得到了比例。
之所以不直接通过摄像机减去object position得到摄像机到水面的距离是因为这样得到的数值是一个单一的值不是针对每个像素的,并且水面可能通过顶点动画而使一个平面有不同的高度值。这里不理解的是为什么要用1-x节点反转,他前面得到的是一个负值,后面应该乘-1或者用绝对值节点得到正确的。
这是示例图:举例ABCD四个地方通过此算法得到的水深数值。(原点在最下方)
并且这个自我感觉有一些麻烦。
网上找的这个得到的结果应该是最精准的水深。
了解了水深的计算过程后我们需要的是通过水深得到相应的不透明度的变化
水越深的地方越颜色越暗不透明度越大,浅的地方是相反的。
水菲涅尔效应比较明显
因此通过此连接方法得到不透明度的变化和颜色变化。
水体反射与折射
要在UE4中实现反射,应该一共有5种方法,教程中提到了三种,
第一种是天空盒,但水面只会反射天空,不能反射其他物体
第二种是作用是捕获四周的环境创建一个立方体贴图,然后利用立方体贴图进行反射。这个仅仅比天空盒好一些。
第三种是屏幕空间反射,需要在材质球中勾选这个效果很好,但是它只能实现反射窗口视图中的物体。举例:
这三种反射方法可以一起使用。
折射设置:
像素正常偏移适用于水面这类的大型折射表面。
使用折射率的造成的错误折射效果:
当视口向下偏移时一部分水面折射消失了。
官网教程材质大师的举例:
河流的边缘折射率低,其余部分为标准折射率1.33。如下设置:
Gerstner算法海浪
接下来通过顶点动画的形式通过数学计算配合函数生成海浪。
因为需要足够的顶点来实现顶点动画效果。增加模型的顶点数可以通过UE4自带的曲面细分来实现。
在材质球中的细节面板中为以下设置
通过曲面细分乘数来控制细分程度(不宜过大)。一般会使用相机和表面的距离来控制曲面细分乘数。
这里先使用0.5的细分乘数。
Gerstner算法的解释:
普通的sin波是上面那个趋势,而Gerstner波是下面这种趋势,Gerstner波更符合海浪的动画形式。
这里有个严重错误:最后append应该是反过来的应该是这样的,找了很长时间才发现的…
其中波长意思为这个距离
陡度为1时:
陡度为0.3时
因为河流不是只有一个海浪而是很多个海浪因此将算法转换成材质函数多次调用。
只是简单的将方向 波长 波高 陡度(默认陡度给了0.3)变成了输入节点,输出有normal 和offset
这里转换为材质函数依然跟刚才那个错误一样:最后append应该是反过来的应该是这样的,找了很长时间才发现的…
整合到主材质中:
更改了一下颜色后的全部材质:
波光的焦散效果
要想在UE4中实现这种焦散效果,我们可以使用延迟贴花来达到。
步骤:
创建一个新的材质,将材质模式改为
这里利用世界场景法线进行绝对值并且四舍五入(只需要0或1的蒙版)然后取Z通道线性插值得到投射X平面和Z平面再进行通过线性插值得到投射XYZ平面
前后对比:
浪花泡沫
先介绍一下所用到的纹理
这个纹理是将三个黑白图包装在了一起,红绿蓝分别对应了薄中厚三种不同的泡沫需求。
渐变纹理:
红通道:对应的是薄泡沫
绿通道:对应的是中等泡沫
蓝通道:对应的是厚泡沫
这里将x轴平铺法和Y轴平铺法改为限制目的是为了使大小超过1的值限制到纹理的最左端,防止例如1.1的数值因为纹理是平铺的而对应的蒙版位置是黑色。
需要使用虚幻引擎自带的材质函数需要在
中搜索。
这个材质函数的是采样一个纹理然后朝四个不同的方向进行位移的四元混乱函数,作用是使纹理更多样化。由图可知divisor(除数)控制的是纹理亮度,除数越大亮度越高。
根据深度控制泡沫出现的地方:
这只是其中一种办法,也可以通过顶点绘制来决定泡沫出现的地方,或者在Gerstner的波峰的地方添加泡沫。
水流映射
通过着色器制作的涟漪没有自定义的方向,如果我们想要在特定的地方使其拥有特定的流动方向就需要FlowMap(流动贴图)
要想绘制并得到FlowMap需要去网站下载流图画家这个软件来进行绘制。
软件使用:
绘制好FlowMap后导入到UE4中需要将贴图格式改为法线贴图,使用法线贴图的压缩设置可以使向量不被压缩得足够多,而且还将扩大颜色范围从0~1变成-1~1。
流动贴图的作用:它可以扭曲纹理。例如这里,取得流动贴图的RG数值,0.25控制强度,然后加上纹理坐标
它将原图扭曲成了
使用这种材质连法可以得到流动效果。
解析:这里的0.25控制的是扭曲强度。
这里时间节点frac后乘2减1再绝对值可以得到1~0~1~0~1的线性数值。
将两张相同的贴图(一个从0开始流动,一个从0.5开始流动)通过Lerp混合后可以使流动部分一直重复的进行下去。
Lerp混合解析:刚开始进行从0开始流动的动画,然后过渡到从0.5开始流动的动画,再然后过渡到从0开始流动的动画。这样重复过渡形成一直流动的视觉效果。
整理成材质函数:
使用举例:
将这些连接到normal上,最终结果就是按照法线贴图的形状依照流动贴图绘制的流动方向来源源不断的流动。
使用流动贴图的好处是可以自定义水流的流动方向。
在平时使用时通常是根据需要决定FlowMap,因此在顶视图中截取一张图并在PS裁剪好
然后在绘制软件中覆盖贴图再进行绘制。
Ben Cloward地编课
创建地形
UE4官方文档:
https://docs.unrealengine.com/4.27/zh-CN/BuildingWorlds/Landscape/TechnicalGuide/
总结:
颜色: | 地形组件 |
---|---|
黄色: | 地形Actor边缘 |
浅绿色: | 地形组件边缘 |
中绿色: | 地形分段边缘 |
深绿色: | 地形单独四边形 |
使用更少的组件通常可以获得更好的性能。
性能注意事项
组件大小与组件总数的选择是一种性能上的权衡。较小的组件大小可实现更快的LOD过渡,也可实现更多地形的遮挡,但是组件越小,需要的组件越多。
每个组件都有一个渲染线程CPU处理成本,每个分段都是一个绘制调用,所以尽量将这些数字保持在最小值。对于最大的地形,Epic建议最多使用1024个组件。
下面是一个单独的组件(其轮廓为绿色),包含四个分段。每个分段由9(3x3)个四边形组成。同样,您可以看到这些分段相交的顶点都是重复的。
如果我们从包含64x64个顶点的单个分段组成的组件开始,那么组件的大小就是63x63个四边形。假设我们有一个由10x10个这些组件组成的地形,那么地形中总共有630x630个四边形。现在,如果我们想要导入这样一个地形的高度,我们必须有一个有631x631个顶点的高度图,因为存在的顶点总是比四边形多一行(想象一个1x1四边形 - 它需要4个顶点)。因此631x631是一个有效的地形大小。
为了让事情变得更简单,这里有一些尺寸可以用于在最大化面积的同时最小化地形组件的数量。
整体大小(Overall Size)(顶点) | 四边形 / 分段(Quads / Section) | 分段 / 组件(Sections / Component) | 组件大小(Component Size) | 组件总数(Total Components) |
---|---|---|---|---|
8129x8129 | 127 | 4 (2x2) | 254x254 | 1024 (32x32) |
4033x4033 | 63 | 4 (2x2) | 126x126 | 1024 (32x32) |
2017x2017 | 63 | 4 (2x2) | 126x126 | 256 (16x16) |
1009x1009 | 63 | 4 (2x2) | 126x126 | 64 (8x8) |
1009x1009 | 63 | 1 | 63x63 | 256 (16x16) |
505x505 | 63 | 4 (2x2) | 126x126 | 16 (4x4) |
505x505 | 63 | 1 | 63x63 | 64 (8x8) |
253x253 | 63 | 4 (2x2) | 126x126 | 4 (2x2) |
253x253 | 63 | 1 | 63x63 | 16 (4x4) |
127x127 | 63 | 4 (2x2) | 126x126 | 1 |
127x127 | 63 | 1 | 63x63 | 4 (2x2) |
默认创建的地形的密度是1m×1m的,为了增加地形的密度而获得更多的细节可以通过重设大小通过重采样将256×256方块的地形采样到之前创建的地形上来增加地形密度。
采样前:
采样后:
这样会导致密度增加的非常恐怖。
可以通过设置地形的LOD分布优化一下
原来的LOD分布:
更改后的LOD分布:
拉远镜头时密度很小,但是当镜头近的时候密度会变大。
地形贴图
因为制作地形材质需要的贴图数量很多,因此可以把Color和Roughness合并成一张贴图,后缀简称CR,RGB使用Base Color,A通道使用Roughness贴图。 然后法线贴图和AO贴图和Height贴图合并成一张贴图简称NOH。
合并过程:
SD中:
其中AO与Cavity贴图混合的方式为正片叠底。要想获得Cavity贴图需要在Bridge的下载设置中勾选
其中一些贴图需要更改颜色模式
制作好后导出贴图并导入UE4中
贴图压缩设置:NOH贴图使用BC7压缩设置并且取消srgb
贴图准备好以后开始制作地形材质。
地形材质
首先先看一下地形贴图在材质编辑器中的设置:
转换成材质函数:其中法线求B通道的方法改成了附加0.4并规范化,这样做的目的是达到差不多的效果并使材质性能消耗变得便宜一些。
因为制作地形材质需要将很多个跟地形相关的材质进行混合,为了主材质的简单,利用这个材质函数再创建一个材质函数。只需要输入贴图纹理对象和贴图UV缩放数值(1m*1m的材质对应准确UV缩放大小为100),然后就能输出材质和高度图: 接着利用这个Mat材质函数创建对应的单一地形材质函数:
一共有6个材质函数代表6个单一地形材质。对应的贴图UV缩放大小为83,89,127,97,101,241.
最终地形材质:
其中Layer Blend节点中除了第一个混合模式为透明度混合,其余都用高度混合。这样的作用时防止绘制时出现黑斑。
虽然这个地形材质可以用了,但是有严重的地形贴图重复率。接着来改进这个地形材质。
修正重复
修正重复度的方法有四种,首先介绍一下使用的蒙版贴图和第一种方法。
Mask贴图三通道混合程度从小到大
R通道
G通道、
B通道
RGB图
第一种方法
通过将相同的贴图进行旋转后再混合,可以通过swizzle节点来使贴图XY通道数值交换输出充当贴图UV达到旋转的效果(但是使用swizzle节点不只是使贴图旋转还会镜像贴图(因此后面会将法线贴图XY通道交换来得到正确的法线效果))。
更改之前做的单一地形材质函数。
之前的:
更改后:
就是简单的通过mask将旋转前和旋转后的贴图混合了。来得到更多样化的贴图。(这里mask贴图连接错了应该连接B通道。)
但是这样还是不够的,接下来利用第二种方法。
第二种方法
利用CameraDepthFade节点控制远处贴图。
CameraDepthFade:作用是通过相机距离得到黑白蒙版(离得远的输出白色离得近的输出黑色)第一个FadeLength控制的是开始产生白色向黑色渐变的距离,例如输入2000,那么当模型距离摄像机距离达到2000后就开始产生变黑的渐变。第二个Fade Offset控制的是完全变成黑色时的距离大小,当距离达到Fade Offset的大小后就完全变成黑色。
这个多添加的方法作用是离摄影机距离近的使用标准UV的贴图,而距离远的就使用大贴图。
好处是都使用同一组贴图不会产生额外的纹理内存。
但是这种方法使其看起来不真实。因此通过第三种方法改进
第三种方法
为了让远处的大贴图不那么单调,因此通过sd来处理贴图,并通过Make it tile patch节点使纹理平铺并打乱纹理。
Make it tile patch节点属性:
SD连接图:利用了两个substance图形,可以将这些理解为材质函数加入输入和输出就可以当节点来使用
分别是
MakeCRNOH作用跟利用SD生成地形贴图的方法是一样的
MaterialScrambie作用是将地形贴图转换成平铺打乱的形式
最后通过利用这两个substance图形,导入要更改的贴图就可以制作出8×8米的贴图了。最终导出时选择1024*1024的贴图因为是远处的所以不需要用那么高清的贴图了。
然后将输出的贴图替换成第二种方法中新创建的远处贴图就是第三种方法。
其中通过在CameraDepthFade后面加一个AppendMany是为了解决UE4无法正确识别格式
这些材质函数的参数如图所示
第四种方法
在最终的地形材质中加一个全局mask来控制
注意这张贴图是带有一些颜色的,但是他们的RGB数值都在0.5左右,RGB通道的数值有些微差别,但是在UE4中要将他们的压缩设置改为BC7并且取消srgb
通过这张MASK贴图使地形不同地方出现些许的颜色变化,
将这四种方法结合起来为最终的降低重复度方法。
近景位移贴图
因为虽然绘制地形材质后的法线能够起到的效果已经很好了,但是依然使地形看起来十分的平坦,因为地形的线框不够多。所以为了修复这点,首先将靠近相机的三角形细分,然后根据height贴图来偏移顶点。
要增加地形的细分首先需要在材质面板中Ben佬没有开无裂纹置换但是我觉得应该勾选比较好。
为此使用材质函数来创建这些功能:
最终地形材质:利用材质函数输出到细分乘数与世界场景位移
实现的效果:近距离的地形材质不再看起来那么平坦了
这种增加细分的行为会带来性能压力,谨慎使用以及参数的控制。
植物编辑模式介绍和资产准备
植物编辑模式中常用的就不多介绍了,介绍一下有用的但不常用的。剔除距离决定了模型在离摄像机多远的距离时会被剔除掉不显示。将资产的剔除距离更改为不完全相同可以使资产不同时消失。
还有可以单独设置绘制的模型是否投射阴影。如果一些小模型的阴影在其他大型模型的阴影之下那么就就可以取消小模型的投射阴影。这样可以节省很多性能。可以在模型中确定是否接收贴花,默认是不接收贴花的,但是手动摆放的那些模型是默认接收贴花的。
重应用工具
利用重应用工具可选择性地修改已放置在场景中的植被网格体的特定参数。 用启用的重应用工具在植被网格体上进行绘制时,在网格体列表中选中的植被网格体将更新,以反映在重应用工具中进行的修改。
设置复选框后,在现有实例上绘制笔刷时将重新应用相应的参数。 使用绘制工具时多数设置均相同,然而也存在几点不同:
项目 | 描述 |
---|---|
网格体 | 在此处输入要使用的静态网格体类型。 |
绘制 | 可在此处覆盖将植被网格体添加到关卡时要发生的情况。 |
放置 | 可在此处覆盖植被网格体放置在关卡中的方式。 |
剔除
因为植被实例在单次绘制调用中被渲染为群集,所以每个群集将基于遮挡被渲染(或不被渲染)。如在 结束剔除距离 参数中设置了一个值,则超过此距离的群集也将被剔除。然而,此项将导致网格体分组因整个群集超出范围而突然消失。
添加一个 开始剔除距离 参数并正确设置材质即可解决此问题。 在顶点着色器中将计算一个逐实例淡化因子,其在开始距离处为1.0、结束距离处为0.0。 可使用 PerInstanceFadeAmount 节点在材质中进行访问。 如将此连接到一个不透明度或遮罩值,则可将其用于淡化一定距离之外的距离(在其到达 剔除距离结束 并从渲染中被移除之前)。
下方的材质范例将材质遮罩与淡化因子相乘,以弱化植被网格体的叶片,直到其完全消失。
资产
Bridge石头:
https://quixel.com/assets/tllhcelva
https://quixel.com/assets/tlljeeyva
https://quixel.com/assets/tliiadmva
模型要LOD1 3 4 5 ,导出的LOD1
草使用4K的贴图其他的树干树桩和石头使用2k贴图即可
导入商城资源后,如果要摆放资产需要编译,因此为了能够保证摆放资产的流畅性推荐先将资源的地图打开,打开后电脑就会编译整个地图,这样在所有紫衫编译完后就可以流畅操作了。
树木:https://www.unrealengine.com/marketplace/en-US/product/interactive-spruce-forest云杉树
大石头:
https://quixel.com/assets/pkeeM
https://quixel.com/assets/pjtsT
https://quixel.com/assets/pjEr1
https://quixel.com/assets/pkjsK
https://quixel.com/assets/pkjsG
https://quixel.com/assets/pjAxm
树干和草:
https://quixel.com/megascans/home?assetId=tjsicjffa
https://quixel.com/megascans/home?assetId=tjrtcibda
https://quixel.com/megascans/home?assetId=rdkeg
https://quixel.com/megascans/home?assetId=rdeu3
https://quixel.com/megascans/home?assetId=tg0qedqda
https://quixel.com/megascans/home?assetId=qdyf7
https://quixel.com/megascans/home?assetId=ti3mdirda
https://quixel.com/megascans/home?assetId=okfch
https://quixel.com/megascans/home?assetId=sbslY
https://quixel.com/megascans/home?assetId=seEoW
https://quixel.com/megascans/home?assetId=tefocd1r
绘制前提推荐以及一些技巧
绘制前可以将要绘制的模型全部都摆放在同一个平面上排列出来,这样就可以方便观察要绘制的模型的大小比例是否正确。还有颜色粗糙度SSS效果等是否符合想要的效果。
虽然绘制很方便,但是绘制的一般不如手动摆放的更好,一些前景的大型植物推荐手动摆放。
绘制效果:
接下来将溪水材质赋予到面片中,并且制作从高处向下流的水流。
溪水着色器
溪水着色器与材质课中讲到的水流着色器差不多,主要区别在于溪水着色器不需要海浪计算,主要依靠flowmap达到想要的水流效果。溪水着色器不需要
流动效果制作
通常我们应该通过流动贴图来配合之前材质课中制作的flowmap材质函数来达到流动效果,但是因为我们想要的流动效果比较简单,就是仅仅需要让水流从平面的X轴的反方向流动,X轴对应的是纹理坐标中的U坐标,因此当U方向的数值增加时采样框向U方向移动形成纹理向U方向的反方向移动的错觉。因此FlowSpeed为负值时河流向X轴负方向移动,FlowSpeed为正值时河流向X轴反方向移动。
这里参数化的四位数自定义了四个通道名以及默认数值。使R通道负责控制涟漪的大小,G通道负责控制流动的速度,B通道负责平面X轴方向的两端的蒙版大小来使平面衔接更好,A通道负责控制Y轴两端的蒙版大小来控制流水的区域。
如果直接使用单一的U方向有速度而V方向没有速度会导致整个河流全部都以相同的速度直线移动,因此通过制作蒙版来使河流移动的有快有慢。
蒙版:
这里如果想要容易理解建议从TexCoord拆分成两个通道再合并到一起的方法来理解。因为TexCoord的RG通道分别为从左到右,从上到下的渐变。将他们乘1-x可以得到两端为0中间为0.25的渐变图,然后再进行平方(在遮罩方面平方或三次方以上一般作用都是为了降低对比度。),对RG通道乘以不同的数值来分别控制UV方向的不同蒙版,因为是蒙版只需要0~1的数值,因此再使用Saturate将它们钳制到0~1的范围。
因为溪水是很多个平面组合而成的,它们都拥有不同的大小,因此将它们的ObjecScale乘以纹理坐标常量就可以得到相同的涟漪大小,最后再通过一个参数来实时控制涟漪的大小,NormalDamping控制涟漪的法线的衰减。
这样溪水的流动就做好了。
经过各种遮罩叠加最终连线
这里有一个细节需要提醒一下,水的高光值是比默认的0.5小的,这里高光值给了0.3。
潮湿贴花和焦散贴花
制造潮湿效果的贴花:
因为潮湿贴花的作用是将贴花范围内的粗糙度降低来达到潮湿的效果。因此贴花材质的材质属性设置如图所示:
主要学习了程序化生成遮罩以及了解了可以通过贴花来影响其覆盖的模型的属性
焦散贴花和材质课的几乎一样改了一下投射纹理大小和自发光强度
瀑布着色器
着色器材质属性设置
为了制作从上向下流的效果,需要先根据这个高度制作模型片。
所以将上下两个片导出到maya,根据这两个片确定高度,制作出瀑布模型。
这里在maya中绘制顶点颜色,四周为黑色其余为白色,目的是为了在虚幻引擎中可以直接通过顶点颜色
这里在绘制时因为maya的工作方式会导致绘制颜色出现显示问题因此通过三角化解决显示问题。
将这个模型导出然后导入UE4。进行着色器制作:
这里导入到UE4中的操作中,通过导入可以得到带顶点颜色的王个体,但是在UE4中又出现了这种现象
因此干脆将模型文件全部改为这样再导入UE4中。
法线动画
不透明度与折射
不透明度与折射也不太难理解
教程中的瀑布不透明度的连接法跟水一样主要思想就是通过菲涅尔来控制不透明度的变化。
教程中使用了Fresnel_Function节点,这个节点的功能跟Fresnel节点的功能差不多。并且Fresnel_Function中使用的是VertexNormalWS,教程中使用的是PixelNormalWS是因为想要得到更准确的结果。VertexColor对应了建模时的顶点颜色(顶点颜色也可以通过UE4手动绘制)。
折射就是将水的标准折射1.33,和1通过线性插值得到。
顶点位移动画
在顶点法线方向进行的位移动画:
这里通过WPO_Tilling_U和WPO_Tilling_V得到渐变图,然后加上time节点配合sin使不同区域都对应不同数值(顶点位移),然后叠加上遮罩,以及决定位移的方向以及整体强度最终得到顶点法线方向的顶点动画。
在局部坐标X轴处进行的位移动画:
通过让这两个位移动画加在一起获得最终的顶点动画。
泡沫
将泡沫贴图通过panner节点进行位移然后(相同的贴图经过不同UV不同panner speed混合可以增加随机度),然后通过顶点颜色来控制泡沫生成的地方。这个泡沫连接到自发光。
总体
开放世界地图制作
前言:之前学习的都是通过手绘制作地形,手动绘制植物,手动绘制地形材质。这个系列主要学习通过程序化得到世界地图以及程序化生成植物,根据海拔斜率自动分配不同的材质。
获得一个地形
获取并使用真实世界的高度图
首先了解一下虚幻引擎所需要的高度图规格。对于这些参数的东西,都可以通过虚幻文档查询。
https://docs.unrealengine.com/4.27/zh-CN/BuildingWorlds/Landscape/Custom/#heightmapformats
通过查询虚幻文档以及教程中的解释得到以下几点主要内容:
高度图格式
从第三方程序导出高度图时,只有以下格式才能在UE4中使用。
- 16位灰阶PNG文件
- 16位灰阶.RAW文件,以小端字节排序
如果使用Photoshop来导出高度图,则需要按下图对新图像进行设置:
在第三方应用程序中制作高度图时,白色 的值(在所有通道中为255)代表高度图上的最高点;黑色 的值(在所有通道中为0)代表高度图上的最低点。
创建地形
再次将虚幻文档建议的地形大小亮出来:
整体大小(Overall Size)(顶点) | 四边形 / 分段(Quads / Section) | 分段 / 组件(Sections / Component) | 组件大小(Component Size) | 组件总数(Total Components) |
---|---|---|---|---|
8129x8129 | 127 | 4 (2x2) | 254x254 | 1024 (32x32) |
4033x4033 | 63 | 4 (2x2) | 126x126 | 1024 (32x32) |
2017x2017 | 63 | 4 (2x2) | 126x126 | 256 (16x16) |
1009x1009 | 63 | 4 (2x2) | 126x126 | 64 (8x8) |
1009x1009 | 63 | 1 | 63x63 | 256 (16x16) |
505x505 | 63 | 4 (2x2) | 126x126 | 16 (4x4) |
505x505 | 63 | 1 | 63x63 | 64 (8x8) |
253x253 | 63 | 4 (2x2) | 126x126 | 4 (2x2) |
253x253 | 63 | 1 | 63x63 | 16 (4x4) |
127x127 | 63 | 4 (2x2) | 126x126 | 1 |
127x127 | 63 | 1 | 63x63 | 4 (2x2) |
获得高分辨率的高度图
教程中讲了很多种方法,这里就写其中一种。
首先进入网站https://opentopography.org/
这个网站只能够选择红色区域的高度图,找到想要的区域后通过点击select来框选区域
可以通过左下角的标尺推算自己框选区域的大小。
因为要在虚幻4中创建一个8129×8129的地形,因此框选一个8公里×8公里的高度图。
框选完成后向下拉找到第二个的光栅点击进去。
在弹出的窗口中相比默认选择只需要取消勾选可视化中的从DEM生成山体阴影图像。
为了处理高度图使其能够被虚幻引擎所识别,需要下载一个软件来进行处理。
软件的网站连接:
http://www.demenzunmedia.com/home/terresculptor/
软件的使用:
在打开时的欢迎界面中选择import Terrain
然后搜索的格式选择Geo TIFF raster imagery
然后找到下载的高度图。
读取成功后直接点击ok
刚开始导入时显示的是一个平的地形,通过更改Y轴的缩放可以查看地形的效果。
接下来修改地形的分辨率:
首先在工具中选择Unreal Engine
可以选择材质赋予地形预览以下效果
然后导出成PNG格式16位灰度的高度图。
然后导入到虚幻引擎通过高度图新建地形
刚开始生成的地形同样具有高度缩放不正确的问题,可以通过调整Z轴方向的缩放大小来解决,如果想要获得严谨正确的缩放大小就去虚幻文档里面看一下,里面有教。
地形初始设置
高级地形斜度混合材质
做之前先去bridge下载两个surface
https://quixel.com/assets/ukticbcdy
https://quixel.com/assets/tdloaf1r
下载4k的
下载好后按照之前的方法将纹理压缩成CR,NOH的格式
转换法线贴图的压缩格式为BC7取消SRGB
先按照之前地形材质的做法为其设置UV缩放等参数。
先介绍一下通过VertexNormal来控制两种地形的混合。看一下整体连接:
解析:
混合材质用到了BlendMaterialAttributes这个节点,这个节点的作用是通过蒙版混合两种材质。和之前使用LayerBlend节点不同,LayerBlend作用是使地形可以绘画,这里是程序生成地形材质的。
然后介绍一下锐化的理解:锐化就是增加对比度。
锐化强度为1:锐化强度为100时:
锐化强度为1000时
总结锐化计算就是在数值为0.5的那条线上进行分界,将小于0.5的数值向0趋近,将大于0.5的数值向1趋近。要想好理解可以代入0.505,0.505减0.5后变成0.005再乘上100就变成了0.5再加上0.5就变成了1。
除了图中的锐化算法还有一种就是利用Power节点。
因为是蒙版所以最终加一个saturate。
目前整体:
目前效果:
因为这里看起来就像是雪全部盖在来岩石上面,因此使用PixelNormal可以使计算的数据更大得到的效果更好。(材质课中有讲法线混合)。
如果换成使用PixelNormal混合,蒙版:这里不仅将路面混合了而且还将斜面也混合了不少。
最终选择采用将两者混合使用:
但是混合后会出现报错,
因为不能通过像素法线来混合输入到normal节点中,因此这个BlendMaterialAttributes节点就不使用了,所以我们自己创建一个用来混合材质的材质函数。将其他属性用顶点与像素混合的结果,normal属性只使用顶点法线。
创建材质函数前可以先参考一下引擎中自带的一个将它复制到自己的材质函数中并进行一些修改可以让我们使用。
主要修改如下:
将之前的一个Alpha输入节点改成了两个Alpha输入节点,其中AlphaPixel用来接收依赖VertexNormal与PixelNormal混合生成的蒙版,AlphaVertex用来接收仅依赖VertexNormal生成的蒙版。
然后调整使法线属性和Height的混合使用仅依赖VertexNormal生成的蒙版,其他属性的混合都依赖VertexNormal与PixelNormal混合生成的蒙版。
目前整体:
看效果:材质混合效果好了很多。
接下来将生成Alpha蒙版整理成材质函数,使其更加美观
材质函数名叫:MF_AngleBlendAplha
再配合之前做的MF_LandscapeDisplacement材质函数(需要开启细分),目前的全部节点如下:
高级地形自动材质
基本地形斜度混合材质已经做好了,接下来制作能够通过海拔以及地形斜度的大小来混合更多材质。
首先先再bridge下载课程中额外需要的纹理。
https://quixel.com/megascans/home?assetId=ujldajxdy
https://quixel.com/megascans/home?assetId=pjwky20
一个草地一个泥地。
依然按照之前的处理地形贴图的步骤处理一下。
对应材质参数设置:
海拔高度混合
这个材质又多利用了一个节点这个节点的作用是根据Alpha的数值与Min和Max进行对比,趋向于Min就趋向于0,趋向于Max就趋向于1.
可以利用这个节点创建根据地形的海拔高度而产生的蒙版。
Min设置为地形Z轴最低数值,Max设置为地形Z轴最高数值,Alpha连接世界位置后得到的:
Min和Max可以通过在地形的最低处和最高处放一个Box来查看
这里选择不包括材质偏移应该是因为地形具有根据摄像机于模型距离来增加细分和置换的功能,使用包括材质偏移的绝对世界位置的话会因为绝对世界位置一直在变化而重复计算影响性能。、
如果仅仅依靠smoothstep生成的遮罩充当混合时的依靠是不行的,因为这是一个平滑的过程,它是将低海拔的材质慢慢过渡到高海拔的材质,因此还需要一些其他操作。
要想让两种材质不仅仅依靠平滑的过渡进行混合,进行如下操作:
这里Blend_Overlay中的Base和Blend的连接反了,应该SmoothStep连接Base,Moist_Stones连接Blend
blend_overlay之前:
blend_overlay之后:
相当于混合时多加上了高度。
然后通过cheap_contrast节点增加对比度减少灰色的存在使混合更明显。
高度与角度的混合
教程中这些材质混合后再混合 依靠不同蒙版。要学习这个混合功能主要把前面的高度混合和角度混合再仔细看一下就好理解许多了。
这里角度混合AngleMult的数值为0时是,数值增加为正值时就是白色越多,AngleMult为负值时就是黑色越多。意义就是白色越多就代表平坦程度要求越低(AngleMult数值越大),黑色越多就代表平坦程度要求越高(AngleMult数值越小。)平坦程度要求高意思是只有非常平坦的区域才会为白色蒙版区域。
这里还有一个巧的点在于通过海拔的高度来控制AngleMult和PixelNormalBlend。
就这样混合加混合就都混合在一起了。
目前成果:
在自动材质上绘制材质
经过刚开始的课程已经知道,要想实现绘制材质就要使用LayerBlend节点利用图层来达到绘制的效果。因此要实现在自动材质上绘制材质的功能可以如下:
就是将自动的地形材质和有斜度的地形材质和低海拔平坦的地形材质转换成地形图层,然后通过sample得到对应的图层使其能够在绘制的同时将高度信息一起绘制上去。
目前整体:
这里Blend_Overlay中的Base和Blend的连接反了,应该SmoothStep连接Base,Moist_Stones连接Blend
更改材质后赋予地形图层就可以了如果没有地形图层就重新指定一下材质
程序化植被
资产准备以及基本程序化生成植被的操作
程序化植被功能做之前先了解一下植被的分布,如图所示:草都集中生长在更平坦的地方,有绿色的也有枯草。
先去下载一下需要的草丛(下载2k的)
https://quixel.com/megascans/home?assetId=uddmcgbia
https://quixel.com/assets/rbdoo
https://quixel.com/megascans/home?assetId=uddmcgbia
这三个之中有一个是之前做手绘地形时用过的
树:树使用之前做手绘地形用过的
先做程序化草:
我们已经知道了草生长的区域是低海拔以及平坦的范围之上。因此我们可以让根据海拔生成的蒙版以及根据斜率生成的蒙版结合得到低海拔以及平坦区域的蒙版,然后利用grass节点生成植被。
grass节点全名叫LandscaperGrassOutput
要使用grass节点需要在内容浏览器中自定义创建一个地形草地类型:
介绍一下这个地形草地类型:
进去后可以通过草地种类可以指定要程序化生成的植被的种类。
其中草地密度是以十平方米为单位,使用网格的作用就是让植被生成时产生位置抖动使其看起来不那么对齐。
其中起始剔除距离以及结束剔除距离的过渡很生硬这里介绍的使用这个剔除距离需要使用PerInstanceFadeAmount材质节点这个在后面介绍,然后下面的这些主要看一下要不要进行缩放,要不要接收贴花和投射动态阴影。还有这个Grass节点的使用:
要使用grass节点只需要指定草地类型然后将蒙版传给grass节点就可以了,grass节点会自动为蒙版区域生成指定的草地类型
效果:
教程中的LOD过渡比较明显,但是我的草的过渡不明显。然后发现我的bridge导入到引擎中的资源并没有Billboard的贴图,因此我手动找到billboard的贴图导入到引擎中并指定。
指定后就跟教程中的效果一样了。
先了解一下billboard,直译名字叫广告牌。就是这种面片,比如在游戏中平视这种面片时并没有面片的感觉,因为材质效果就是将这些面片会根据观察者的视角自动转换,而造成这种面片是立体的错觉,但是他是有弊端的,那就是当俯视或者仰视时会暴露这是面片。
接下来进行性能优化以及解决远处广告牌材质的显示问题以及解决过渡生硬的问题。
草地种类介绍
**1、草地密度管理
**我们可以为一个草地类型增加多个草地种类,为这多种草地设置不同的草地密度以及不同的起始剔除距离与结束剔除距离。通过这样设置可以制造近处,中处,远处的草地种类。使近处的草地密度高多边形密度高投射阴影,中处的草地密度低多边形密度低不投射阴影,依此类推。
如图设置:这里提示一下可以通过右键将属性复制粘贴并且我们手动在这里设置的起始剔除距离以及结束剔除距离需要在材质面板中通过一个节点来使这些参数具备剔除的功能,等下讲。
解决过渡生硬的问题以及增加草的多样性
要想解决这个问题需要对母材质进行更改。
教程中是使用了PerInstanceFadeAmount材质节点
将这个节点使用在母材质之中,将这个节点连接到基础颜色之中。会看到这些黑色的渐变
但是我自己做的时候并没有这些黑色的渐变,不知道为什么。
教程中利用这个节点配合DTAA节点使渐变更顺滑。DTAA的作用就是使像素随着时间的推移混合抖动。
不连接到不透明度是因为使用不透明度消耗性能太高了。
增加草的多样性:
为了增加草的多样性,为草地类型添加多个草地种类,
添加不同的草地种类主要是剔除距离有一些区别。
增加新的草地种类:树
要想程序化生成树,首先要先想树要生长在哪些区域,从真实世界上来看,树一般生长在低海拔的偏陡峭的区域。然后要知道树的生长跟倾斜地形的法线方向是不同的,树生长是直直的向上生长的,因此在地形草地类型中应该取消勾选对齐到表面。
这种树这样设置
小一些的植物这样设置。
在Grass节点上面新增加草地类型将蒙版赋予过去
效果:
整体节点:又把各种地方的蒙版整理解释了一遍。
解决广告牌材质的发光问题
为了解决这个问题需要对其母材质进行更改,因此将原来的母材质复制一个,将它改造成一个专门应用于广告牌的母材质。
先理解一下为什么远处的广告牌材质草的光照会这样,从世界场景法线的缓冲中查看法线远处的草不跟前面的草一样看起来像是朝向我们的。所以我们需要自己创建一个专门针对这种面片草创建广告牌材质。
创建广告牌材质之前先了解一下引擎为广告牌材质做的材质函数SpeedTreeBillboardNormals
为母材质进行了以下更改:
1、将粗糙度统统改为1,将Wind功能删除掉(因为就两个平面,wind功能实际上起不到什么作用还提高了性能消耗),将法线栏的节点重置为如下:
首先是使用将法线贴图替换成0,0,1节省资源,然后乘上TwoSideSign使法线在内外两端都为正的,然后利用SpeedTreeBillboardNormals材质函数使法线始终朝向摄像机,最后因为Normal接收的是切线空间的数值,因此利用transform节点进行世界空间与切线空间之间的转换。
让植物广告牌材质的母材质替换成修改后的母材质后,可以看到法线的效果更好了。
法线效果的更正解决的是植物的发光问题。现在还需要解决一个的问题就是远处的草颜色太浅了。要解决这个问题只需要进入材质调节广告牌材质的颜色调暗就可以了。
调整后颜色匹配了许多。
使用实时虚拟纹理优化
使用控制台命令stat unit可以增加帧速率计数器提供的信息。输入后
其中Game和Draw是CPU的工作。
统计数据观察性能消耗的主要来源:
实时虚拟纹理:
实时虚拟纹理就是将我们生成的这些树当成纹理,在使用时只需要加载纹理而不需要一个个加载这些网格体了。
在项目设置中找到虚拟纹理打开。
打开后需要重新编译一遍,然后将这个拖入场景,可以在这里设置虚拟纹理对应的Actor以及设置边界以匹配Actor(地形)以及新建运行时虚拟纹理。
转到材质编辑器:
这两个节点,一个是输出虚拟纹理并可以自定义输出哪个虚拟纹理以及虚拟纹理的内容,一个是决定虚拟纹理的各种信息。
在拥有了虚拟纹理后就可以在需要利用虚拟纹理时使用RuntimeVirtualTextureSample节点。
将虚拟纹理大小提高可以将分辨率提高不然地形就太糊了。
这种操作相当于牺牲存储内存换取性能。
RVT材质混合
教程开始前,提到了之前做的为了降低贴图重复度,根据摄像机与地形之间的距离将1024的Mid贴图与4K的贴图混合的功能配合虚拟纹理会导致地形效果不好,于是把那个功能删掉了。
RVT材质混合的效果
混合前:
混合后:
RVT材质混合的作用就是使不同模型之间混合更加自然。
首先我们需要为地形新增加一个虚拟纹理,这个虚拟纹理只需要获取地形的高度,因此不需要太高的分辨率要拥有这个效果需要对母材质进行一些更改,因此将其母材质复制一份,改成能够实现RVT混合效果的母材质。
利用这个得到地形与物体的蒙版。但是还是有些生硬,加一个除法后
提高blend的数值后过渡不那么生硬了
利用这个蒙版混合地形与模型。
4.26引擎自带的水系统
要使用引擎自带的水系统需要开启这两个插件
其中landmass的作用是它能够使我们能够通过样条线编辑水,并且可以实时的改变地形。
因为这个水系统是非常消耗性能的,因此我们重新利用程序化生成一个2017*2017的地形。
创建地形后将地形向上平移,只要地形最低点高于0就行。
接下来就是创建一个新的地形材质实例赋予新地形并为其指定之前创建的两个虚拟纹理(带颜色的和高度的),然后将地形启用编辑图层,最后拖入两个
并设置边界指定虚拟纹理。
然后将地形的权重层赋予就可以出现材质效果了,然后因为这个新地形和之前的地形海拔不一样,因此将母材质中的控制海拔的参数暴露出来调整就可以出现跟之前地形差不多的效果。
接下来拖入河流:拖入河流后
这个河流是根据样条线生成的并且可以实时的改变地形,接下来介绍一下河流的各个参数:
介绍之前先提一下创建新的样条点的方法:选择样条点,然后使用alt+移动可以生成新的样条点。
这一栏是可以控制某一样条点处的宽度速度深度。
这一栏控制的是样条线对地形的影响。
自动河床系统
优化一下水:
首先先更改一下颜色:找到水材质
优化好水之后,我们需要根据水流程序化生成水流地形以及水流旁的石头,需要这种效果:
之前水流下都是程序化生成的草,现在改成了水流方向程序化生成石头以及水流覆盖区域材质对应更改。
要实现这个功能还是挺简单的,前提是需要知道伴随着水插件的使用会有这个actor然后在它的设置之下有一个影响权重图和影响的权重图图层。
勾选影响权重图后的意思就是水插件的使用是可以伴随着权重的。权重就是这个
。然后为其影响的权重图图层添加一个数组元素自定义命名为River,然后找到WaterBodyRiver
在下面添加River
有了River权重图以后我们就可以通过这个River权重图对材质进行修改。
主要利用了这个节点获取River权重图,然后就可以根据这个river权重图作为蒙版混合其他的材质,以及配合Gras
s节点程序化生成节点。
也就增加了这两个功能。
全部材质连接法:
这里为了得到更好的贴图效果把之前为了优化而使用的RVT给关掉了。
程序化水坑
程序化水坑的生成在之前的课中写过一次,可以复制过来改进一下,并且使其能够匹配地形,例如地形中的水坑不能张草,并且因为之前近距离细分的原因可能导致水坑的显示有问题需要调节一下height的值。
这里就直接截图了。
首先制作一个水坑的蒙版函数用来控制水坑的蒙版大小。 这里的两组二维数值控制的是水坑蒙版的大小,可以根据自己需要手动调整。 这只是一个大概的值,当PuddleSize大小超过1时,Lerp对应的数值也会超过B的数值依然可以增大水坑蒙版。
其中水坑遮罩就是依靠世界位置作为UV进行投影。然后依靠VertexNormalWS使水坑只生长的平坦的区域。
有了水坑的遮罩以后,发现水坑的遮罩还会出现在河流的下面,因此还需要河流的遮罩来控制水坑不生长的区域。
因此依靠这个水坑遮罩函数继续创建一个水坑函数,水坑函数可以接收一个遮罩控制水坑的生成区域,以及通过接收地形材质使地形以及水坑混合。这里设置height混合是因为之前设置了近距离置换增强的效果会导致。因此也为水坑增加了Height变化
使用水坑函数后的地形材质:这里主要是对于水坑的遮罩的处理,以及使植被不生长在水坑上面。
为水坑增加水流和涟漪
利用之前的水流涟漪材质函数,因为要制造水流和涟漪就需要对法线进行操作。因此制作PuddleRipple材质函数将水坑的法线变成水流涟漪法线。
这个Puddle Ripple的作用就是输入法线和水坑的mask,将地形的法线和水坑的法线混合起来然后输出法线。
然后整理到地形材质上面。
天空和雾气
创建户外场景时可以使用引擎提供的模板
新建关卡选择第二个,会给我们提供一个很好的户外坏境设置
主要需要这五个这里SkyDomeMesh的作用是填充地平线
→
与默认拖入比起来模板的设置:
定向光:
天光:
体积云:
天空大气配合指数级高度雾:
拖入指数级高度雾后发现天空大气并不能影响指数级高度雾,因为指数级高度雾自带
因此为了能够使天空大气能够配合指数级高度雾,在项目设置中开启
开启后将指数级高度雾中的雾内散射颜色以及定向内散射颜色改为黑色,这样就可以实现天空大气影响指数级高度雾了。
接下来可以更改一下定向光(控制太阳的光)的设置,来使灯光更好看。
更改了定向光设置以及增加了指数级高度雾以及使天空大气能够控制指数级高度雾后场景确实看起来更好看了。