第7章 材质与着色器进阶

在Unreal Engine 5中,材质和着色器是创建逼真视觉效果的核心。本章将深入探讨UE5材质系统的高级特性,包括PBR材质、着色器模型、材质函数、后处理效果等。

7.1 PBR材质系统深入

基于物理的渲染(PBR)是现代游戏引擎的标准渲染技术,UE5的PBR系统提供了丰富的控制选项。

7.1.1 PBR核心原理

PBR的核心原理是基于真实世界的物理规律来模拟光照与材质的交互:

  • 能量守恒:反射光的能量不能超过入射光的能量
  • 微表面理论:物体表面由无数微小的平面组成
  • 菲涅尔效应:视角变化时反射率的变化
  • 几何遮蔽:微表面之间的相互遮挡

7.1.2 UE5的PBR材质通道

UE5的PBR材质系统包含多个通道,用于控制材质的不同方面:

  1. 基础颜色 (Base Color)
  2. 定义物体的固有颜色
  3. 线性空间(sRGB纹理会自动转换)
  4. 取值范围:0-1

  5. 金属度 (Metallic)

  6. 控制物体的金属特性
  7. 0 = 非金属,1 = 金属
  8. 通常使用黑白纹理或常量值

  9. 粗糙度 (Roughness)

  10. 控制物体表面的粗糙程度
  11. 0 = 完全光滑,1 = 完全粗糙
  12. 影响高光的大小和模糊度

  13. 法线 (Normal)

  14. 模拟表面的微观细节
  15. 使用法线贴图(切线空间或对象空间)
  16. 增强视觉细节而不增加多边形数量

  17. 环境光遮蔽 (Ambient Occlusion)

  18. 模拟角落和缝隙的阴影
  19. 通常与基础颜色相乘
  20. 可通过纹理或烘焙生成

  21. 高度 (Height)

  22. 控制表面的高度信息
  23. 用于视差映射或位移映射
  24. 可以生成更真实的深度感

  25. 自发光 (Emissive)

  26. 使物体发光
  27. 不受场景光照影响
  28. 可用于灯光、屏幕、特效等

  29. 不透明度 (Opacity)

  30. 控制物体的透明度
  31. 配合混合模式使用
  32. 0 = 完全透明,1 = 完全不透明

7.1.3 高级PBR材质设置

  1. 混合模式 (Blend Mode)
  2. Opaque:不透明(默认)
  3. Masked:遮罩透明
  4. Translucent:半透明
  5. Additive:加法混合
  6. Modulate:调制混合

  7. 着色模型 (Shading Model)

  8. Default Lit:默认光照模型
  9. Unlit:无光照
  10. Subsurface:次表面散射(皮肤、蜡等)
  11. Subsurface Profile:高级次表面散射
  12. Clear Coat:清漆效果(汽车、家具等)
  13. Thin Translucent:薄透明效果(玻璃、纸张等)

  14. 双面材质 (Two Sided)

  15. 启用后渲染物体的两面
  16. 适合薄物体(如纸张、叶片)

  17. 深度偏移 (Depth Bias)

  18. 调整材质的深度值
  19. 解决Z-fighting问题

7.2 材质编辑器高级功能

UE5的材质编辑器提供了强大的功能,用于创建复杂的材质效果。

7.2.1 材质图表优化

  1. 节点组织
  2. 使用文件夹分组相关节点
  3. 保持图表的清晰和整洁
  4. 使用注释说明复杂逻辑

  5. 节点复用

  6. 使用材质函数复用常用逻辑
  7. 使用常量表达式减少重复节点
  8. 使用参数化材质

  9. 性能优化

  10. 减少纹理采样次数
  11. 避免复杂的数学运算
  12. 使用纹理数组代替多个单独纹理

7.2.2 参数化材质

参数化材质允许在不修改材质本身的情况下调整材质属性:

  1. 创建参数
  2. 在材质编辑器中点击"添加参数"按钮
  3. 选择参数类型(常量、纹理采样等)
  4. 命名参数

  5. 使用参数

  6. 将参数节点连接到材质属性
  7. 在实例化材质中调整参数值
  8. 支持实时预览

  9. 参数集合

  10. 创建参数集合:右键点击内容浏览器→材质→参数集合
  11. 添加共享参数
  12. 在多个材质中使用
  13. 统一调整所有使用该参数的材质

7.2.3 材质实例

材质实例是基于基础材质创建的可调整版本:

  1. 创建材质实例
  2. 右键点击基础材质→创建材质实例
  3. 命名实例
  4. 编辑实例参数

  5. 材质实例的优势

  6. 减少重复材质
  7. 统一管理材质属性
  8. 提高渲染性能
  9. 支持实时调整

7.3 高级材质效果

7.3.1 视差映射 (Parallax Mapping)

视差映射通过高度贴图模拟表面的深度感,创造更真实的3D效果。

  1. 实现视差映射
  2. 准备高度贴图
  3. 在材质图表中添加"Parallax Mapping"节点
  4. 连接高度贴图和相关参数
  5. 调整视差深度参数

  6. 高级视差技术

  7. 浮雕视差映射 (Relief Parallax Mapping)
  8. 遮挡视差映射 (Occlusion Parallax Mapping)
  9. 分层视差映射 (Layered Parallax Mapping)

7.3.2 次表面散射 (Subsurface Scattering)

次表面散射用于模拟光线穿过半透明物体的效果,如皮肤、蜡、大理石等。

  1. 使用Subsurface着色模型
  2. 将材质的着色模型设置为Subsurface
  3. 调整次表面颜色和散射半径
  4. 配合法线和高度贴图

  5. 使用Subsurface Profile

  6. 创建Subsurface Profile资产
  7. 设置详细的散射参数
  8. 在材质中引用Profile

7.3.3 清漆效果 (Clear Coat)

清漆效果用于模拟物体表面的透明涂层,如汽车、家具、塑料等。

  1. 实现清漆效果
  2. 将材质的着色模型设置为Clear Coat
  3. 调整清漆强度和粗糙度
  4. 配合基础材质使用

7.3.4 程序化材质

程序化材质使用数学函数生成纹理,无需外部图像文件。

  1. 常用程序化节点
  2. Perlin Noise:生成自然的随机图案
  3. Voronoi:生成细胞状图案
  4. Checkerboard:生成棋盘格图案
  5. Fractal:生成分形图案

  6. 创建程序化材质

  7. 组合多个程序化节点
  8. 调整参数控制效果
  9. 用于地形、水面、皮肤等

7.3.5 动态材质

动态材质允许在运行时修改材质属性:

  1. 使用蓝图修改材质实例
  2. 获取材质实例引用
  3. 使用"Set Scalar Parameter Value"节点修改数值参数
  4. 使用"Set Vector Parameter Value"节点修改颜色参数
  5. 使用"Set Texture Parameter Value"节点修改纹理参数

  6. 动态材质的应用

  7. 角色受伤效果
  8. 环境变化(如季节、天气)
  9. 交互式UI元素

7.4 着色器编程

对于需要更高级控制的情况,UE5允许直接编写着色器代码。

7.4.1 材质表达式与HLSL

UE5的材质节点在底层会转换为HLSL(High Level Shading Language)代码:

  1. 自定义材质表达式
  2. 使用"Custom"节点编写HLSL代码
  3. 定义输入和输出参数
  4. 实现自定义逻辑

  5. HLSL代码示例 hlsl // 简单的渐变效果 float2 UV = GetDefaultUV0(); return float4(UV.x, UV.y, 0.0, 1.0);

7.4.2 自定义着色器

对于更复杂的需求,可以创建自定义着色器:

  1. 创建着色器文件
  2. 在Source文件夹中创建.usf(Unreal Shader File)文件
  3. 编写顶点着色器和像素着色器代码
  4. 编译和测试

  5. 使用自定义着色器

  6. 在材质中引用自定义着色器
  7. 通过参数控制着色器行为
  8. 用于特殊效果或性能优化

7.4.3 着色器模型

UE5支持多种着色器模型,影响材质的功能和性能:

  • SM5:DirectX 11着色器模型
  • SM6:DirectX 12着色器模型,支持更多高级功能
  • 移动着色器模型:针对移动平台优化

7.5 后处理材质

后处理材质用于修改整个场景的最终渲染效果。

7.5.1 后处理材质基础

  1. 创建后处理材质
  2. 右键点击内容浏览器→材质→后处理材质
  3. 设置材质属性
  4. 编写后处理逻辑

  5. 后处理材质的特点

  6. 全屏效果
  7. 可以访问场景颜色、深度、法线等缓冲区
  8. 影响整个场景的渲染

7.5.2 常用后处理效果

  1. 颜色校正
  2. 调整亮度、对比度、饱和度
  3. 使用LUT(查找表)进行颜色分级
  4. 模拟电影风格

  5. 景深 (Depth of Field)

  6. 模拟相机的景深效果
  7. 聚焦于特定距离的物体
  8. 前景和背景模糊

  9. ** bloom**

  10. 模拟明亮物体的光晕效果
  11. 增强视觉冲击力
  12. 可用于光源、爆炸、魔法效果等

  13. 运动模糊 (Motion Blur)

  14. 模拟快速运动物体的模糊效果
  15. 增强运动感
  16. 可通过参数控制强度

  17. 镜头特效

  18. 镜头耀斑(Lens Flare)
  19. 色差(Chromatic Aberration)
  20. 噪点(Film Grain)
  21. 暗角(Vignette)

7.5.3 实现自定义后处理效果

  1. 访问场景缓冲区
  2. 使用SceneTexture节点访问场景数据
  3. 可访问的缓冲区:场景颜色、深度、法线、运动矢量等

  4. 后处理材质节点

  5. SceneTexture:获取场景纹理
  6. PostProcessInput0:获取前一阶段的后处理结果
  7. ScreenPosition:获取屏幕坐标
  8. PixelNormalWS:获取像素的世界空间法线

  9. 创建自定义后处理体积

  10. 在场景中添加后处理体积
  11. 设置影响范围和优先级
  12. 应用自定义后处理材质

7.6 性能优化

7.6.1 材质性能分析

  • 使用材质复杂度视图:在视口中显示材质的复杂度
  • 查看着色器指令数:在材质编辑器中查看指令数
  • 使用性能分析工具:如Stat Unit、Stat Material等

7.6.2 材质优化技巧

  1. 纹理优化
  2. 使用合适的纹理分辨率(2的幂次)
  3. 选择适当的压缩格式
  4. 合并纹理(如使用纹理图集)
  5. 减少纹理采样次数

  6. 着色器优化

  7. 简化材质图表
  8. 减少数学运算
  9. 避免条件分支
  10. 使用纹理查找代替复杂计算

  11. 渲染优化

  12. 使用合适的着色器模型
  13. 启用材质实例
  14. 减少透明材质的使用
  15. 使用距离场代替复杂几何体

思考与练习

  1. UE5的PBR材质系统包含哪些主要通道?它们的作用是什么?
  2. 如何创建参数化材质和材质实例?它们有什么优势?
  3. 什么是视差映射?如何实现高级的视差效果?
  4. 次表面散射和清漆效果适用于哪些场景?如何实现?
  5. 什么是程序化材质?常用的程序化节点有哪些?
  6. 如何在运行时修改材质属性?
  7. 什么是后处理材质?常用的后处理效果有哪些?
  8. 材质性能优化的技巧有哪些?如何分析材质性能?