欢迎光临散文网 会员登陆 & 注册

UE4风格化场景全流程——①项目设置及地形创建

2022-06-23 16:29 作者:葱鸭Singleye  | 我要投稿

【中字】虚幻引擎UE4创建风格化场景全流程教学

【UE4风格化】【人工翻译】虚幻4风格化环境制作教程

本文为up学习笔记及踩坑记录,会结合我知道的知识点扩展

项目源文件请到上面视频链接的评论区下载

欢迎大佬指出我的错误,若图片太小请放大观看(网页端缩放浏览器)

  • 项目设置

    在编辑-项目设置中关闭自动曝光,因为自动曝光会根据相机位置与视角自动改变画面亮度,导致场景的视觉变化很大。

接着我们启用虚拟纹理支持。

再打开生成网格体距离场,这样我们就可以访问屏幕空间全局光照(SSGI)这样的功能,我们可以获得距离场照明、距离场环境遮挡等实时功能。我们的场景将是完全实时的,不会烘培任何照明信息。

然后根据提示重启引擎,引擎会重建你的距离场和着色器。

接着我们在内容浏览器中右键新建文件夹,创建Maps文件夹来存放地图数据(untiy则惯用Scenes文件夹)。再创建RVT文件夹,即实时虚拟纹理(Runtime Virtual Texture)。实时虚拟纹理是不存在硬盘的纹理,它们由游戏运行时生成,可以让我们得到一些非常酷的混合效果,常用于草、地形和岩石的高度混合。一个例子就是,草在使用RVTs时看起来更蓬松,在不同地形层之间的颜色显得更加顺畅。

  • RVTs设置

    在RVTs文件夹里右键-材质和纹理-运行时虚拟纹理, 创建LandscapeColor实时虚拟纹理(名字可按照自己的习惯设定),这将作为我们的地形颜色纹理。再创建一个LandscapeHeight。

在LandscapeColor上双击,这个面板可以控制虚拟纹理的大小(以切片计算)、每个切片的大小以及每个切片边缘的填充(用于切片间的过渡)。大家可以按照自己的项目需求更改,这里使用的虚拟纹理大小是2K,这是基于网格体分辨率大小,然后我们把切片大小改为512,不动边缘填充。

虚拟纹理内容选择的是所需材质的属性,通常我们就保留默认值(底色Base Color、法线Normal、粗糙度Roughness、高光度Specular)四个通道,如果你想要减少内存与性能负担,你也可以只用底色,因为这只是用于表达颜色的纹理,实际上我们不需要另外三个通道。

然后双击LandscapeHeight,我们进行同样的操作,需要注意的是这里的纹理大小为1024,虚拟纹理的内容为场景高度,因为这个纹理只用来储存我们地形的高度信息。

回到场景,我们要删除原先的地面Floor,并创建一个RVT文件夹。在放置Actor面板中搜索运行时虚拟纹理体积,并拖入两个到场景的RVT文件夹下。重命名一个为Color,另一个为Height。重置他们的位置到坐标原点(也可以不这么做),并给他们的虚拟纹理分别赋上LandscapeColor和LandscapeHeight。

接着我们在视窗的模式那进入地形模式,我们可以在地形面板中控制地形的分段大小(一块地形的分辨率)、每个组件的分段(一个组件有几块地形)、组件的数量(大地形由几块组件拼成)、整体的分辨率。我们创建一个1×1总分辨率在128的地形。

这里解释一下,引擎提示光照需要重建,指的是场景中的静态光,静态光照是没有实时阴影的。

如果你拖入一个立方体并移动,你会发现阴影是跟随立方体的,这是实时阴影。而在细节面板我们可以看到,天光和立方体是静态的,方向光是固定的。此时我们构建光照,引擎提示消失,再拖动立方体,就会发现地上多了一个阴影,就是之前烘培到光照贴图的阴影,且立方体还有个跟随着它的实时阴影,因为引擎认为立方体是静态的且这个阴影没有烘培到光照贴图,所以又弹出了提示,这通常是引擎优化的方法,以减少实时运算。

这个项目中我们不考虑优化,所以不使用烘培照明,在细节面板将天光和方向光改为可移动的,会发现之前烘培的阴影消失了。这种方法比较吃性能。

同时我们在窗口开启世界场景设置面板,在面板中找到强制无预计算光照打开,这会阻止引擎烘培任何类型光照。我们再重新构建一次光照,会发现场景亮度不一样了,这是因为之前我们有预先计算的光照信息,现在就是完全的实时光照场景。(记得删除测试用的立方体)

我们再点RVT文件夹下的Color,你可以看到这是一个没有实体但有原点位置的对象,我们在细节面板的从边界构造变换中设置之前创建的地形Landscape为边缘对齐Actor,并点击设置边界,Height同理。

接着我们点击Landscape,在细节面板中找到虚拟纹理,添加2数组元素并赋上我们创建好的LandscapeColor和LandscapeHeight,这是为了保证我们能写入虚拟纹理。

我们再创建一个材质文件夹Materials,在其下创建一个Landscape文件夹放我们地形的材质,再在其下创建一个LandscapeMasterMatertial材质。

双击这个材质,在编辑面板右键找到Runtime Virtual Texture Output,我们需要这个材质输出实时虚拟纹理到我们的文件中。我们先右键找到绝对世界位置(Absolute World Position),这个世界坐标有XYZ三个通道,但我们只需要高度,所以我们右键找到遮罩,遮罩的RGB分别对应了XYZ,我们只需要B通道,设置好后将其连接到WorldHeight上,他会输出世界的高度。

保存后我们点击地形Landscape,将这个材质赋给细节-地形-地形材质,并进入地形模式随便绘制点高度(我做的时候不知为何无法进入地形编辑模式,一直提示我无法创建地形,且世界大纲地图多了一堆莫名其妙的组件,重启项目后可以正常进入地形编辑模式,但却显示需要构建光照,天光和方向光以及场景的光照设置全都还原了,RVT和Landscape虚拟纹理的绑定也不见了,只能重新操作,且在没有重新构建光照的时候地面会呈现一个白色的圆形)。

之后我们回到RVT下的Height再点一下设置边界,能看到虚拟纹理上多了一块小白点,就是我们刚刚绘制的高度(感觉这里有Bug,我重做后不用再点设置边界能就能直接显示)

这个方向我们可以看到纹理上的像素块,说明纹理的分辨率不够高,但这样会非常消耗资源。

勘误:我们需要删除这个球形反光捕捉器,似乎这就是之前我看到纹理上有一个白色圆形的原因(这不是必须删除的)。同样之前我说有Bug的地方,通常设置材质好后绘制高度会直接更新在高度RVT中,如果没有更新说明没有正常运行,请检查一下设置边界按钮。

我们回到刚刚的地形材质,这个案例中我们只用纯色,而通常地形材质的制作比这难。先右键搜索地形层混合(LandscapeLayerBlend),它将混合细节面板中的图层。将它的输出连到RVT输出的基础颜色(Base Color)和地形材质的基础颜色,无论何时你想将连接到地形材质的属性通过虚拟纹理表现出来,都要记得再连接到RVT节点,大部分我们场景中使用的效果都是由RVT实现的。

我们地形会有多个由我们绘制的图层,就像是PS的图层,会显示在左边细节的图层面板里,这里我们添加4个层,每个层的名字、混合类型和权重都不同。第一次我们命名为Ground(地面),第二次命名为Grass(草),为了做出层次,第三层命名为GrassDark(深颜色的草),第四层命名为GrassDarker(更深颜色的草)。

之后我们给它赋予颜色,创建一个三维变量,快捷键是键盘数字3+鼠标左键,再右键转换为参数(也可以直接v+鼠标左键),并命名为GrassColor,我们给这个参数分组为BaseColor以便于管理,再将它输出到Layer Grass。这里说明下材质实例,材质实例是你在材质上右键创造的副本,也可以认为是父子层,它可以避免反复编译以优化性能。

复制两个这个参数并改名为GrassDarkColor和GrassDarkerColor(或自己创建,需要注意三个参数都在同一分组),给这三个参数从浅到深赋值并连上层混合节点。

再复制两个参数分别命名为GroundColor_1和GroundColor_2,取相近色从浅到深赋值。按住L+鼠标左键创建Lerp节点,将这两个参数分别输出到Lerp的A、B。Lerp即为线性插值(linear interpolation),它会基于权重显示输入的内容,即通过透明度Alpha通道控制两张图的显隐,可用于构建平滑的过度,顺带一提Flowmap也是这种方法。

这我们需要构建一张灰度图(灰度遮罩),当灰度图全黑的时候就会显示第一个颜色,全白的时候就会显示第二个颜色。右键添加绝对世界位置,将其连到相除Divide节点(直接输出拖至空白处搜索或d+鼠标左键创建节点),s+鼠标左键直接创建一维参数(或数字1+鼠标左键后右键转化为参数),命名为GroundMaskSize,默认值为2000,我们用这个参数控制世界绝对位置贴图的尺寸,即这个遮罩能覆盖多大的地形,我们只输出XY轴坐标,即UV坐标,所以再创建一个只有RG通道的遮罩(RG对应XY轴),连接后输出至Texture Sample。

回到内容浏览器,我们新建一个Textures文件夹用于存放贴图,下载项目文件搜索uniformcloud并拷贝到自己的文件夹,回到材质编辑器选用刚刚的贴图。

将Lerp连至Layer Ground,再创建一个默认值为1的Roughness参数,用于控制粗糙度。我们把GoundMaskSize(地面遮罩大小)分组至ColorVariation(颜色变化),Roughness(粗糙度)分组至MaterialParameters(材质参数)。

回到场景进入地形编辑模式,点击绘制,会发现之前的设置的层已经出现在了左侧目标层里。(视频中失败了,他给材质创建了个材质实例重新赋值给了地形,若有人失败了可以尝试这么做)

我们在Landscape下创建一个Layerinfos文件夹用于储存层信息,在目标层中选择一层点加号,创建权重混合层(法线),这和我们在材质编辑器Layer Blend中看到的混合类型一样。为每一层都创建层信息,会发现地形变为了Ground层颜色,简单绘制后如图下。当你选中一层进行绘制的时候,它会为你画的每一个物体编译一个着色器(我做的时候目标层材质预览会突然消失,不知道是不是在编译shader的缘故),所以你需要为每一层画上几笔让引擎编译好全部着色器。

可以看到边缘有明显的锯齿,这是因为我们地形分辨率不高,我们可以在地形工具设定里勾选使用目标值让它一定程度上更光滑,不过当地形都铺上草这些瑕疵就不容易看出来了。我们也可以调整工具强度,试着画几笔,可以看到它在颜色混合上非常强大,使用不同强度绘画时,变化是缓慢而稳定的,这对我们草的颜色有很大的影响(现实中草的颜色变化往往是一块一块缓慢而又连续的)。你也可以打开材质实例调整GroundMaskSize改变地面遮罩大小,200~500(最终设置)看看有什么变化(我是看不出来[/doge])。

拓展内容:在Textures文件夹下新建Noise文件夹,用来储存噪波纹理,将之前的uniformclouds移动到里面,在下载的项目中找到alph_1复制到这个文件夹下。因为视频中是UE4.26且用了旧的窗口UI,所以功能位置会有些不一样。我们在地形绘制模式下点击视窗上方的循环,改为Alpha,即为根据透明通道进行绘制,选择我们刚刚导入的alph_1作为纹理。可以看到笔刷形状已经发生改变了,可以用这种方法自定义不同的笔刷,但清晰度还是取决于我们的地形分辨率。


UE4风格化场景全流程——①项目设置及地形创建的评论 (共 条)

分享到微博请遵守国家法律