目录
PBR基础(Physically based rendering)
图形学基础知识
-
除了自发光物体,成像皆由视网膜接收物体各尺度平面反射的光线构成
-
光照效果一般可分为漫反射和镜面反射(高光)两部分
-
漫反射:凹凸不平的表面反射的没有方向性的光
-
镜面反射:若反射面比较光滑,当平行入射的光线射到这个反射面时,仍会平行地向一个方向反射出来
-
-
光源照射物体时,将会与物体产生多种交互现象,反馈大致为:
光源到达物体表面时、物体原子会将光子部分吸收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基础(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)是一种近似计算因遮蔽而造成的光线衰减的效果。通常是在标准全局光照的基础上增添细微效果,例如让角落、裂缝或其他生物变暗,以形成一种更加自然真实的视觉效果。
-
-
其他参数
-
各向异性与切线(用于金属拉丝效果)、自发光、不透明度(混合模式为半透明激活该参数)
-
[注] 具体说明详见官方文档:图形和渲染 - 材质 - 材质输入 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:蒙版组件,可以指定选择输出多个通道中的几个
使用贴图制作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选项
-
-