🐸本文为虚幻官方材质课的学习记录,并不完全,在此按我的个人需求记录了如下笔记。这一篇是基础篇
🐸这里是基础篇链接
🐸这里是高级篇链接
🐸加油 ! 加油 !


UE4官方材质课_基础篇

一:了解材质:

🚩PBR(Physically-Based Rendering):

基于物理的渲染。
它提供了一种光照和渲染方法,能够更精确的描绘光和表面之间的作用。
PBR流程能更真实的模拟光照和材质之间的物理交互效果。

  • 直观便于理解
  • 物理上更具准确性
    • pbr基于物理定律,如能量守恒定律和平方反比定律(Inverse-square law)
    • pbr材质在不同的光照下会表现的更一致
  • 使用真实的物理测量单位表示亮度
    • Lumens(流明),Lux(勒克斯)

💡简单来说基于物理的渲染本质上是通过:

  • 材质
  • 灯光
  • 曝光

这三大部分控制的组合结果。

🚩Primary PBR Inputs:

  • Base col
  • Metallic
  • Specular
  • Roughness

🏕️Base color(Albedo)

  • flat color,没有任何光照信息(没有高光和阴影)
  • 只保存颜色信息
  • 可以是linear RGB,也可也是一个Vector3
  • 各个通道的数值位于0到1之间(纯白和纯黑会导致一些场景的曝光问题)

🏕️Metalic

  • Gray scale
  • 数值在0 到 1的区间,不包含任何色彩信息
  • 金属最正确的设置方式是全开或全关
    • 数值为0时,材质底色是diffuse
    • 数值为1时,材质底色是specular/reflection color
    • 示例图:
      metallic

🏕️Roughness

  • Gray scale
  • 数值在0 到 1的区间,不包含任何色彩信息
    • 数值为0时,无限接近于镜面反射
    • 数值为1时,为粗糙表面

粗糙度是能量守恒的体现。

🏕️Specular

  • 控制高光和反射(specular highlights and reflections)
  • Gray scale
  • 一般情况下保持default value 0.5就可以了
  • 通常情况下,我们通过调整Roughness来调整高光质感
  • 正常世界中,所有物体都有一定程度的反射和高光效果

示例图:
roughness

🚩UE支持的图片文件的格式(常用):

未压缩格式 压缩格式
BMP PNG(simple Alpha)
TGA(Alpha) JPG
PSD DDS
HDR
  • simple Alpha通常被用于植被

🚩贴图规则:

  • 最大支持8k
  • 长宽必须是2的指数幂(512,1024,2048)
  • roughness,metallic,specular均不需要rgb通道,所以直接储存为gray scale导入UE。这样他们就会被自动设置成灰度图,并且不会启动sRGB或者Linear的颜色空间
  • Normal 贴图也同理,不需要使用sRGB
  • HDR 也不需要使用sRGB,因为它的取值一般会超出范围
  • sRGB只适用于颜色贴图(导入需要确保灰度图没有勾选sRGB)
  • 所有的灰度贴图只要储存形式正确,那么UE会直接自动设置为禁用sRGB
  • 所有的base col应当将压缩格式设置为DXT1(在贴图设置选项中,compression也可以自行更改,如果格式正确,那么UE会自动为你设置好它的compression setting)

🚩贴图导入方式:

  • 直接拖入项目
  • 右键在content browser选择import Assets

🚩UE材质编辑器tips:

  • 双击节点之间的连线,创建dot整理节点
  • c,创建comment
  • ctl+拖动节点连线来改变节点连接输出的位置
  • clean up删除此节点图中的孤立节点(unused node)
  • connector改变节点显示方式
  • T,创建texture sample

🚩混合模式:

在Material中,可以找到Blend ModeShading Mode这两项,这两项十分重要

🍭Blend Mode:

  • Opaque 不透明
    • 多数不透明材质的基本设置
  • masked 遮罩
    • 显示有mask遮罩的材质
    • 背面默认不显示,需要开启two sided
  • Translucent 半透明
    • 通常使用在半透明材质,玻璃等有折射的材质
    • 同时控制opacity与refraction来调整效果
    • Translucent一般情况下以最简单的方式计算半透明,以节约开销
    • 如果想提升半透明材质的效果,需要来到Translucency的选项下,勾选Screen SPace Reflection,并把Lighting Mode改成Surface ForwardShading;这两个选项能让我们获得最高质量的半透明材质。开启这两个选项后,着色器需要更长的时间编译。
  • additive 叠加
  • Modulate 调制
  • AlphaComposite(Premultiplied Alpha) alpha复合(预乘Alpha)

Translucent:
blendMode_Translucent

🍭Shading Mode:

  • Default Lit
    • 通常的光照设置,材质受光照影响
  • Unlit
    • 材质不受光照影响;这种模式下允许表面产生自发光
  • subsurface
    • 次表面散射,如皮肤和蜡烛
  • clear coat
  • two sided foliage
  • hair
  • cloth
  • eye
🍌subsurface scattering
  • 将Material的shading mode设置为subsurface
  • 主要使用两个矢量(base color和subsurface color)和两个标量(opacity和roughness)

示例:
subsurfaceMat
subsurface

🚩创建一个简单材质:

  • 当我们给mesh更换材质,或应用新材质时,需要在静态网格编辑器(Static Mesh Editor)中打开mesh,并且在右侧Detail面板下更换指定新材质
  • UE支持多材质对象。一个mesh可以有多个elements并指定材质
  • 最好遵从材质命名规则,如Material最好以M_name这样以M为前缀来开头
  • T for texture sample,选择我们需要的贴图
  • 基础材质创建使用的大多数是:base col, roughness, normal

🚩继续简单材质:

  • 如果希望在贴图中预览并使用到UE的content,则需要再texture的选项里打开show Engine Content

    • showUEcontent
  • 反转黑白可以使用(1-x)One Minus

  • 混合:Multiply(M)

  • 相加:Add(A

  • 使用constant与贴图Multiply,以达到控制灰度的效果,或使贴图与相应选区进行混合

  • 常用噪波:perlin noise

  • 线性插值:Lerp

    • 利用alpha通道混合a,b两个图层
  • 常用扁平法线:flatnormal

  • 平铺纹理:Texture Coordinate

🚩使用DataSmith从其他DCC软件导入材质到UE:

vraytoUE_datasmith
简单解释就是其他的软件制作好的材质会被以一种datasmith提供的方式转换到ue中,但是有些情况下是无法正确转换的。需要额外自行修正,并且灯光也不会被预先烘培。


二:创建PBR材质(基础)

🚩主材质实例:

  • 实例化材质可以为我们的主材质创建副本,然后用来代替主材在项目中使用
  • 实例化材质的优点:
    1.节约时间,可以通过公开主材质的某些参数,进一步调整实例材质而无需重新编译着色器。
    2.对主材质进行的改动也会更新到所有的材质实例。
    3.仅需要根据材质特性创建主材质,然后实例化材质应用到所有的类似材质上。

🚩公开材质参数:

  • 右键相应节点,convert to parameter并重命名
  • convertParam

🚩switch:

  • Static Switch Parameter,静态开关参数
  • 使我们开启或禁用某些功能
    示例:
    当True的时候,开启base color与纯色相乘,为False时则关闭相乘,仅显示base color
    swichPara

🚩实例材质的优先级以及参数最大最小值:

当制作材质的时候,可以修改材质参数的优先级方便使用
groupandpior
我们可以通过修改Group和sort Piriority来实现

  • 只需要选中group中的“None”,将None改为我们需要的组名
  • sort Piriority为0的组会优先出现再我们的分组中,依次是1,2,3的组
  • 分组需要按需求比如tex,utility,uv之类的功能不同的节点可以分开设置,并自行定义优先级

示例: 此时所有的参数就被归档在我们定义好的组中。
groupPreview

✏️可以给参数滑块设置最大最小值,使可以调节的范围不超过我们设定的值
minMax

🚩动态材质:

材质一般在UE中分为两种:

  1. 静态材质
  2. 动态材质
    • 动态材质让我们在运行的时候实时调整

Actor:

  • Actor与普通的mesh相比,它可以附加蓝图
  • 我们需要在Event Graph中创建我们的功能
  • 创建dynamic material,并在source Material中指定材质源
  • bpshaderball
  • 之后再set texture parameter value ,使用我们指定的参数Diffuse
  • 再创建set scalar Parameter value, 控制Metallic
  • 最后需要set vector parameter value,设置Color
  • bpshaderball2
  • 因为我们或许希望color不会在创建出的时候即刻执行,我们希望用户再点击屏幕对象的时候改变这个参数,所以此时还需要“事件调度器(Event Dispatchers)”来完成它
  • 此时需要先创建变量,再set color
  • bpvriable
  • bpvriableType
  • 最后设置event Dispatchers,选择event。最后compile,此时编辑好了actor的材质。
  • bpeventDisp2

🚩编辑level Blueprint:

  • 现在要做事情使编辑关卡的蓝图,使我们之前编辑的actor生效,效果达到:点击之前编辑的actor,并使它颜色发生改变
  • 进入level BP,创建get player controller,获取用户的动态,mouse cursor,click even看他是否对actor进行操作,然后再用事件调度器触发自定义事件
  • lbp_clickeven
  • 接着我们要判断用户是否点击到了正确的对象 ,然后再触发自定义事件,完成颜色替换的指令
  • get hit result under cursor for object,然后确认object type,使用make Array,确认我们希望用户能够点击哪类对象。
  • lbp_clickeven2
  • 接着left mouse button获取鼠标的动态,看右键是否点击到了正确的目标。
  • get class,class is child of,得到父类下正确的对象。如果结果是我们需要的对象,则返回True。
  • cast to ,通过这个引用我们可以访问之前用于改变颜色的自定义事件。
  • 最后获取change color even,获取到我们之前定义的事件,并且设置随机颜色。
  • lbp_clickeven3
  • compile,play。这样我们自定义的actor就会随着鼠标点击随机改变颜色。
  • lbp_clickeven4

🚩材质参数集合,创建全局参数集(Parameter Collection):

  • 有时候因为场景变化的需求,比如下雨天材质整体变得湿润,或者受到风力影响而相关材质摇曳的程度增强,或者自发光强度因为场景变化需要整体变强。
  • 如果一个一个调整则很花费时间。此时就要用到材质参数集,达到批量修改整体参数的目的。
  • 我们可以右键在content中创建Meterial Parameter Collection,再分别创建自己需要的全局标量和向量。
  • mpc_setting
  • 在Master Mat中,建立collection parameter,选择之前创建的参数集,与需要修改的参数相乘。
  • 如有float4的参数出现,则需要使用component Mask转换成float3,以免出现数据类型的不匹配
  • mpc_setting2
  • 全局参数集相当于给所有设置全局变量的参数一个总控制,每个单独的材质也可以在自己的材质球下独立调节,但是总集控制所有材质的全局参数,如果在总集禁用,那么独立的材质的那个参数也会被禁用。

🚩材质参数集合,第二部分:

  • 现在想要实现:允许用户点击后,更改其中的一个全局参数
  • 需要在level BluePrint里进行编辑,与Actor部分相似,前半部分判断鼠标点击以及获取用户行为的蓝图操作是一样的(在我的基础篇笔记上篇)
  • 之后,判断点击对象,确保在视窗内选中正确对象然后 create reference带入蓝图
  • mpc__bpsetting
  • 选择正确的目标进行判断,并设置好rendom vector。
  • compiled,此时play就会看见随着鼠标点击,全局对象也可以随机改变颜色了。

🚩材质函数:

  • 材质函数就是材质图表中可以反复使用的自定义代码片段
  • 它的好处是可以把复杂的材质图表转化成拥有单个输入输出的单个材质节点
  • 更改代码中的函数,所有实例也会同步修改

✏️此时的案例要实现的是uv tiling。

  • 在content中创建Material Function,点击进去。
  • m_func01
  • 如上图,我们首先设置uv 平铺,其次设置旋转,再判断使用不使用rotation
  • 编辑好后需要单击面板,开启左侧列表中的“Expose to Library”,才能确保我们后续能正常搜索到它。
  • 接下来回到我们需要使用tiling的材质
  • m_func01_tiling
  • 搜索我们之前创建的Function,并根据我们之前设置的变量来分别连接参数
  • 此时这个材质就有UV Tiling的选项。

数据迁移:
m_func_Migrate

  • 此方式能够将做好的材质函数迁移到其他文件使用
  • 当然也可以通过这种方式迁移别的需要的资产

✏️另一种材质函数的方式:CustomNode

m_customNode
m_customN_name

  • 这种方式通过hlsl语言来创建材质函数,得到自制的材质节点
  • 设置的input name需要与code的名字匹配
  • 定义hlsl并不像内置的材质表达式,且无法被优化
  • m_customN

三:实例创建不同的材质演示:

🚩clear coat制作类似车漆质感:

  • 将shading mode设置为clear coat后,Material会又clear coat和clear coat Roughness这两个选项
  • 它的显示方式与普通的材质较为相似,如果希望有光滑的表面,并且希望透明图层下的表面有凹凸效果,就可以选择clear coat来模拟
  • 如果要启用clear coat的第二层normal,则需要去setting中开启(默认是关闭的)
  • clearcoat_enableSecNormal
  • btNormal
  • 我们可以lerp两个scaler控制roughness,并用类似的方式控制设置表面的normal以及clear coat光滑表面下的bottom normal
  • 示例:
  • clearcoatmat
  • clearcoatmat_view

🚩Two-Sided Foliage 双面植被:

  • masked这种模式需要与shading mode下双面材质(two sided foliage)设置配合使用。(如果是default lit的模式下,则没有subsurface通道)
  • 这种着色方式实际上并不是半透明的,但他能很好的与蒙版混合模式搭配使用,并且借助subsurface color以更低的开销模拟半透明效果。
  • 其他的材质通道设置与普通材质没有很大区别,要注意的是使用opacity mask并且需要双面显示的话,一定要勾上two sided这个选项。
  • 借助wo Sided Texturing这个function可以分开控制双面材质正反两面的参数以及效果,最终的结果就是调节了subsurface以模拟光透过叶片的效果
  • twoSidedFunction
  • 示例:
  • twoSidedFoliage

🚩布料着色:

小tip:如果有时候近处被裁切影响放大观察,则可以去Output Log的cmd中输入:r.SetNearClipPlane 1,将相机近景裁切更改为1

  • 通常我们可以使用subsurface或者fresnel来实现布料的模拟。但是UE提供的 shading mode下就有 cloth这个选项,该着色模式使模拟布料的时候可以用于不同角度查看它的毛绒质感
  • 我们创建布料材质的时候,shading mode需要选择cloth,blend mode保持opaque;此时Material中就会有Fuzz color 和cloth这两个通道。cloth通道可以借助mask指定该材质哪些部分是布料。如果是窗帘这样需要双面的材质,则也需要勾选two sided。
  • 可以通过两个texture sample将布料纹理和布料图案分开设置,同理也可以将roughness和normal用一样的方式分开设置。
  • m_cloth_basecol
  • blend angle corrected normal,这个内置函数可以混合两张法线贴图
  • FuzzyShading,此函数可以使用于fuzz color,它支持我们控制菲涅尔
  • m_cloth_basecol
  • 我们通过调节这些参数的组合得到不同的效果
  • m_cloth_display

🚩染色玻璃:

方案步骤:

  1. 使用顶点色,来打造有色玻璃的效果,并且玻璃的着色颜色仅显示在最厚的部分
  2. 使用UE中的内置函数,给玻璃表面添加磨砂或者模糊效果

🐢第一部分:创建基础玻璃

  • 创建material,使用blendMode为 Translucent,shading mode保持Default Lit。
  • 随后去到Translucency的选项下,lighting Mode选择使用Surface ForwardShading或者Surface TranslucencyVolume,开启质量较高的着色选项。开启后可以发现material可以使用metallic,roughness等通道了。
  • 设置一个简单的折射控制,使用fresnel作为Lerp,alpha来设置边缘到中心的折射参数。玻璃的IOR差不多设置在1.2-1.52之间。
  • m_glass_refraction

🐢第二部分:加上玻璃边缘的磨砂绿色质感

  • 这一部分使用Modes中的paint来绘制顶点色实现
  • m_glass_vertexCol
  • 我们仅仅需要影响桌子的边缘,再将绘制好的顶点信息导入材质,以确定哪些区域被采用并进行上色。绘制完成后记得保存此vertex color到内容浏览器中。
  • m_glass_vertexColBlend
  • 添加使用vertex color
  • m_glass_vertexColBlend2

🐢第三部分:使用菲涅尔改进色调真实度

  • 使用Fresnel_Function,使玻璃内部和外部可以分开调节
  • 使用Pixel NormalWS(像素法线世界空间)作为normal vector
  • m_glass_Fresnel_Function2
  • 使用substract,设置玻璃的边缘透明度
  • m_glass_edgeOpacity
  • 在视图窗口也可以使用Visual effect中的Planar Reflection来提升反射效果,得到更准确的反射(适用于平面,但不太适合其他有机形状)
  • m_glass_table

🐢第四部分:设置一些磨砂效果

  • spiralBlur-SceneTexture,我们需要用这个自带函数来控制材质的自发光颜色,并需要与Opacity的边缘控制也关联
  • m_glass_spirlblur
  • 现在我们需要反转之前绘制的vertex color再与spiralBlur相乘,来连接自发光颜色
  • m_glass_spirlblur_emmisive
  • m_glass_frosted
  • 切记多调整参数来得到满意的效果

🚩置换贴图,模拟毛毯地毯一类:

发布支持DX11显卡时,引入了一项全新的硬件功能:real-time Dynamic Tessellation Geometry。使我们能够使用置换纹理贴图在显卡上增加对象的多边形面数,由此显著提升了对象的物理细节而无需真正对此细节进行建模。

  • 创建materail的时候,需要先开启细分。去Tessellation的选项下,D3D11Tesselation中选择Flat Tesselation。还要勾选Crack Free Displacement,保留Adaptive Tessellation。
  • 此时Material中有新增了两个通道:
    • World Displacement(用于连接displacement Map)
    • Tessellation Multiplier(控制有多少polygon总数添加到对象,数量越大,置换效果越详细,但一般不建议开的很高)
  • 一般情况下,displacement map使用普通灰度图即可。
  • 如果在displacement的数值很高的情况下,导致边缘会产生与主体分离的效果,可以使用绘制vertex color来绘制边缘的部分,让边缘的部分不受tessellation的影响来解决这一问题。
  • paintEdges
  • m_displacement
  • 使用置换贴图必须先确保基础模型的网格数不会太低。
  • 置换贴图也会对性能产生影响,所以要谨慎使用。

🚩顶点动画,创建窗帘随风吹动的效果:

  • 了解“世界场景位置偏移”(World Position offset)
  • 使用基本的material的设置创建布料材质作为基础,并使用World Position offset来创建窗帘的顶点动画
  • 使用panner来加入动画,使用vertex color绘制需要动画的部分,并加入材质控制
  • m_vertexAni_graph1
  • m_vertexAni_graph2
  • 需要将这个模型对象设置为movable来获得正确的光照和阴影显示
  • m_vertexAni

终于刷完了!受益匪浅!