[浅析]UE4材质基础总结

图形学基础知识

除了自发光物体,成像皆由视网膜接收物体各尺度平面反射的光线构成

光照效果一般可分为漫反射和镜面反射(高光)两部分

漫反射:凹凸不平的表面反射的没有方向性的光

镜面反射:若反射面比较光滑,当平行入射的光线射到这个反射面时,仍会平行地向一个方向反射出来

请添加图片描述
光源照射物体时,将会与物体产生多种交互现象,反馈大致为:

光源到达物体表面时、物体原子会将光子部分吸收partially absorbed,能量守恒转化为热能,反射的部分较弱;且根据折射率具有不同角度微平面散射scattered

穿透的部分将会产生折射Refraction次表面散射Subsurface Scattering半透明透射Transmission

经过散射、微平面镜面反射的部分,称为 漫反射Diffuse

被相对镜面反射,称为 镜面反射Specular

材质和材质实例概念

材质实例由材质继承而来,对父材质外观的参数化

游戏里只有父体材质会被编译,材质实例可降低渲染开销,在场景中高速渲染和实时反馈

材质资产为绿色,实例深绿色

材质中右键节点转换参数后创建实例,实例中产生配置参数,勾选后可设置

层级可以查看继承层级关系,可以直接定位到材质查看图表和细节面板,实例只有参数可配

动态材质实例概念

参数化的材质 + 蓝图 = 动态材质实例

作用:在游戏运行中动态改变材质,如角色走进某个范围后某个物体切换随机颜色,或自发光等效果

蓝图继承自Actor,构造脚本中create dynamic material,并保存动态材质的变量引用

事件图表

set vector parameter value: 按材质的参数名设置值

材质细节面板关键参数

物理材质

关联的物理材质,如碰撞产生的弹力将保留多少能力,不影响外观

应用:不同材质类型,不同反馈的实现

如:角色踩在不同材质上发出不同音效(射线检测 + 物理材质

又如:子弹击中不同材质产生不同特效和音效(hitEvent + 物理材质

材质域

材质的作用类型:会影响节点基础参数

表面材质域时,可设置用途Usage, 标记可控制材质应用对象的类型,引擎为每个应用程序编译特殊版本

如结合骨架网格体使用,结合粒子spirate使用等

混合模式

不透明(最常用)

遮罩Mask(部分固体可见部分不可见,如铁丝网围栏等)

细节面板参数:不透明蒙版剪切值

半透明(如玻璃类材质等)

纹理

即:材质贴图

着色模型

默认光照,大部分实心物体

次表面,如冰

预整合皮肤,用于人类皮肤

双面植物,如树上的树叶

毛发,用于逼真的头发材质

布料,用于逼真的布料和绒毛

眼睛,用于人类眼睛

双面,用于植物(法线将被翻转到背面,同时计算正面和背面的光照)

from材质表达式,用于单一材质处理多个着色模型

[注] 混合模式和着色模型详见官方文档:图形和渲染 - 材质 - 材质属性 材质属性|虚幻引擎文档

PBR基础(Physically based rendering)

模拟物理表面特性的参数化

PBR可以根据环境光照的反射呈现不同效果

UE4中有两种工作流,第一种更常用,参数含义详见后一部分

金属粗糙度工作流(Metal – Roughness Workflow)节点:BaseColor基色、Roughness粗糙度、Metallic金属度

反射光泽度工作流(Specular – Glossiness Workflow)节点:Diffuse漫反射、Glossiness光泽度、Specular镜面反射

上述两种工作流的公共常用参数:AO环境光遮蔽、Normal法线

材质节点基础参数

BaseColor基础色(PBR工作流1)

材质固有色

Constant4Vector设置,4维向量RGBA (快捷键4)

Metallic金属性(PBR工作流1)

镜面反射与漫反射的光线占比,值越大镜面反射越多,越接近金属

值限定在0-1, 一般不会取中间值

Roughness粗糙度(PBR工作流1)

材质表面的粗糙程度

值限定在0~1,越粗糙材质漫反射越明显,向更多方向反射

Diffuse漫反射(PBR工作流2)

定义漫反射

Specular高光度(PBR工作流2)

定义镜面反射

和Diffuse共同决定固有色

Specular + Diffuse共同作用类似工作流1中的Metallic + Roughness

Glossiness光泽度(PBR工作流2)

定义光滑程度,类似工作流1中的Roughness

Normal法线(PBR工作流公共常用)

高分辨率建模创建的贴图,用于呈现更多表面凹凸层次细节

应用于如人脸、武器等精细模型

AO环境光遮蔽(PBR工作流公共常用)

屏幕空间环境光遮挡(SSAO)是一种近似计算因遮蔽而造成的光线衰减的效果。通常是在标准全局光照的基础上增添细微效果,例如让角落、裂缝或其他生物变暗,以形成一种更加自然真实的视觉效果。

其他参数

各向异性与切线(用于金属拉丝效果)、自发光、不透明度(混合模式为半透明激活该参数)

[注] 具体说明详见官方文档:图形和渲染 - 材质 - 材质输入 材质输入|虚幻引擎文档

材质图表的计算节点

最常用的技巧

Multiply正片叠底:如对纹理和白色三维向量相乘后作为baseColor的参数

Lerp线性插值:如粗糙度的最小最大值通过lerp限定在0~1后作为参数

常用节点&快捷键一览

【A】Add加法:接受两个输入,将它们相加并输出结果。

【B】BumpOffset 凹凸偏移:输入使用灰阶高度贴图(Height Texture)链接高度Height输入引脚提供深度信息;输出链接至贴图UVs输入引脚实现凹凸信息输出。

【C】Comment注释板:节点注释板,用以归类节点。

【D】Divide除法:接受两个输入,将第一个输入除以第二个输入,并输出结果。

【E】Power幂强化:幂函数节点。

【F】MaterialFunctionCall材质函数调用:使用来自另一材质或函数的外部材质函数。

【I】if比较节点:比较两个输入,然后根据比较的结果传递其他三个输入值中的一个。

【L】LinearInterpolate线性差值:根据用作蒙版的第三个输入值,在两个输入值之间进行混合。

【M】Multiply乘法:接受两个输入,将它们相乘,然后输出结果。

【N】Normalize归一化:计算并输出其输入的归一化值。归一化矢量(也称“单位矢量”)的整体长度为1.0。这意味着输入的每个分量都除以矢量的总大小(长度)。

【O】OneMinus一减:接受输入值“X”并输出“1 - X”。此操作逐通道执行。

【P】Panner平移:输出可用于创建平移(或移动)纹理的 UV 纹理坐标。

【R】ReflectionVector反射矢量:该值表示通过表面法线反射的摄像机方向。ReflectionVector通常用于环境贴图,其中反射矢量的x/y分量被用作UV输入立方体贴图纹理。

【S】ScalarParameter标量参数:输出单个浮点值 (Constant常量),这个值可在材质实例中访问和更改,或者由代码快速访问和更改。

【T】TextureSample纹理采样:输出纹理中的颜色值。贴图用。

【U】TexCoord纹理坐标:UV节点。UV倍率设置必须是2次幂。

【V】VectorParameter矢量参数:与 Constant4Vector功能相同,可在材质实例中以及通过代码来修改的参数。

【1】Constant常量:输出R单个通道浮点值,可以设定为一个目标的单通道输入值。

【2】Constant2Vector常量2矢量:输出RG两个通道浮点值。

【3】Constant3Vector常量3矢量:输出RGB三通道浮点值。

【4】Constant4Vector常量4矢量:输出RGBA四通道浮点值。

AppendVector:低维到高维向量

Mask:蒙版组件,可以指定选择输出多个通道中的几个

使用贴图制作PBR材质

使用fbx模型贴图制作PBR材质

贴图通道对应参数关系:

diffuse/baseColor贴图 — BaseColor

normal贴图 — normal

occlusion_roughness_metal贴图(复合贴图) — AO 、 Roughness 、 metallic(标准顺序)

diffuse固有色贴图以及复合贴图取消勾选sRGB,其他默认设置

normal贴图的纹理界面设置

请添加图片描述
导入时不新建材质和纹理,手工创建材质

转换参数将贴图作为实例化的可配参数

使用lerp控制粗糙度为0~1可配参数

使用SubStance Painter等材质软件导出模型贴图并制作PBR材质

文件 - 导出贴图 - 匹配 - UE4 packed (标准的通道顺序)

将贴图导入UE4引擎,使用贴图创建材质

玻璃&水材质制作(初级)

玻璃

材质域:表面, 混合模式:半透明, 折射模式(Refraction):折射率

玻璃的基础属性:基础色偏浅蓝,高金属度,低粗糙度,标准折射率1.53

使用Fresnel菲涅尔节点过渡:表面入射点到相机向量 和 该点法线向量的夹角越大,亮度越大;夹角越小亮度越暗
请添加图片描述
请添加图片描述

基础属性设置与玻璃接近

折射模式(Refraction):像素正常偏移

Normal贴图Multiply放大,增强水面波纹效果

UV divide进行放大

使用panner修改UV坐标使水波纹动起来

使用lerp将两个UV移动的normal叠加,实现不同方向的水面波动效果
请添加图片描述

角色皮肤、毛发材质制作(初级)

人物皮肤

基于父材质创建实例便于调整

着色模型:次表面轮廓(专为皮肤设计);次表面轮廓profile

启用伯力算法(Burley Normalized)

高光(Dual Specular)

NormalMap贴图

粗糙度贴图

人物毛发

混合模式:遮罩

着色模型:头发 双面

人物眼球(可以迁移epic digital human工程的眼球)

材质函数

材质函数 是材质图的一些小片段,它们可以保存在包中,并在多个材质之间重复使用。

对单个函数的编辑会传遍使用该函数的所有网络

在材质编辑器中可以像编辑普通材质一样编辑函数,但是在可以使用哪些节点方面存在一些限制。正确使用函数可降低材质冗余度

创建材质函数完成后,应该将其发布到材质函数库,以方便创建材质期间进行访问。材质函数库是材质编辑器中的一个窗口,其中包含经过分类且可过滤的可用材质函数列表

发布到库: Expose to Library 属性被设置为 True

材质函数列表:
请添加图片描述

材质UV计算技巧

uv两通道渐变数值0-1,通过基础运算可以得到矩形渐变,环形(极坐标)渐变,棋盘格等效果

UV计算常用节点

重映射范围:remap

其他范围控制类节点:abs ceil claimp min max

向量计算:normalize mask

过渡节点:线性插值lerp

基本数学计算节点:multiply divide add sub 1-x power

三角函数:正反切atange+uv = 极坐标渐变 正余弦sin cos

分数节点:取小数frac 四舍五入round

法线坐标节点:顶点法线vertexNormal 像素法线pixelNormal

坐标系变换:transfomVector,用于屏幕材质

材质动画节点:panner time flipbook

time节点结合不同曲线,接材质世界位置偏移属性,产生材质动画效果

波形曲线sin cos

x y轴一个sin 一个cos — 圆周运动
请添加图片描述
折形线frac
请添加图片描述

材质常用属性设置&节点

【属性】材质lighting mode

无光照常用于自发光材质

subsurface即3s材质,常用于皮肤、玉石、蜡烛等

【属性】Translucency Volume

surface forwarding:前向渲染,效果最好开销最大

Volumetric NonDirection:不会使用法线,光照无方向

Volumetric Direction:会使用法线,光照有方向

Volumetric PerVetex NonDirection、Volumetric PerVetex Direction:性能最cheap的方式

【节点】feature Level Switch节点

ES为移动平台,SM为PC等高性能平台,用于区分平台优化性能

【节点】time节点实现简单的材质动画效果,常用于light function

【节点】panner节点对UV平移

【属性】半透明材质render after DOF选项,在景深后渲染

常用于解决材质不受sequencer焦距影响的问题

【属性】曲面细分Tessellation

PN三角形相对于Flat Tessellation在细分时会进行平滑

常结合displacement(置换贴图)使用

置换贴图 —> world displacement

Tesselation multiplier —> 曲面细分强度参数化

【属性】UE4的PBR:金属度Metalic一般非黑即白,一般结合粗糙度Roughness调整高光,不用高光specular

【属性】3s材质中opacity含义有变,表示通透度,即光线穿透后散射的颜色及强弱

【节点】vertex normal iws节点:顶点法线转世界坐标

【节点】fresnel function节点:菲涅尔现象材质函数

【属性】法线贴图一般RG通道有信息,B通道表示强弱

【属性】PBR纹理一般可以把AO,金属度,粗糙度****放在一张贴图的不同通道(复合贴图),通过mask节点获取

【节点】嵌套使用blend corrected normal节点可以叠加多张normal map

【节点】材质函数使用input节点输入参数,make material attrs节点打包输出参数,主材质使用use material attrs解决材质函数单个输出端的问题,多级材质函数使用break material attrs节点接收上一级材质函数的输入

【节点】使用材质函数实现分层材质中的材质layer,使用material blend standard节点进行分层材质混合(地形分层材质中使用landscape开头的blend节点)

【节点】Dither temporalAA节点常用于蒙版半透明,各向异性效果(金属拉丝/头发高光)、风格化等场景

使用masked材质域 + Dither temporalAA实现半透明材质能减少性能消耗,关键属性opacity mask
请添加图片描述

后处理材质基础

关于后期处理的重要基础知识

材质模式设置为postprocess

Scene texture节点:

texture-id选择渲染后的不同信息,如PostprocessInput,输出4维数据

texture-id选择normal能够获取方向信息

R(X)G(Y)B(Z)选择场景中的不同方向面

texture-id选择scene depth获取场景深度信息

divide一个常数参数控制深度

blend position参数控制调色时机

GPU Visualizer窗口:ctrl + shift +‘ ,’ 调出窗口展示如何渲染一帧

材质details中搜索blend

一般选择before tonemaping,在后期盒子调色之前混合后处理材质,避免抖动

后期排序

场景中多个后期盒子叠加,可以设置优先级

blend position设置的渲染管线顺序>后期优先级设置

后期盒子中添加了多个后处理材质,材质会按先后顺序计算并叠加

custom depth /stencil扣图后期

模型的Render CustomDepth Pass选项
请添加图片描述
buffer视口:Lit - BufferVisualizer 选择各个GBuffer通道查看

选择custome depth可以查看勾选了Render CustomDepth Pass选项的模型

实例1 - 场景调色

按深度上色:取深度信息的一个通道作为alpha, 对场景进行后期调色

使用黑色和场景后处理输出lerp叠加,实现恐怖效果

请添加图片描述
用深度驱动曲线分层上色:Curve + Curve Atlas

新建线性颜色曲线:Miscellaneous - Curve - curveLinearColor,设置颜色曲线分布

新建曲线图集:Miscellaneous - Curve Atlas(曲线管理工具),关联颜色曲线

材质中CurveAtlasRowParameter节点,深度信息作为CurveTime输入,曲线输出和后处理输出叠加后给EmissiveColor
请添加图片描述
实例2 - 扰动和模糊

根据水normal+噪波图纹理扰动UV,实现屏幕水波纹效果
请添加图片描述
一些屏幕相关节点:

Field Of View / Screen Resolution屏幕大小信息

Screen Postion屏幕空间位置

Screen Aligned UV屏幕空间UV

CheapContrast对比度调节

使用DitherTemporalAA节点叠加UV实现噪波模糊效果

DitherTemporalAA节点每一个像素介于0-1之间波动,带透明效果

UV坐标sub0.5后和DitherTemporalAA相乘实现飞奔时的屏幕模糊效果
请添加图片描述
实例3 - 描边

法1:SceneTexture-Normal通道 + 卷积(相邻像素的法向量距离越大,叠加颜色越明显)

法2:SceneTexture-Depth通道 + 卷积(相邻像素的深度值距离越大,叠加颜色越明显)
请添加图片描述
实例4 - CustomDepth/CustomStencil抠图处理

CustomDepth抠图高亮

使用SceneTexture-CustomDepth通道叠加颜色后和后处理输出叠加

场景中勾选了Render CustomDepth Pass选项的所有物体将被高亮
请添加图片描述CustomDepth Stencil指定场景物体,不同颜色高亮

项目设置里custom Depth-Stencil Pass选择Enabled with stencil

模型中cutomDepth stencel value参数设置不同值

后处理材质中使用SceneTexture-CustomDepth通道获取,用if节点判断值区分物体
请添加图片描述
实例5 - 蓝图中控制后期材质,如高亮或描边

法1、MPC(材质参数集)

MPC创建:Materials - Material Parameter Collection

后期材质中拖入MPC,使用MPC中的参数替代原参数

任意蓝图中可以直接指定MPC并修改参数:

set vector parameter value(3维的参数)

set scaler parameter value(1维的参数)

MPC是全局参数集,若多个蓝图同时修改该参数集会有竞争问题,此时应该使用MID方法

法2、MID(动态材质实例)

蓝图中添加postprocess组件, 用box包裹该组件可控制后处理影响范围

Construct Script中指定后处理材质create dynamic material并保存(隐藏的有点深。。如下图)

设置postprocess组件中的material为保存的动态材质实例
请添加图片描述
蓝图中修改动态材质实例的参数,节点名与MPC相同:

set vector parameter value(3维的参数)

set scaler parameter value(1维的参数)
请添加图片描述
蓝图控制节点补充:控制模型的customDepth参数

set custom depth stencil value节点:设置stencil value

set render custom depth节点:设置Render CustomDepth Pass选项
————————————————
版权声明:本文为CSDN博主「Ctrlturtle」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hechao3225/article/details/113530401

  • 9
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值