目录
图形学基础知识
材质和材质实例概念
动态材质实例概念
材质细节面板关键参数
PBR基础(Physically based rendering)
材质节点基础参数
材质图表的计算节点
使用贴图制作PBR材质
玻璃&水材质制作(初级)
角色皮肤、毛发材质制作(初级)
材质函数
材质UV计算技巧
材质常用属性设置&节点
后处理材质基础
除了自发光物体,成像皆由视网膜接收物体各尺度平面反射的光线构成
光照效果一般可分为漫反射和镜面反射(高光)两部分
光源照射物体时,将会与物体产生多种交互现象,反馈大致为:
光源到达物体表面时、物体原子会将光子部分吸收partially absorbed,能量守恒转化为热能,反射的部分较弱;且根据折射率具有不同角度微平面散射scattered,
穿透的部分将会产生折射Refraction、次表面散射Subsurface Scattering、半透明透射Transmission,
经过散射、微平面镜面反射的部分,称为 漫反射Diffuse,
被相对镜面反射,称为 镜面反射Specular
材质实例由材质继承而来,对父材质外观的参数化
游戏里只有父体材质会被编译,材质实例可降低渲染开销,在场景中高速渲染和实时反馈
材质资产为绿色,实例深绿色
材质中右键节点转换参数后创建实例,实例中产生配置参数,勾选后可设置
层级可以查看继承层级关系,可以直接定位到材质查看图表和细节面板,实例只有参数可配
参数化的材质 + 蓝图 = 动态材质实例
作用:在游戏运行中动态改变材质,如角色走进某个范围后某个物体切换随机颜色,或自发光等效果
蓝图继承自Actor,构造脚本中create dynamic material,并保存动态材质的变量引用
事件图表
set vector parameter value: 按材质的参数名设置值
物理材质
关联的物理材质,如碰撞产生的弹力将保留多少能力,不影响外观
应用:不同材质类型,不同反馈的实现
如:角色踩在不同材质上发出不同音效(射线检测 + 物理材质)
又如:子弹击中不同材质产生不同特效和音效(hitEvent + 物理材质)
材质域
材质的作用类型:会影响节点基础参数
表面材质域时,可设置用途Usage, 标记可控制材质应用对象的类型,引擎为每个应用程序编译特殊版本
如结合骨架网格体使用,结合粒子spirate使用等
混合模式
不透明(最常用)
遮罩Mask(部分固体可见部分不可见,如铁丝网围栏等)
细节面板参数:不透明蒙版剪切值
半透明(如玻璃类材质等)
纹理
即:材质贴图
着色模型
默认光照,大部分实心物体
次表面,如冰
预整合皮肤,用于人类皮肤
双面植物,如树上的树叶
毛发,用于逼真的头发材质
布料,用于逼真的布料和绒毛
眼睛,用于人类眼睛
双面,用于植物(法线将被翻转到背面,同时计算正面和背面的光照)
from材质表达式,用于单一材质处理多个着色模型
[注] 混合模式和着色模型详见官方文档:图形和渲染 - 材质 - 材质属性 https://docs.unrealengine.com/zh-CN/RenderingAndGraphics/Materials/MaterialProperties/index.html
模拟物理表面特性的参数化
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)是一种近似计算因遮蔽而造成的光线衰减的效果。通常是在标准全局光照的基础上增添细微效果,例如让角落、裂缝或其他生物变暗,以形成一种更加自然真实的视觉效果。
其他参数
各向异性与切线(用于金属拉丝效果)、自发光、不透明度(混合模式为半透明激活该参数)
[注] 具体说明详见官方文档:图形和渲染 - 材质 - 材质输入 https://docs.unrealengine.com/zh-CN/RenderingAndGraphics/Materials/MaterialInputs/index.html
最常用的技巧
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:蒙版组件,可以指定选择输出多个通道中的几个
使用fbx模型贴图制作PBR材质
使用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两通道渐变数值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节点结合不同曲线,接材质世界位置偏移属性,产生材质动画效果
【属性】材质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扣图后期
实例1 - 场景调色
按深度上色:取深度信息的一个通道作为alpha, 对场景进行后期调色
使用黑色和场景后处理输出lerp叠加,实现恐怖效果
用深度驱动曲线分层上色:Curve + Curve Atlas
新建线性颜色曲线:Miscellaneous - Curve - curveLinearColor,设置颜色曲线分布
新建曲线图集:Miscellaneous - Curve Atlas(曲线管理工具),关联颜色曲线
材质中CurveAtlasRowParameter节点,深度信息作为CurveTime输入,曲线输出和后处理输出叠加后给EmissiveColor
实例2 - 扰动和模糊
实例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(动态材质实例)
蓝图控制节点补充:控制模型的customDepth参数
set custom depth stencil value节点:设置stencil value
set render custom depth节点:设置Render CustomDepth Pass选项