第7章 材质与着色器进阶
在Unreal Engine 5中,材质和着色器是创建逼真视觉效果的核心。本章将深入探讨UE5材质系统的高级特性,包括PBR材质、着色器模型、材质函数、后处理效果等。
7.1 PBR材质系统深入
基于物理的渲染(PBR)是现代游戏引擎的标准渲染技术,UE5的PBR系统提供了丰富的控制选项。
7.1.1 PBR核心原理
PBR的核心原理是基于真实世界的物理规律来模拟光照与材质的交互:
- 能量守恒:反射光的能量不能超过入射光的能量
- 微表面理论:物体表面由无数微小的平面组成
- 菲涅尔效应:视角变化时反射率的变化
- 几何遮蔽:微表面之间的相互遮挡
7.1.2 UE5的PBR材质通道
UE5的PBR材质系统包含多个通道,用于控制材质的不同方面:
- 基础颜色 (Base Color)
- 定义物体的固有颜色
- 线性空间(sRGB纹理会自动转换)
-
取值范围:0-1
-
金属度 (Metallic)
- 控制物体的金属特性
- 0 = 非金属,1 = 金属
-
通常使用黑白纹理或常量值
-
粗糙度 (Roughness)
- 控制物体表面的粗糙程度
- 0 = 完全光滑,1 = 完全粗糙
-
影响高光的大小和模糊度
-
法线 (Normal)
- 模拟表面的微观细节
- 使用法线贴图(切线空间或对象空间)
-
增强视觉细节而不增加多边形数量
-
环境光遮蔽 (Ambient Occlusion)
- 模拟角落和缝隙的阴影
- 通常与基础颜色相乘
-
可通过纹理或烘焙生成
-
高度 (Height)
- 控制表面的高度信息
- 用于视差映射或位移映射
-
可以生成更真实的深度感
-
自发光 (Emissive)
- 使物体发光
- 不受场景光照影响
-
可用于灯光、屏幕、特效等
-
不透明度 (Opacity)
- 控制物体的透明度
- 配合混合模式使用
- 0 = 完全透明,1 = 完全不透明
7.1.3 高级PBR材质设置
- 混合模式 (Blend Mode)
- Opaque:不透明(默认)
- Masked:遮罩透明
- Translucent:半透明
- Additive:加法混合
-
Modulate:调制混合
-
着色模型 (Shading Model)
- Default Lit:默认光照模型
- Unlit:无光照
- Subsurface:次表面散射(皮肤、蜡等)
- Subsurface Profile:高级次表面散射
- Clear Coat:清漆效果(汽车、家具等)
-
Thin Translucent:薄透明效果(玻璃、纸张等)
-
双面材质 (Two Sided)
- 启用后渲染物体的两面
-
适合薄物体(如纸张、叶片)
-
深度偏移 (Depth Bias)
- 调整材质的深度值
- 解决Z-fighting问题
7.2 材质编辑器高级功能
UE5的材质编辑器提供了强大的功能,用于创建复杂的材质效果。
7.2.1 材质图表优化
- 节点组织
- 使用文件夹分组相关节点
- 保持图表的清晰和整洁
-
使用注释说明复杂逻辑
-
节点复用
- 使用材质函数复用常用逻辑
- 使用常量表达式减少重复节点
-
使用参数化材质
-
性能优化
- 减少纹理采样次数
- 避免复杂的数学运算
- 使用纹理数组代替多个单独纹理
7.2.2 参数化材质
参数化材质允许在不修改材质本身的情况下调整材质属性:
- 创建参数
- 在材质编辑器中点击"添加参数"按钮
- 选择参数类型(常量、纹理采样等)
-
命名参数
-
使用参数
- 将参数节点连接到材质属性
- 在实例化材质中调整参数值
-
支持实时预览
-
参数集合
- 创建参数集合:右键点击内容浏览器→材质→参数集合
- 添加共享参数
- 在多个材质中使用
- 统一调整所有使用该参数的材质
7.2.3 材质实例
材质实例是基于基础材质创建的可调整版本:
- 创建材质实例
- 右键点击基础材质→创建材质实例
- 命名实例
-
编辑实例参数
-
材质实例的优势
- 减少重复材质
- 统一管理材质属性
- 提高渲染性能
- 支持实时调整
7.3 高级材质效果
7.3.1 视差映射 (Parallax Mapping)
视差映射通过高度贴图模拟表面的深度感,创造更真实的3D效果。
- 实现视差映射
- 准备高度贴图
- 在材质图表中添加"Parallax Mapping"节点
- 连接高度贴图和相关参数
-
调整视差深度参数
-
高级视差技术
- 浮雕视差映射 (Relief Parallax Mapping)
- 遮挡视差映射 (Occlusion Parallax Mapping)
- 分层视差映射 (Layered Parallax Mapping)
7.3.2 次表面散射 (Subsurface Scattering)
次表面散射用于模拟光线穿过半透明物体的效果,如皮肤、蜡、大理石等。
- 使用Subsurface着色模型
- 将材质的着色模型设置为Subsurface
- 调整次表面颜色和散射半径
-
配合法线和高度贴图
-
使用Subsurface Profile
- 创建Subsurface Profile资产
- 设置详细的散射参数
- 在材质中引用Profile
7.3.3 清漆效果 (Clear Coat)
清漆效果用于模拟物体表面的透明涂层,如汽车、家具、塑料等。
- 实现清漆效果
- 将材质的着色模型设置为Clear Coat
- 调整清漆强度和粗糙度
- 配合基础材质使用
7.3.4 程序化材质
程序化材质使用数学函数生成纹理,无需外部图像文件。
- 常用程序化节点
- Perlin Noise:生成自然的随机图案
- Voronoi:生成细胞状图案
- Checkerboard:生成棋盘格图案
-
Fractal:生成分形图案
-
创建程序化材质
- 组合多个程序化节点
- 调整参数控制效果
- 用于地形、水面、皮肤等
7.3.5 动态材质
动态材质允许在运行时修改材质属性:
- 使用蓝图修改材质实例
- 获取材质实例引用
- 使用"Set Scalar Parameter Value"节点修改数值参数
- 使用"Set Vector Parameter Value"节点修改颜色参数
-
使用"Set Texture Parameter Value"节点修改纹理参数
-
动态材质的应用
- 角色受伤效果
- 环境变化(如季节、天气)
- 交互式UI元素
7.4 着色器编程
对于需要更高级控制的情况,UE5允许直接编写着色器代码。
7.4.1 材质表达式与HLSL
UE5的材质节点在底层会转换为HLSL(High Level Shading Language)代码:
- 自定义材质表达式
- 使用"Custom"节点编写HLSL代码
- 定义输入和输出参数
-
实现自定义逻辑
-
HLSL代码示例
hlsl // 简单的渐变效果 float2 UV = GetDefaultUV0(); return float4(UV.x, UV.y, 0.0, 1.0);
7.4.2 自定义着色器
对于更复杂的需求,可以创建自定义着色器:
- 创建着色器文件
- 在Source文件夹中创建.usf(Unreal Shader File)文件
- 编写顶点着色器和像素着色器代码
-
编译和测试
-
使用自定义着色器
- 在材质中引用自定义着色器
- 通过参数控制着色器行为
- 用于特殊效果或性能优化
7.4.3 着色器模型
UE5支持多种着色器模型,影响材质的功能和性能:
- SM5:DirectX 11着色器模型
- SM6:DirectX 12着色器模型,支持更多高级功能
- 移动着色器模型:针对移动平台优化
7.5 后处理材质
后处理材质用于修改整个场景的最终渲染效果。
7.5.1 后处理材质基础
- 创建后处理材质
- 右键点击内容浏览器→材质→后处理材质
- 设置材质属性
-
编写后处理逻辑
-
后处理材质的特点
- 全屏效果
- 可以访问场景颜色、深度、法线等缓冲区
- 影响整个场景的渲染
7.5.2 常用后处理效果
- 颜色校正
- 调整亮度、对比度、饱和度
- 使用LUT(查找表)进行颜色分级
-
模拟电影风格
-
景深 (Depth of Field)
- 模拟相机的景深效果
- 聚焦于特定距离的物体
-
前景和背景模糊
-
** bloom**
- 模拟明亮物体的光晕效果
- 增强视觉冲击力
-
可用于光源、爆炸、魔法效果等
-
运动模糊 (Motion Blur)
- 模拟快速运动物体的模糊效果
- 增强运动感
-
可通过参数控制强度
-
镜头特效
- 镜头耀斑(Lens Flare)
- 色差(Chromatic Aberration)
- 噪点(Film Grain)
- 暗角(Vignette)
7.5.3 实现自定义后处理效果
- 访问场景缓冲区
- 使用SceneTexture节点访问场景数据
-
可访问的缓冲区:场景颜色、深度、法线、运动矢量等
-
后处理材质节点
- SceneTexture:获取场景纹理
- PostProcessInput0:获取前一阶段的后处理结果
- ScreenPosition:获取屏幕坐标
-
PixelNormalWS:获取像素的世界空间法线
-
创建自定义后处理体积
- 在场景中添加后处理体积
- 设置影响范围和优先级
- 应用自定义后处理材质
7.6 性能优化
7.6.1 材质性能分析
- 使用材质复杂度视图:在视口中显示材质的复杂度
- 查看着色器指令数:在材质编辑器中查看指令数
- 使用性能分析工具:如Stat Unit、Stat Material等
7.6.2 材质优化技巧
- 纹理优化
- 使用合适的纹理分辨率(2的幂次)
- 选择适当的压缩格式
- 合并纹理(如使用纹理图集)
-
减少纹理采样次数
-
着色器优化
- 简化材质图表
- 减少数学运算
- 避免条件分支
-
使用纹理查找代替复杂计算
-
渲染优化
- 使用合适的着色器模型
- 启用材质实例
- 减少透明材质的使用
- 使用距离场代替复杂几何体
思考与练习
- UE5的PBR材质系统包含哪些主要通道?它们的作用是什么?
- 如何创建参数化材质和材质实例?它们有什么优势?
- 什么是视差映射?如何实现高级的视差效果?
- 次表面散射和清漆效果适用于哪些场景?如何实现?
- 什么是程序化材质?常用的程序化节点有哪些?
- 如何在运行时修改材质属性?
- 什么是后处理材质?常用的后处理效果有哪些?
- 材质性能优化的技巧有哪些?如何分析材质性能?