【UE引擎】(三)材质基础
一. 三维渲染
- 在进行三维渲染时,渲染的主要任务职责是用逼真的色彩还原真实世界的光照信息
- 渲染任务一般分为:网格渲染与阴影渲染
- 但伴随计算机硬件发展,也发展出了多种多样的渲染方式,如顶点渲染,前向渲染,延迟渲染等
- 图像渲染大概经过了四个阶段:
- 应用处理阶段
- 几何处理阶段
- 光栅化阶段
- 像素处理阶段
- 将三维数据进行透视投递到 2D 屏幕,最重要的就是光照计算部分
- 现实世界的光照复杂,一般光从发射点开始,向外进行扩散,遇到物体后将会出现反射,从而出现漫反射现象
- 被弹射的光将会继续传递,从而导致整个空间变得明亮
1.1 顶点光照渲染
- 顶点光照渲染:所有光源照明都在物体顶点上进行模拟计算
- 优点:最快的渲染方式,具有广泛的硬件支持
- 缺点:因为光照都是在顶点上计算的,此渲染不支持大部分的逐像素渲染效果(如:阴影,法线贴图,灯光遮罩,高精度高光等)
1.2 正向渲染
- 正向渲染:影响物体的最亮的光源使用逐像素光照渲染,最多支持 4 个点光源以逐顶点光照渲染方式计算,其他光源将会用球面调和(顶点计算,不支持投影遮罩,发现贴图)方式计算,速度快,但只能得到近似值
- 优点:计算方式简单,硬件内存消耗低,实现速度快,并且效果接近真实效果
- 缺点:最多支持 4 个光源数量,且每个光源都需要一个渲染通道,附加的通道无法产生阴影
- 应用场景:微型终端,移动端多采用此种渲染模式,提升效果的同时,降低了功耗
1.3 延迟渲染
- 延迟渲染:(虚幻使用的是这个)能够实现光线和阴影的渲染路径,对光源数量没有严格上限要求,采用逐像素方式评估光线,这意味着光线全部将会以正确的方式和物体交互,所有信息都可以缓存,所有光线均可产生阴影
- 优点:
- 光照开销与屏幕的光线尺寸成正比,不用担心光线所照射的物品数量,少量光线等价于廉价的花费
- 所有的光线的光照采用按像素为计算分割单位来计算(不会有在大规模三角形情况下光照计算,使计算性能发生崩溃的情况发生)
- 缺点:
- 没有实时抗锯齿支持
- 延迟光照不能处理半透明物体,也不能用在那些使用前向渲染的物体上
- 有限的光照模式支持(Blinn-Phong),所有光照以同样的方式计算,不能够在不同的物体上采用完全不同的光照模式
- 没有对接收阴影特征的支持和对光线遮罩剔除有限的支持
- 硬件要求高,并且要求有较高的显卡数据带宽(由于会产生 GBUFFER 深度法线颜色),最终材质将他们的属性写入到 Gbuffers,光照读取材质每个像素属性,进行光照处理
二. 可编程渲染
2.1 Mesh
- 在三维空间中记录了位置信息,在渲染时主要提供了与计算光照的交互关系数据
- 渲染时,计算机收集模型顶点数据,将材质信息与顶点数据结合,通过光照算法,投射到屏幕中
- 模型在制作过程中应该更多考虑制作面数问题,对于计算机来说,收集顶点数据,以三角面为绘制动作单元,面数越多,渲染压力越大
2.2 材质和纹理贴图
- 材质:是物体在空间中被渲染的颜色载体,它承载了几何体的外观样式,并且可以通过材质定义物体的表面类型
- 工作方式:
- 当场景中的灯光照射到物体表面时,材质可以用来计算光照射后物体表面如何与光进行互动
- 通过材质输入数据 (基础色贴图,法线,高光,金属,粗糙等)加逻辑计算(一般是数学计算式),外加材质本身继承的属性,最终输出材质的表现方式
- 材质是一套预设好的计算像素颜色的逻辑,引擎提供标准的渲染模型,只需要完成在渲染开始之前的颜色调整,即可实现非常棒的效果
- 纹理贴图:是用来记录色彩信息的数据载体
- 一般会用纹理贴图来装载除颜色,包括高光,金属,法线,粗糙,蒙板等数据信息
- 纹理是三维渲染输入数据的主要来源,在进行真实光照模拟时,如果只知道光照角度、强度,而不知道模拟物体表面特性,纹理贴图则会提供特性数据来源
- 纹理贴图制作中的长宽尺寸一般是 2 的幂次方
- (个别渲染硬件支持非 2 的幂次方,但是大都支持 2 的幂次方)
- 虚幻中,要求纹理必须产出 2 的幂次方
- 在向显卡传递数据时,非 2 的幂次方纹理会被转换为2的幂次方(虚幻在资产预处理阶段已经将纹理进行了转换),但这非常浪费时间
- UV:表示纹理贴图上每个像素点的位置信息
- 把 2D 纹理引用到 3D 模型上,需要设定贴图的循环模式(平铺)
- 均匀 UV 将是一张标准坐标系,左上角为(0,0)点,右下角为(1,1)点
- 纹理与 UV 相互配合
- UV 决定了纹理中像素在三维模型上的位置,而 UV 数据存在于模型上
- 在制作美术模型中,将模型完成后必须要进行 UV 展开,以便进行纹理制作
2.3 PBR 材质
- Physical Based Rendering(PBR):基于物理的渲染
- 基于物理的材质最重要的输入包括:“金属色 Metallic”、“高光度 Specular” 和 “粗糙度 Roughness”(金属色)(高光度) (粗糙度)
- UE 的 PBR 材质系统中引入了各种 BRDF 理论模型
- BRDF 双向反射分布函数(Bidirectional Reflectance Distribution Function)是建立在光学物理与计算机图形学的基础上的用于描述光反射现象的数学模型
- 而业内常说的 PBR 流程,通俗来说就是制作 3D 模型的全过程,包括以下 6 个步骤:
- 制作中低模:是为了让模型的造型和比例更准确的贴合原画,通常在 Maya、3DMax 等美术建模软件中完成中低模雕刻(因为模型细节少、面数少,称之为中低模)
- 制作高模:将中低模放进 Zbrush 中雕刻细节,因为细节的添加致使面数的增加,从而让模型品质提升,称为高模(高面数不等于高模,高面数+高品质=高模)
- 将高模拓扑为低模:高模有着很高的戏份级别,因而无法放进引擎进行流畅的渲染,需要进行减面处理,也即拓扑:连续改变布线形状,保留高模细节的同时,将复杂的布线简单化,从而产生的一个低模
- 展 UV:将复杂的模型平展开来,常用的软件包括 Unfold 3D 等
- 烘焙法线贴图:将高模的雕刻信息表现在低模上,常用的软件包括 Substance Paninter 等
- 贴图绘制:为模型材质锦上添花,常用的软件包括 Photoshop、Mari、Quixcl SUITE、Substance Paninter 等
2.4 Shader Language
- 着色器语言(Shader Language)也叫着色语言,是一类专门用来为着色器编程的编程语言
- Shader 目前主要有三种语言:
- 基于 OpenGL 的 OpenGL Shading Language,简称 GLSL
- 与硬件无关的软件接口,最广泛接纳的 2D/3D 图形 API
- 基于 DirectX 的 High Level Shading Language,简称 HLSL
- 与硬件无关的软件接口,只支持 Windows 平台
- 还有 NVIDIA 公司的 C for Graphic,简称 CG 语言
- 是为 GPU 编程涉及的高级着色器语言
- CG 极力保留 C 语言的大部分语义,并让开发者从硬件细节中解脱出来
- 有其他高级语言的优势(代码的易重用性,可读性得到提高,编译器代码优化等)
三. 虚幻材质系统基础
3.1 着色管线
- 在渲染管线中,着色器是定义每个顶点或像素应该如何渲染的程序
- 虚幻引擎中的着色器用高级着色语言(HLSL)编写
- 将着色器代码转换为 GPU 硬件可以执行的一系列汇编语言指令,最终像素颜色输出到显示器
- 虚幻引擎提供了可视化材质编辑器,材质节点在编辑完成后会被自动替换成 HLSL 代码段,并生成相应的 Shader 代码在实时渲染时使用
- 在调试过程中,编辑完节点图并保存后,即可在场景视图中看到最新的结果(所见即所得)
3.2 虚幻材质编辑器
1. 材质编辑器
2. 主材质节点
- 主材质节点将输出材质的总体外观
- 已启用输入引脚在主材质节点上是白色的,而已禁用输入显示为灰色
- 连接到已禁用输入的节点将被忽略,未从图表中的材质表达式接收数据的输入会直接设置为默认值
- Base Color:基础色
- 接受一个 RGB 颜色输入,通道值范围为 0.0 - 1.0 之间
- Metallic:金属强度
- 默认为 0,输入值范围 0 - 1
- 0 表示非金属色,1 表示为金属色
- Specular:镜面高光
- 默认为 0.5,输入值范围 0 - 1
- 用于表现非金属面上镜面反射量,在金属上没有效果
- Roughness:粗糙度
- 默认为 0.5,用来反映光线照射后所反射的光线,取值范围 0 - 1
- 0 表示平滑(是镜面反射),1 表示粗糙或漫反射
- Anisotropy:各向异性
- 各向异性(Anisotropy) 和 切线(Tangent) 都是用于控制材质的粗糙度的各向异性和光照方向
- 各向异性输入值介于 -1.0 到 1.0 之间,其中 0 表示没有各向异性效果
- 它们可用于实现材质的各向异性效果,例如金属拉丝效果。各向异性材质会默认启用,但可以通过控制台命令 r.AnisotropicMaterials. 禁用
- Emissive Color:自发光颜色输入
- 输入值是 RGB(光是有颜色的),值范围可大于 1,越高强度越大,0 为不发光
- 自发光颜色不参与实时光计算,可以使用光照探头进行光影计算
- Opacity:不透明度
- 只能在混合模式是透明的情况下使用,输入值为 0 - 1,0 为全透明,1 为不透明
- Opacity Mask:不透明蒙版
- 与透明度不同,不掺杂中间值,需要开启蒙板模式
- 此选项值取值范围0-1之间,结果表现为要么可见要么不可见
- Normal:法线
- 输入值为贴图纹理,法线主要描绘了材质上的质感层次信息,可以使得模型在不变换本身网格的前提下提供视觉凹凸感,这是通过光线计算出来的,使得物体渲染更加的真实
- Tangent:切线
- 输入允许通过纹理或向量表达式来定义光的方向性
- World Position Offset:世界位置偏移
- 允许材质在世界坐标系内操控网格体的顶点效果
- 可用于移动对象、改变形状、旋转对象和各种其他效果
- 注意这是像素偏移,而不会影响物体碰撞,只会影响渲染结果,一般应用于环境动画
- Subsurface Color:次表面颜色
- 只有在着色模型属性设为次表面(Subsurface)时,才会启用 , 该输入允许为材质添加一种颜色,以此模拟光线通过表面时的颜色变化
- 举例而言,人类皮肤的着色器通常使用一种红色的次表面颜色,来模拟其表面之下的血液。
- Custom Data :自定义数据
- 自定义数据输入是默认禁用的,只有在使用特定着色模型时才启用
- 自定义数据的插槽会根据上下文填充内容,以便支持某些着色模型的独特需求,如:
- 选择 眼睛(Eye) 着色模型, 自定义数据输入会变为 虹膜遮罩(Iris Mask) 和 虹膜距离(Iris Distance):
- 虹膜遮罩(Iris Mask):这有助于控制虹膜的折射率和深度
- 虹膜距离(Iris Distance):用于控制折射虹膜的凹度
- 选中毛发着色模型后,主材质节点会激活三种输入:
- 散射(Scatter): 此输入控制允许穿过毛发的光线散射量
- 切线(Tangent): 此输入可代替 法线(Normal) 输入,用于控制沿 U 和 V 纹理坐标的法线方向
- 背光(Backlit): 此输入控制影响毛发材质的背光量
- 启用布料着色模型后,主材质节点会激活两种新的输入:
- 绒毛颜色(Fuzz Color): 你可以通过此输入将颜色添加到材质,以模拟光通过表面时颜色的变化
- 布料(Cloth): 可以通过此输入控制 绒毛颜色 作为遮罩的强度。值为 0 表示绒毛颜色对底色没有影响,值为 1 则表示完全混合在底色上
- 用透明涂层着色模型后会在主材质上激活两种新输入:
- 透明涂层(Clear Coat):透明涂层的数量,0表 示标准着色模型,1 为全透明涂层模型。适用于遮罩
- 透明涂层粗糙度(Clear Coat Roughness):透明涂层的粗糙度。只有数值较小时,近似模拟才较为准确。如果粗糙度数值较大,虽然我们也支持,但与实际中的效果相比,可能会有误差
- Ambient Occlusion:环境遮挡
- 输入用来模拟在表面缝隙中的自阴影效果
- 通常这个输入是某种环境光遮蔽纹理贴图,而这种贴图通常在 Maya、3ds Max 或 ZBrush 等三维建模软件或 Photoshop 这类照片编辑软件中创建
- Refraction:折射率
- 输入接受一个纹理或数值参数,用于模拟表面的折射率
- 适用于玻璃、水这类材质,光在穿过这些物质时会发生折射
- 常用数据:空气 1;水面 1.33;冰面 1.31;玻璃表面 1.52 ;钻石表面 2.42
- Pixel Depth Offset:像素深度偏移
- 允许根据对象的场景深度来混合或渐变对象
- Shading Models:着色模型
- 此输入要求在材质 细节(Details) 面板中将着色模型(Shading Model)设为 基于材质表达式(From Material Expression)
- 可以在材质图表(Material Grpah)中设置逻辑,将不同的着色模型用于材质的不同部分。
- Front Material:前向材质(UE5.1新增)
3. 已启用和已禁用的输入
- 在细节面板(Details Panel) 中的以下属性决定输入已启用:
- 材质域
- 混合模式
- 着色模型
4. 材质域
- 主要用来告知引擎,在处理此材质时应按照什么方式进行处理,材质域体现了材质的处理方向
- 材质域的修改将影响材质输出节点的变化
- 表面(Surface 最常用):该设置将材质定义为将用于对象表面的东西(如金属、塑料、皮肤或任何物理表面),是最常用的设置
- 延迟贴花(Deferred Decal) :用来生产针对贴花的材质类型
- 光函数(Light Function):用来为灯光构建照射配合的材质
- 体积(Volume) :用来生产供给体积雾,烟雾,灰尘的透明体积材质
- 后处理(Post Process):后处理材质,用来为后处理体积提供配合的材质
- 用户界面(User Interface):用来生产用于在UI中交互使用的材质
5. 混合模式
- 决定了当前材质与背景已回值的颜色如何融合,这会影响效率
- 不透明(Opaque):最终颜色 = 来源颜色
- 材质将绘制在背景前面
- (这种混合模式与照明兼容)
- 已遮罩(Masked) :如果“不透明蒙版”(OpacityMask)>“不透明蒙版剪辑值”(OpacityMaskClipValue),则最终颜色为来源颜色,否则废弃像素
- (这种混合模式与照明兼容)
- 半透明(Translucent): 最终颜色 = 来源颜色 不透明度 + 目标颜色 (1 - 不透明度)
- 尽量少使用透明,会增加运算消耗
- (这种混合模式与动态照明不兼容)
- Additive: 最终颜色 = 来源颜色 + 目标颜色
- 类似PS中的线性减淡
- (这种混合模式与动态照明不兼容)
- 调制(Modulate):最终颜色 = 来源颜色 x 目标颜色
- 类似PS中的正片叠底
- 除非是贴花材质,否则这种混合模式与动态照明或雾不兼容。
- 透明度合成(AlphaComposite):最终颜色=来源色 + 目标颜色 再计算透明
- 使得透明色更亮
- 透明度维持(AlphaHoldout):允许"继续使用"材质的 alpha,在视图空间中,直接在半透明对象上显示一个孔洞
6. 着色模型
- 决定了材质输入(如自发光、漫反射、高光度、法线)如何组合以形成最终颜色,这将决定颜色产出时光照计算结果
- 计算模式固定
- 无光照(Unlit):此材质仅由“自发光”(Emissive)和“不透明”(Opacity)输入定义。它不会对光线作出反应。
- 默认光照(Default Lit):默认着色模型。完美适用于大部分实心物体。
- 次表面(Subsurface):用于次表面散射材质,例如蜡和冰。激活“次表面颜色”(Subsurface Color)输入。
- 预整合皮肤(Preintegrated Skin):用于类似于人体皮肤的材质。激活“次表面颜色”(Subsurface Color)输入。
- 透明涂层(Clear Coat):用于表面具有半透明涂层的材质,如透明涂层汽车喷漆或清漆。激活“透明涂层”(Clear Coat)和“透明涂层粗糙度”(Clear Coat Roughness)输入。
- 次表面轮廓(Subsurface Profile):用于类似于人体皮肤的材质。要求使用 次表面轮廓 才能正确工作。
- 双面植物(Two Sided Foliage):利用准确的光照和穿过表面(如树上的树叶)的光线透射来制作真实外观植物的材质。
- 毛发(Hair):用于制作逼真的头发材质,可以精确照亮发束并处理高光度。
- 布料(Cloth):用于制作逼真布料及其表面绒毛的材质。
- 眼睛(Eye):用于重新制作类人眼睛自然外观的材质。
- 单层水(Single Layer Water):允许你使用不透明混合模式实现透明水面效果。这能免去透明混合模式产生的额外材质开销。
- 薄半透明(Thin Translucent):用于基于物理原理制作玻璃的材质,例如有色玻璃或彩色玻璃。可以有效处理来自光源和有色背景对象的白色高光。
- From材质表达式(From Material Expression):用于在单一材质中处理多个着色模型。
3.3 材质表达式常用快捷键
- A - Add - “加法”材质表达式
- B - BumpOffset - “凹凸贴图偏移”材质表达式
- D - Divide - “除法”材质表达式
- E - Power - “幂”表达式
- F - MaterialFunctionCall - “材质函数”材质表达式
- I - If - “如果”材质表达式
- L - LinearInterpolate - “线性插值”材质表达式
- M - Multiply - “乘法”表达式
- N - Normalize - “规格化”表达式
- O - OneMinus - “一减”表达式
- P - Panner - “平移”表达式
- R - ReflectionVector - “矢量 WS”表达式
- S - ScalarParameter - “标量”表达式
- T - TextureSample - 纹理贴图
- U - TexCoord - “纹理坐标”表达式
- V - VectorParameter - “矢量取样”表达式
- Shift + C - Mask - 分量蒙板
3.4 材质编辑器实用操作
- 预览场景设置
- 参数默认值
3.5 常用材质节点
- Add 添加节点:叠加效果
- Subtract 减法计算:抠图效果
- BumpOffset 凹凸偏移:在不改变原有模型面数的情况下,增加贴图的视觉深度
- Multiply 乘法倍增:数值相乘、图层正片叠底
- Divide 划分除法节点:反向效果
- OneMinus 反相计算:使用不透明蒙版镂空
- Power 亮度/对比度控制:控制曝光效果
- MaterialFunctioncall 材质函数:应用自定义材质函数中的功能
- If 通道提取:
- Lerp 线性插值:Alpha值为0趋向于A,1趋向于B
- Panner 平移UV:
- ReflectionVector 全景图:传送门贴图,全景效果贴图
- CollectionParameter 材质参数集:方便统一控制管理场景中材质
四. 材质案例基础实战
4.1 制作模型描边材质(模型叠加)
成品效果:
制作思路:大于模型的发光材质与模型叠加,产生边缘发光的描边效果
4.2 制作地表混合边缘(运行时虚拟纹理)
成品效果:
制作思路:
- 启用虚拟纹理支持
- 创建运行时虚拟纹理 Matericals&Textures > Runtime Virtual Texture,一个控制材质,一个控制混合边缘的融合高度
- 给地表贴上控制材质的运行时虚拟纹理
- 在场景中放置“运行时虚拟纹理体积 Runtime Virtual Texture Volume”,设置控制材质的运行时虚拟纹理
- 在地表材质基础上,加工地表材质的运行时虚拟纹理
- 在地表物体材质基础上,加工材质的运行时虚拟纹理
- 通过控制地表物体材质中的变量 Hight、Shade 即可控制混合边缘效果
4.3 制作实时监控(渲染目标)
成品效果:
制作思路:
- 创建渲染目标 Matericals&Textures > RenderTarget ,并创建挂载场景捕获相机 SceneCaptureComponent2D 组件的蓝图(继承自 Actor)
- 修改材质域为:用户界面 User Interface,并添加渲染目标 RenderTarget
- 给屏幕赋予如上材质,便可以在运行时实时监控场景画面了
4.4 制作游戏小地图(渲染目标)
成品效果:
制作思路:
- 同理,创建渲染目标 Matericals&Textures > RenderTarget,并挂载场景捕获相机组件 SceneCaptureComponent2D 到角色蓝图
- 修改材质域为:用户界面 User Interface,并添加渲染目标 RenderTarget
- 添加UI界面,并设置图片材质
- 在关卡蓝图,运行时打印UI界面
4.5 制作模型显示在UI上(渲染目标)
成品效果:
制作思路:
- 同理,创建渲染目标 Matericals&Textures > RenderTarget,并挂载场景捕获相机组件 SceneCaptureComponent2D 到模型蓝图
- 修改材质域为:用户界面 User Interface,混合模式为:已遮罩 Masked
- 添加UI界面,添加背景图片并设置图片材质
- 在关卡蓝图,运行时打印UI界面
- 注意,因为此处我们偷懒使用了第三人称模板中的小白人作为抠像的模型,运行时需要置空 GameMode
4.6 制作场景播放视频(媒体纹理)
成品效果:
制作思路:
- 先在文件夹目录下存储视频文件,同步引擎中导入存储的视频文件(会自动创建文件媒体源,相当于:右键 > 媒体Media > 文件媒体源 File Media Sourse)
- 创建媒体播放器 Media > Media Player
- 打开刚刚创建的媒体播放器,添加视频文件到播放列表
- 创建材质球,添加媒体纹理给自发光颜色
- 在关卡蓝图中打开源
- 将材质球赋给场景中的屏幕,则运行时可播放视频
4.7 制作UI播放视频(媒体纹理)
成品效果:
制作思路:
- 在文件夹目录下存储视频文件,同步引擎中导入存储的视频文件(会自动创建文件媒体源,相当于:右键 > 媒体Media > 文件媒体源 File Media Sourse)
- 创建媒体播放器 Media > Media Player
- 打开刚刚创建的媒体播放器,添加视频文件到播放列表
- 创建材质球,添加媒体纹理给自发光颜色,并修改材质域为:用户界面 User Interface
- 创建UI控件,并设计UI,为图片赋予纹理材质
- 在关卡蓝图中打印 UI,并打开播放源
4.8 将3D场景导出为HDR全景图(立方体渲染目标)
成品效果:
制作思路:
- 创建立方体渲染目标 Matericals&Textures > Cube Render Target,放置场景捕获立方体 Scene Capture Cube,并添加纹理目标(不需要渲染到全景图的可以在场景捕获立方体的细节中取消勾选)
- 此时可以看到立方体渲染目标 Cube Render Target 里面基本已生成全景图,修改大小为2048
- HDR贴图资产导出
- 导入 PS 中微修亿下 HDR 贴图细节
4.9 制作有通透感的纹理(次表面描述文件)
成品效果:
制作思路:
- 创建次表面描述文件 Matericals&Textures > Subsurface Profile 和两个材质球(方便对比,其中一个设置着色模型为:次表面轮廓 Subsurface Profile)
- 调整次表面描述文件 Subsurface Profile 中的参数,可以明显看到有通透感
4.10 一张材质贴全身(材质图层混合)
成品效果:
制作思路:
- 创建材质
- 创建材质图层和材质图层混合
- 材质图层中
- 材质图层混合中
- 创建材质实例,可以看到图层参数,多图层通道叠加效果
- 一套材质搞定
参考资料:
亚纳虚幻学院的个人空间-亚纳虚幻学院个人主页-哔哩哔哩视频 (bilibili.com)