Unity 中的着色器通过材质(Material)应用,材质将着色器代码与纹理、颜色等参数结合。理解着色器与材质的关系及性能影响因素,对优化项目渲染效率至关重要。以下是内置着色器的使用指南与性能分析:
一、着色器与材质的关系
-
核心概念
- 着色器(Shader):定义渲染逻辑(如光照计算、纹理混合),决定材质的属性和外观。
- 材质(Material):着色器的实例,存储具体参数(如纹理、颜色值),同一着色器可创建多个材质。
- Inspector 显示:材质面板显示着色器暴露的参数(如反照率、光滑度),不同着色器的参数布局不同。
-
命名规则(旧版着色器)
- Unity 5.0 前,部分旧版着色器的功能由路径和名称决定(如
Transparent/Diffuse
),修改名称可能导致功能异常。
- Unity 5.0 前,部分旧版着色器的功能由路径和名称决定(如
二、性能影响因素
着色器性能主要取决于 着色器复杂度 和 渲染路径(Rendering Path)。
1. 渲染路径的影响
- 延迟渲染(Deferred Shading):
- 物体仅渲染一次,光照计算在 GBuffer 中完成,适合多光源场景。
- 支持的着色器需兼容 GBuffer(如 Standard Shader),旧版着色器可能不适用。
- 正向渲染(Forward Rendering):
- 像素着色器(Pixel-Lit)的性能随光源数量增加而下降:
- 顶点光照(Vertex-Lit):仅计算顶点光照,无论光源数量,仅渲染一次。
- 像素光照(Pixel-Lit):主光源 + 额外光源数 = 渲染次数(如 1 个主光源 + 3 个额外光源 = 4 次渲染)。
- 像素着色器(Pixel-Lit)的性能随光源数量增加而下降:
- 顶点光照(Vertex Lit):
- 性能稳定,不随光源数量变化,适合低多边形模型或移动端。
2. 着色器复杂度排序(内置着色器)
按渲染复杂度从低到高排列:
- Unlit(无光照):仅显示纹理,无光照计算(如 UI 元素、粒子)。
- VertexLit(顶点光照):简单顶点级光照,无高光(如地形草皮)。
- Diffuse(漫反射):基础漫反射,无高光(如砖墙)。
- Normal Mapped(法线贴图):增加法线贴图采样和计算(如岩石表面)。
- Specular(高光):添加高光计算(如塑料材质)。
- Parallax Normal Mapped(视差法线贴图):视差映射增加深度偏移计算(如浮雕)。
- Anisotropic(各向异性):模拟方向依赖的高光(如毛发、拉丝金属)。
3. 移动端简化着色器
- 路径:
Mobile
类别下的着色器(如Mobile/Diffuse
)。 - 优化点:
- 移除材质颜色 tint 功能,仅使用纹理颜色。
- 法线贴图共享主纹理的平铺(Tiling)和偏移(Offset)。
- 仅支持单方向光,无逐像素高光或复杂阴影。
- 适用场景:低端设备或对画质要求不高的项目,牺牲部分效果换取性能。
三、性能优化策略
-
渲染路径选择
- 多光源场景:优先使用延迟渲染(Deferred Shading),减少像素光照的多次渲染开销。
- 少光源或移动端:使用正向渲染 + 顶点光照着色器(VertexLit),或限制像素光源数量(如 Unity 正向渲染默认支持 4 个像素光源)。
-
着色器精简原则
- 避免过度功能:
- 非必要不使用法线贴图、高光或视差映射(如普通砖块用 Diffuse 而非 Normal Mapped)。
- 用顶点光照(VertexLit)替代像素光照(如远距离植被)。
- 纹理优化:
- 减少纹理采样次数:合并多层纹理到单张图集(如反照率 + AO + 粗糙度共享 RGB 通道)。
- 使用压缩格式:移动端用 ETC2/ATC,PC 用 BC 系列,减少内存占用。
- 材质合并:
- 相同着色器和参数的材质合并,减少 Draw Call(如场景中重复的石砖材质)。
- 避免过度功能:
-
移动端特殊优化
- 使用 Mobile 着色器:如
Mobile/Particles/Alpha Blended
替代标准粒子着色器,减少指令数。 - 限制多 Pass:像素光照在移动端开销显著,尽量用烘焙光照或减少动态光源。
- 使用 Mobile 着色器:如
-
其他技巧
- GPU 实例化(GPU Instancing):对重复物体(如树木、栅栏)启用实例化,减少 CPU 提交命令的开销。
- 遮挡剔除(Occlusion Culling):对不可见物体不渲染,减少着色器计算量。
四、典型场景性能对比
场景 | 着色器选择 | 渲染路径 | 光源数 | 性能表现 |
---|---|---|---|---|
UI 界面 | Unlit/UI-Default | 正向渲染 | 0 | 高性能,无光照计算 |
低模角色(移动端) | Mobile/Diffuse | 正向渲染 | 1(顶点光) | 稳定,适合 500 面以下模型 |
室内场景(PC) | Standard Shader(PBR) | 延迟渲染 | 10+ | 高效,光照计算集中在 GBuffer |
复杂特效(如火焰) | Particles/Alpha Blended | 正向渲染 | 1(像素光) | 中等性能,需控制粒子数量 |
五、旧版着色器 vs. 现代着色器
特性 | 旧版着色器(如 Diffuse) | 现代着色器(如 Standard) |
---|---|---|
光照模型 | 经验模型(如 Blinn-Phong) | 物理基于渲染(PBR) |
多光源性能 | 正向渲染下随光源数下降 | 延迟渲染下单次渲染 |
材质参数 | 分散(如高光颜色独立调整) | 统一工作流(金属度 / 粗糙度) |
移动端适配 | 需手动优化 | 内置 Mobile 简化版本 |
未来兼容性 | 逐步淘汰,仅兼容旧项目 | 支持 URP/HDRP,长期维护 |
六、性能分析工具
- Profiler:查看 Render.Draw 模块,定位高开销的着色器和渲染路径。
- Frame Debugger:分析每帧渲染步骤,确认像素光照的渲染次数。
- ShaderLab 性能提示:编写自定义着色器时,避免复杂数学运算(如三角函数),优先使用硬件插值。
总结
选择着色器时需平衡视觉效果与性能:
- 新项目:优先使用 Standard Shader 或 URP/HDRP 着色器,利用 PBR 工作流和现代渲染路径提升效率。
- 旧项目维护:逐步迁移旧版着色器至新标准,或使用顶点光照等轻量级选项优化性能。
- 移动端:依赖 Mobile 着色器和正向渲染,限制像素光照和复杂纹理,确保帧率稳定。
通过合理选择着色器、优化渲染路径和纹理使用,可在不同平台上实现高效且美观的渲染效果。