项目主要是移动端,恶补ing..
总览与适用范围
1. 总览
UE 移动端渲染的整体框架
UE 的移动端渲染可以理解为三层选择:平台/图形 API(Android / iOS;Vulkan / OpenGL ES / Metal)→ 渲染器路径(Mobile Forward / Mobile Deferred)→ 具体功能开关(阴影、反射、后处理等)。在 UE 5.5 的“移动侧”更新中,官方明确强调 Mobile Forward 增强(包括矩形区域光、胶囊阴影、体积雾、Niagara 粒子灯、以及移动端 SSR 等)。 1
从“渲染管线”角度,移动端一帧通常仍然遵循:可见性(InitViews/剔除)→ 阴影深度(ShadowDepths)→(可选)深度预通过(PrePass)→ BasePass(输出颜色/或写入移动 GBuffer)→ 光照/阴影合成 → 半透明 → 后处理。移动端的具体 pass 结构,和 Mobile Forward / Mobile Deferred 的分叉,在 UE 的移动渲染分析文章中有较清晰的 RenderDoc 截帧与流程拆解(FMobileSceneRenderer)。 2
移动端“延迟着色”的引入,本质上是为了把“每个物体都要按灯算一遍”的成本,部分转换为“先写 GBuffer、再按屏幕算光”的成本,从而更适合“灯多/局部灯多”的场景;但它也会显著增加 Render Target、带宽与内存压力。 3 2 4
与 PC/主机渲染相比的关键差异
移动端相比 PC/主机,差异不在“概念”,而在“默认策略 + 可用硬件特性 + 可持续功耗”。
1) 硬件架构更偏 TBDR(Tile-Based Deferred Rendering)/片上 tile memory,强调“减少系统内存读写、减少过度绘制、减少不必要的 pass 依赖”。 5
2) 带宽与功耗是长期瓶颈:移动 GPU 想一直维持高性能更难,通常需要你主动把“每像素的读写/采样/分支/后处理”压下去,否则很快触发热降频。 6 7 8
3) 功能层面:PC/主机常见的“高端动态光影与反射体系”(例如大规模动态阴影、复杂 GI/反射)在移动端要么是阉割版、要么是高端机/实验性路径。UE 5.5 对移动端新增特性明显集中在“Mobile Forward 画质补齐 + 移动 SSR 打通”。 1 9 10
4) Shader 与 RT(Render Target)策略更保守:移动端的“每像素 texture bandwidth”很宝贵(含 GBuffer 写入、后处理读写、阴影/反射采样)。Arm 的优化建议里直接把“纹理带宽”作为 fragment shader 关键瓶颈之一。 8
注:原 Deep Research 在线图像轮播占位符已移除;Markdown 导出不支持该交互组件。
为什么移动端在灯光、阴影、反射上限制更多
移动端“贵”的根因,通常不是某个功能“算不出来”,而是算得出来但算不久/算不稳/算不齐:
- 带宽(Bandwidth):
灯光/反射/阴影经常意味着额外 RT、额外采样、额外读写(ShadowMap、GBuffer、SceneColor/Depth/Normal)。纹理读写一多,fragment shader 就容易“喂不饱”,性能直接被带宽卡死。 8 5 - Overdraw(过度绘制):
透明、粒子、UI、复杂半透明叠加,会把“每像素的着色次数”乘上去;Forward 路径下尤其典型,因为光照计算往往发生在物体被绘制时。Apple 直接把“最小化 overdraw、减少不必要依赖与 load/store”作为性能优化核心主题之一。 5 2 - Shader 复杂度与纹理采样:
高光/法线/清漆/多层材质/SSR/PPR 都会明显增加 ALU 和采样,且采样常常就是带宽。 8 2 - 分辨率与后处理:
大多数后处理按像素成本线性或近似线性随分辨率增长;SSR、Bloom、TAA、色调映射都属于“屏幕空间”类,分辨率一上去,成本就非常直接。 2 3 11 - 热降频与电池:
Android 官方把“热状态”视为应用潜在性能上限,并建议监控 thermal headroom 并动态下调工作负载。长时间运行(例如 10–20 分钟)比短跑 benchmark 更能暴露“灯光/反射太重导致掉帧”的真实问题。 6 7
影响移动端画面与性能的核心瓶颈(你在项目里应该怎么理解)
- 带宽:像素越多、RT 越多、采样越多 → 越容易被卡。 8
- Overdraw:透明/粒子/叠层 UI/大量重叠几何 → “同一像素重复算”。 5 2
- Shader 复杂度:材质指令数、分支、函数、清漆/复杂 BRDF、SSR/PPR → “每次算得更贵”。 8 11 2
- 纹理采样:法线、粗糙、金属、AO、反射 cubemap、阴影贴图、后处理链 → “更贵 + 更吃带宽”。 8 3
- 分辨率:屏幕空间技术成本与像素数强相关。 3 11
- 后处理:MobileHDR 打开后,后处理链条通常明显更重,但也能显著提升观感(Bloom、Tonemapper、Color Grading 等)。 2 1
- 热降频/电池:持续高功耗 = 掉频 = 帧率/稳定性下降。 6 7
2. 说明适用范围
引擎版本与“你应该默认相信什么”
- 以 UE 5.5 的官方发布描述为“功能引入依据”(例如移动 SSR、矩形区域光等),并以 5.5.4 Hotfix 作为版本落点:5.5.4 属于 hotfix,主要是修复类发布。 1 12
- 由于部分移动功能和“渲染路径/设备 profile/图形 API”强绑定,任何“是否可用”都必须拆到 Mobile Forward vs Mobile Deferred、以及 Vulkan vs OpenGL ES vs Metal 来谈。 3 4 13
目标平台与图形 API
- Android:Vulkan / OpenGL ES(GLES)都需要考虑,但 Google 明确把 Vulkan 作为 Android 的主要低层图形 API,并说明 OpenGL ES 仍支持但不再积极发展新特性;同时 Vulkan 的优势包括更低 CPU 开销、更现代的特性(含 bindless、光追等)。 14 7
- iOS:图形 API 为 Metal;移动端渲染架构高度 TBDR,强调减少系统内存流量与 overdraw。 5
- UE 在移动端提供 Mobile Forward / Mobile Deferred,并且还提供“桌面渲染器上移动端”的实验路径(通常是 Android Vulkan / iOS 高端机)。 1 3
“正式可用 / 实验性 / 不推荐 / 兼容性差”的标记规则
为方便你在项目落地做决策,下文统一使用四级标记:
- 官方支持(可量产):功能在 UE 5.5 的官方移动更新中被明确列入移动渲染能力,或在移动相关文档/配置体系中长期稳定存在,且不依赖“桌面渲染器跑在手机上”。 1 3
- 理论可行但不推荐:能跑,但成本或风险大,常见于“多一次整场景渲染”“重后处理链”“重阴影/重反射”类。 3 11 15
- 某些设备可跑但不稳定:通常与高端机、特定 GPU/驱动、特定 API(多为 Vulkan/Metal)绑定;或者 UE 明确标为 Experimental(例如移动端 Lumen)。 9 10 3
- 基本不适合量产:依赖 SM6 / 桌面级渲染器 / 大量 RT 与带宽,且在移动端缺乏官方“稳定覆盖”的预期。以 Android 为例,Arm 甚至指出 UE 默认并不官方支持 Android SM6,因此诸多桌面级特性(如 Nanite/VSM 路线)天然不该作为常规移动量产依赖。 16 17
移动端灯光体系
3. 把“灯光”拆开逐项讲(重点)
先给你一个“移动端灯光”的底层心智模型
移动端灯光要先分清两件事:
1) 光照来自哪里:
- 静态(烘焙):Lightmass → Lightmap(含方向性可选)+(可选)Volumetric Lightmap(给动态物体采样间接光)。 18 19 20 21
- 动态(实时):Directional 的 CSM 是移动端最常见的动态阴影方案;局部灯(点/聚光)通常受数量限制,且阴影支持更苛刻。 2 21 22 3
2) 你用哪条移动渲染路径:
- Mobile Forward:更“省 RT/GBuffer”,但局部灯数量与特性约束更明显;UE 5.5 在 Mobile Forward 上加了很多画质特性补齐(矩形区域光、胶囊阴影等)。 1 2
- Mobile Deferred:更容易承载“多灯/更复杂反射/更接近桌面 blending 的反射捕捉器”等,但 GBuffer 与带宽成本更高,并且在 OpenGL ES 上可能需要额外开关(r.Mobile.AllowDeferredShadingOpenGL)。 3 4 13
关键落地建议:
你在移动端做灯光,不是“能不能做”,而是“把实时部分压缩到极少数关键灯 + 把大部分质量放到烘焙/材质/后处理补偿”。
各类灯光与移动端支持:工程化对照表
下面表格以“默认移动渲染器(Mobile Forward / Mobile Deferred)”为主,不把“桌面渲染器跑在手机上”当作常规量产方案(会在替代方案/风险里单列)。 1 3 "Mobile Rendering and Shading Modes for Unreal Engine")
表内“量产级别”统一用:
S(官方支持可量产) / A(能跑但谨慎) / B(部分设备/不稳定) / C(基本不量产)
| 灯光类型 | 量产级别 | 是否支持 | 支持条件(常见硬门槛) | 渲染原理概述(移动端视角) | 性能成本主要来自哪里 | 常见画面问题 | 推荐替代方案 | 低/中/高端设备建议 | ||
|---|---|---|---|---|---|---|---|---|---|---|
| Directional Light(平行光) | S | 支持 | 常用于“主光 +(可选)CSM 动态阴影”;动态阴影通常用 CSM;级联数在移动端有上限与项目设置限制。 2 "剖析虚幻渲染体系(12)- 移动端专题 Part 1(UE移动端渲染)") 22 "Use Cascaded Shadows | Unreal Engine 4.27 Documentation") | 移动端通常“最多 1 个关键方向光”(太阳),配合 CSM 做近距离实时阴影;其余间接光依赖 Lightmap/Skylight/反射。 2 3 | ShadowDepths(渲染阴影贴图):级联数 × 阴影分辨率 × 投影到阴影里的三角形数;带宽:采样 ShadowMap;shader:每像素阴影过滤。 15 2 22 | 阴影锯齿/闪烁、Peter-panning(阴影飘)、阴影漏光、远处阴影突然消失(距离/级联配置)。 22 "Use Cascaded Shadows | Unreal Engine 4.27 Documentation") 23 | 远景用烘焙阴影+近景 CSM;对不重要物体关闭接收 CSM(Receive Mobile CSMShadows);用 Modulated Shadows(仅 Stationary 方向光)做“便宜阴影”。 22 2 | 低端:1 级联/低距离/少投射体;中端:2 级联默认;高端:可试 3–4 级联但要控距离与投射集合。 22 2 |
| Point Light(点光) | S/A(无阴影时可量产) | 支持(但限制多) | 移动端局部灯数量通常受“每物体/每像素最多影响灯数”限制,常见上限 4;默认不建议开点光阴影。 21 24 2 | Forward:多为“附加局部灯”在 BasePass/ForwardLighting 里做简化计算;Deferred:可承担更多点光(历史上可到 8 movable 点光的演示)。 3 2 | GPU/Shader:每像素对每盏灯计算;overdraw:forward 下被遮挡的像素也可能算;CPU:灯影响的物体列表/批次。 15 25 2 | 光照“断层”(超过灯数上限后灯不生效)、亮斑不稳定、不同机型衰减/高光差异。 21 24 26 | 用 Emissive 假光、用 Light Function/IES(若目标路径支持)做“少灯更像”;把点光改成聚光(阴影成本通常更低)。 1 15 24 | 低端:尽量 0–1 个近景点光;中端:控制在 2–4 且无阴影;高端:可考虑移动 Deferred + 更多点光但要控半径与叠加区。 21 3 25 | ||
| Spot Light(聚光) | S/A(有阴影时谨慎) | 支持 | UE 在移动端支持聚光照明;移动端“可动聚光阴影”历史上默认关闭,需要显式开启相关 cvar/项目设置;并受“可见阴影聚光数上限”约束。 3 2 13 | Spot shadow 通常用 2D shadow map;在移动端实现会把聚光阴影与 CSM 共享采样/图集等资源以省开销。 2 3 | ShadowDepths:额外 shadow map 渲染;带宽:额外阴影采样;shader:聚光衰减+阴影过滤;CPU:受影响物体/批次。 15 3 2 | 设备上不出阴影(开关/Quality/Permutation 问题)、阴影糊/抖、阴影被 atlas 挤压导致分辨率变化。 3 2 23 | 用无阴影聚光 + 烘焙阴影贴图/Decal/顶点 AO;用少量“关键聚光”强调主体,其余用 Emissive/反射捕捉器补观感。 2 1 3 | 低端:基本不做聚光阴影;中端:允许 1–2 个关键聚光(尽量不投影或低分辨率);高端:可做少量聚光阴影但要做设备分级。 3 6 15 | ||
| Sky Light(天光) | S | 支持 | 常与 Reflection Capture/Reflection Environment 共同决定环境镜面;Stationary/Static 更常见,移动端通常依赖捕捉的 cubemap。 3 23 | Skylight 贡献 IBL(漫反射环境光 + 镜面环境反射);移动端反射多来自 cubemap(Skylight/Reflection Capture),并可能混合 Lightmap。 3 2 | 带宽/采样:环境 cubemap 采样;shader:BRDF 计算;内存:cubemap 分辨率/数量。 2 3 | “画面发灰/没方向感”、室内漏光(Skylight 过强)、反射不对(捕捉器布置/材质粗糙度问题)。 27 2 28 | 用烘焙 AO/顶点 AO 强化接触;用分区 Reflection Capture;室内用局部 cubemap/盒体捕捉器。 27 2 3 | 低端:Skylight 静态 + 低分辨率反射;中端:合理分区捕捉;高端:可配合移动 SSR 做局部提升。 3 1 2 | ||
| Rect Light / Area Light(矩形区域光) | S(5.5 起明确支持)/A(需谨慎验证) | 支持(UE 5.5 明确列为 Mobile Forward 新增能力) | UE 5.5 官方说明 Mobile Forward 支持“rectangular area lights”。注意:这不等价于“桌面端所有 area light 特性全量”,通常仍需做设备验证与材质/阴影策略收敛。 1 | 多数实时引擎里的“Rect Light”本质是对面光源的近似(影响高光形状/衰减),而非真正面面积积分;移动端会更偏近似以控成本。 1 3 | shader:更复杂的高光形状/采样;若叠加阴影/体积雾,成本迅速上升;overdraw:forward 下被遮挡像素也可能算。 25 5 1 | 画面“高光很怪/过亮”,不同机型高光一致性差;在低端机上可能造成明显掉帧或被 device profile 直接降级。 26 6 1 | 如果目标只是“窗户亮边/软高光”:用 emissive + 反射 cubemap;用条形灯贴图(Decal)或高光假表面。 2 1 | 低端:尽量不用;中端:只放 1–2 个关键 rect light;高端:可用但要严格 profiling。 6 15 1 | ||
| Emissive 作为假光照 | S | 支持(材质级) | 需要材质管线允许 Emissive;移动端常用 Unlit/Emissive“画亮”,并用后处理 Bloom 提升“像在发光”。 2 1 | 不参与真实光照传递,但可以“直接把颜色加到最终结果”并配合 Bloom/Color Grading 形成观感;也可做假高光/边缘光。 2 1 | 很便宜:主要是材质自身的 ALU/采样;若 Bloom/TAA 开启则把成本转移到后处理。 3 6 | “像贴图在发光但不照亮场景”、夜景缺少间接光感觉;过强时会曝光/色调映射失控。 2 6 | 用烘焙(把发光贡献 bake 进 lightmap)、用局部假光(少量点/聚光无阴影)、用反射捕捉器增强镜面。 18 3 2 | 低/中/高端都建议大量使用(是移动端的“画质性价比核心”)。 2 6 |
Static / Stationary / Movable:移动端支持与差异(你必须会的“落地规则”)
- Static:直接光 + 间接光都进烘焙(Lightmap),运行时最省 GPU,但灵活性最低;移动端想要稳定 30/60fps,Static 通常是基本盘。 18 29 2
- Stationary:一般用于“灯不动但要影响动态物体一些效果”的折中;它比 Static 复杂得多(需要把静态部分与动态部分组合),社区回答也强调 Stationary 的实现复杂度更高。 24 3
- Movable:完全实时,移动端最贵;如果再叠加阴影,则成本通常呈“乘法上升”。 15 6 2
一个非常工程化的结论:
在移动端,你要把 Movable 当作“稀缺资源”。把“光会动”当作玩法需求,而不是默认美术需求。
Lightmass / 烘焙 / Lightmap / Indirect Lighting / AO:移动端最核心的“主力方案”
Lightmap 是移动端“长期稳定画质”的底座:UE 文档摘要明确指出 Lightmap 主要用于“静态网格的 baked/precomputed lighting”。 18
Lightmass(Epic Games 体系内的预计算光照工具)负责生成:
方向性 Lightmap(Use Lightmap Directionality):移动端可以选择是否让 Lightmap携带方向性(允许结合每像素法线获得更立体的凹凸感)。官方移动性能建议摘要明确说:开启会更真实但更贵;关闭会更“平”但更便宜。 21 2
Volumetric Lightmaps(给动态物体“采样间接光”):
- UE 的发布日志介绍了:Volumetric Lightmaps 用砖块与采样点覆盖 Lightmass Importance Volume,并在 GPU 上插值到任意位置,从而让角色/粒子等动态物体能获得低成本的预计算光照“落地感”。 19
- 社区在“移动端不工作”的排查中也确认 Volumetric Lightmaps 在移动端可用,并解释了常见误解:它采样的是间接光颜色而不是静态阴影投影;如果你想让静态墙体阴影影响动态物体,需要用动态 CSM 阴影(例如把投影阴影的墙变成 Movable 以走 CSM)。 20 22
压缩与内存:Lightmap 的压缩开关会显著影响包体与运行时内存。CPU Lightmass 文档摘要直接指出:禁用 lightmap 压缩可减少压缩伪影,但会让内存与磁盘体积增加约 4×。 18
动态光、逐像素光、逐顶点光、附加光数量限制(移动端“最容易踩坑”的那条线)
移动端的局部灯(点/聚光)通常有“数量上限”与“每物体可影响灯数上限”。典型案例:项目设置里很多人看到“最多 4 个 Movable 点/聚光影响”的限制,并在论坛询问是否能强推更高,说明这个限制在真实项目里非常常见。 21 24
在 UE 的移动端渲染拆解中也明确提到:Forward 路径下局部灯总数通常不能超过 4。 2
为什么移动端局部灯贵:从底层解释
- Forward 下:每个像素在绘制每个物体时就要把“会影响它的灯”算一遍;如果还有 overdraw,被遮挡像素也会算,浪费非常直接。 25 5 2
- Deferred 下:把光照从“物体空间”转移到“屏幕空间”,可以更好地处理多灯(尤其是很多小灯),但以 GBuffer 的额外 RT/带宽为代价。 3 2 4
移动端阴影类型与支持情况:CSM、距离场阴影、接触阴影、VSM 等
这里先给“结论式地图”,后面在支持矩阵里再汇总:
- CSM(Cascaded Shadow Maps):移动端方向光动态阴影主力。移动端可调“级联数上限”,默认常为 2;并且“Far Cascades + Dynamic Cascades 的总数不能超过移动端 MaxCascades 设置”。 22 2
- 按物体接收 CSM 的开关:
receive_mobile_csm_shadows(移动端专用)可以让某些组件不接收 CSM,从而减少着色成本。 22 - Spotlight 阴影(移动端):历史上“可动聚光阴影”需要显式开启,且受可见数量/分辨率/atlas 约束。 3 2
- Point Light 阴影(移动端):在移动端渲染拆解中给出很直接的原因:点光阴影需要立方体阴影贴图,而“一次 pass 渲染立方体阴影”的技术需要桌面级特性(例如几何着色器/SM5 能力),因此移动端默认不支持/不推荐。 2
- 胶囊阴影(Capsule Shadows):UE 5.5 官方明确把它列为 Mobile Forward 新增支持能力之一(常用于角色、性能相对可控)。 1
- 虚拟阴影贴图 VSM(Virtual Shadow Maps):它是面向“电影级资产、开放世界、大量动态阴影与 Nanite”设计的桌面体系;且往往与更高 Shader Model/桌面渲染路径绑定。移动量产中通常不把它当默认选项,而是视作“桌面渲染器/高端实验路径”的内容。 16 17
移动端反射体系
4. 把“反射”拆开逐项讲(重点)
先把“移动端反射”分成三类输入源
移动端反射几乎总是以下三类混合(区别在“真实度 vs 成本 vs 覆盖范围”):
1) 反射捕捉器(Reflection Capture)/反射环境(Reflection Environment):离线/静态 cubemap 为主,成本可控,是量产基石。 27 2 3
2) 屏幕空间反射(SSR / 移动端 SSR / PPR):只反射“屏幕里看得到的东西”,质量提升明显但有缺失与稳定性问题;UE 5.5 明确宣布移动端 SSR 在 Mobile Forward 与 Deferred 均可用。 1 3 11
3) 真实平面反射(Planar Reflection)/ SceneCapture 类:画质强但通常意味着“再渲染一次场景”或额外 RT,移动端很容易爆。 3 15 28
反射方案对照表(支持、原理、代价、风险、项目适配)
同样用 S/A/B/C 四级标记。
| 反射方案 | 量产级别 | 是否支持 | 支持条件(常见硬门槛) | 原理(移动端视角) | 主要性能消耗点 | 画质优缺点 | 兼容性风险 | 替代方案 | 推荐项目类型 |
|---|---|---|---|---|---|---|---|---|---|
| Reflection Capture(反射捕捉器) | S | 支持 | 放置 Sphere/Box Capture;移动端可启用“捕捉器压缩”以节省内存/带宽(默认可用 ETC2 等)。 2 28 | 预先捕捉环境为 cubemap,运行时按材质粗糙度/法线做 IBL 镜面反射;移动端常为“每物体取最近捕捉器”,可能缺少视差校正。 27 2 3 | 内存:cubemap 分辨率×数量;带宽:像素采样 cubemap;加载:反射贴图驻留。 2 8 | 优点:稳定、覆盖全局、成本可控;缺点:与真实几何不一致、动态物体不更新、室内外过渡需要精心布置。 27 2 | 不同机型纹理格式/压缩差异、某些 GPU(如 Mali + OpenGL)可能出现反射异常案例需要专项测试。 26 14 | 结合 Skylight;增加 capture 分区;在关键平面叠加移动 SSR/PPR。 3 1 | 全类型项目(写实/二次元/休闲)都应作为默认底座。 1 2 |
| Sphere / Box Reflection Capture | S | 支持 | Sphere 更适合局部、Box 更适合室内盒状空间;需要按房间/走廊分区布置,避免跨区污染。 27 2 | 同上,但用不同形状定义影响范围;移动端由于可能缺少视差校正,Box 的“空间感”不一定等于桌面。 27 3 | 同 Reflection Capture(内存/带宽/采样)。 8 2 | 常见问题:墙角反射“漂”、房间切换时反射跳变、金属过强导致“像镜子贴图”。 27 2 28 | 设备 profile 造成分辨率/压缩差;capture 过多导致内存上涨。 2 18 | 用更少 capture + 更好的材质粗糙度分布;关键镜面平面用 PPR/Planar。 11 1 28 | 室内、角色换装大厅、赛车车库等“局部环境反射强”的场景。 27 2 |
| Reflection Environment(反射环境) | S | 支持 | 依赖 Reflection Capture 与 Skylight;移动 deferred 可支持更高级的“按像素 blending”。 3 2 | 把捕捉器反射作为环境镜面项参与 BRDF;高端路径可做多 cubemap 混合提高过渡质量。 3 | 主要还是 cubemap 的内存/带宽。 8 2 | 优点:稳定;缺点:动态遮挡/动态物体反射缺失。 27 3 | Forward vs Deferred 的一致性差;OpenGL ES 下高级 blending/数组纹理能力可能受限。 3 13 14 | 用移动 SSR 做局部补足;对二次元项目可用“高光+环境贴图”解决大多数需求。 1 2 | 大多数项目默认开启(写实越依赖)。 1 2 |
| Skylight 对反射的影响 | S | 支持 | Skylight 捕捉/指定 cubemap;移动 deferred 明确支持“Skylight support for reflection”。 3 2 | Skylight 的 cubemap 是反射的重要来源,尤其当场景 capture 不够密时。 3 27 | cubemap 采样与 BRDF;间接影响曝光/色调映射。 2 6 | 室内泛蓝/泛灰、反射过统一、金属“脏”。 2 27 | 设备差异相对小,但需要做室内外分区与不同 capture。 27 2 | 室内用 Box Capture 强化;写实项目配合轻量 SSR。 1 11 | 全类型项目。 2 |
| SSR(移动端 SSR) | A(高端机量产可用,需分级) | UE 5.5 起支持 | UE 5.5 官方确认“SSR now work in both Mobile Forward and Deferred”;通常要求 Mobile HDR,且移动端 SSR 很多实现依赖 TAA 稳定画面。 1 30 2 | 屏幕空间基于 SceneColor/Depth(以及可能的法线/粗糙)追踪反射;移动端常用更受限/更高性价比的形式(例如 PPR)。 11 3 2 | 带宽:读 SceneColor/Depth/可能的中间 buffer;shader/compute:追踪/投影/修补孔洞;分辨率:越高越贵。 11 3 8 | 优点:细节真实、接触反射自然;缺点:屏幕外缺失、边缘断裂、法线粗糙导致噪点/闪烁。 11 31 | 不同 GPU 对精度/半精度、纹理格式、TAA 链路影响大;需要 device profile 分级与真机覆盖。 6 2 26 | 反射捕捉器 + 关键平面 PPR;对低端直接关闭 SSR,用材质/后处理假高光。 2 11 1 | 写实室内/车漆/水面等“需要接触反射”的项目(高端机优先)。 1 3 |
| Planar Reflection(真实平面反射:再渲染一次) | B/C | 理论可行但很贵 | 平面反射通常意味着“按反射视角再渲染一次场景”;在移动端容易直接把 GPU/带宽打满。 3 15 28 | 用反射相机渲染反射纹理,再投射到平面;画质接近镜子。 3 | 最贵点:额外一次(或近似一次)场景渲染;额外 RT;额外带宽;额外过度绘制。 3 5 | 优点:镜面正确且屏幕外也有;缺点:成本爆、容易掉帧/发热。 3 6 | 机型差异极大;一旦动态物体多就更难控。 6 15 | 用 PPR/移动 SSR 替代;或用静态 cubemap 伪反射。 11 2 3 | 仅极少数“镜子是核心玩法/卖点”的高端机项目或 Demo。 6 3 |
| Pixel Projected Reflection(PPR)/ MobilePPR | A(强烈建议在“平面反射需求”里优先于 Planar) | 支持(移动友好反射) | 需要 Mobile HDR;通过 cvar 控制 r.Mobile.PlanarReflectionMode 与 r.Mobile.PixelProjectedReflectionQuality;并依赖特定 Planar Reflection Mode(MobilePPR 等)。 3 2 28 | PPR 是受限的 SSR:把反射限定在“平面/解析反射区域”,用“反向投影/数据散射”替代昂贵的逐像素 ray-march,获得更好的性能/质量比。 11 3 2 | 主要成本:额外中间 buffer + 投影 pass + 反射 pass;仍是屏幕空间,成本随分辨率上升。 11 3 8 | 优点:比全 SSR 更稳、更便宜;缺点:只适合平面、对粗糙/非平面有限制、仍会有缺失/孔洞。 11 3 | 依赖 Mobile HDR 与设备性能分级;项目设置/模式不对时“看起来像没反射”。 28 2 6 | 反射捕捉器作为全局底,PPR 只用在水面/地面/镜面地砖等关键平面。 11 27 2 | 写实室内地面、水面、车展台等“可用平面近似”的项目。 3 11 |
| Scene Capture Cube / 2D(动态捕捉) | C | 基本不量产(移动端动态更新非常贵) | 本质是额外相机渲染;Cube 等于 6 次(或近似 6 次)视角渲染。 3 15 | 运行时更新反射贴图/RT。 | 超高 GPU + 带宽:多次渲染 + RT;还可能引入同步/依赖。 5 15 | 优点:动态真实;缺点:基本不可控。 | 兼容性不仅是机型,还常常是“发热后必崩”。 6 15 | 改为离线 bake cubemap;或用反射捕捉器静态。 27 2 | 仅 Demo/少量展示镜面物体的高端体验。 |
| Cubemap 伪反射(材质采样) | S | 支持 | 只要材质允许采样 cubemap;常用于“车漆/金属/玻璃”的稳定反射观感。 2 27 | 把环境 cubemap 当作镜面近似输入,结合粗糙度/法线做 BRDF。 2 3 | 便宜:主要是 cubemap 采样;成本随采样次数/LOD 变化。 8 2 | 容易“假”,反射与场景不一致;但可通过粗糙度与艺术调参掩盖。 27 2 | 风险小、兼容性好。 | 与反射捕捉器/Skylight 一起使用。 27 2 | 全类型项目(尤其二次元/风格化)。 |
| Lumen / 硬件光追 / 软件光追 / RT Reflections 与移动端 | B/C(视为实验/高端特化) | UE 文档摘要:移动端 Lumen 为 Experimental(高端 Android) | “Using Lumen on Mobile”摘要表述:UE 5.4+ 在高端 Android 设备上提供 Lumen 实验支持;“Lumen Technical Details”摘要也写到 Lumen 支持 Android Vulkan 并可用于 Mobile Renderer。 9 10 | Lumen 是动态 GI/反射体系,通常依赖更高计算/带宽与更复杂的场景表示;移动端仅在特定高端条件下尝试。 9 10 | 很昂贵:计算 + 带宽 + 内存;且对稳定帧率/热降频非常敏感。 6 8 9 | 画质上限高,但移动端往往要降质量/降距离;也可能遇到“看起来没 GI/没反射”的配置坑。 9 | 兼容性风险大(设备、驱动、API、机型分级)。 9 6 26 | 量产建议:以烘焙 GI + 反射捕捉器 +(可选)PPR/SSR 为主。 2 1 3 | 仅高端写实、且愿意做严格设备白名单/动态调度的项目。 6 9 |
“哪些反射方案适合量产、哪些只适合演示”的一句话结论
- 量产默认组合:Reflection Capture(分区) + Skylight + 材质正确的粗糙度/金属度分布。 27 2 3
- 高端机增强:在关键平面启用 PPR/移动 SSR 做接触反射提升(并用 device profile 分级)。 1 11 2
- 演示/非量产常见坑:动态 SceneCapture(尤其 Cube)、全场景 Planar Reflection、多处镜面大面积实时反射。 3 15 6
材质与观感补偿
5. 材质与灯光/反射的关系(反射重点)
BaseColor / Metallic / Roughness / Specular / Normal / AO:对移动端光照的实际影响
移动端的光照与反射很大一部分由“材质参数”决定,尤其是:
- Metallic 与 Roughness:决定你看见的是“漫反射”为主还是“镜面反射”为主,以及反射的清晰度/能量分配。反射捕捉器/Skylight/SSR 的观感差异,往往首先是粗糙度分布差异。 2 3 27
- Normal:决定高光与反射的细节破碎度;移动端若关闭方向性 Lightmap,会让法线在“纯烘焙环境光”下显得更平。 21 2
- AO:在移动端常被用作“廉价的接触感与间接遮蔽补偿”;因为真实 SSAO/GTAO 要额外屏幕空间计算。 3 2
- Emissive:不照亮环境,但可与 Bloom/色调映射结合,成为移动端“灯光感”的性价比核心。 1 2
为什么很多“反射问题”本质上是材质问题(重点)
移动端最常见的“反射看起来不对”,通常不是反射系统坏了,而是:
1) 粗糙度过低/过统一:
把大量表面做成“接近 0 粗糙度”的镜面,会把反射捕捉器的缺陷、SSR 的缺失边界、cubemap 的不一致全部暴露。先把 roughness 做出合理分布,反射质量会“立刻像是提升了一档”。(这是工程经验,但它与“捕捉器反射是近似、屏幕空间反射有缺失”这两个事实强相关。) 27 11 2
2) 法线尺度/细节频率不对:
过强法线会导致高光碎裂、SSR/PPR 更噪;过弱法线让反射像贴图。 11 2
3) 金属度误用(把非金属当金属):
常见于新手:把塑料/木头做成金属,导致过强镜面能量,反射“假得很明显”。(PBR 误用会把移动端近似反射的缺陷放大。) 2 27
4) 材质路径不兼容导致“移动端 fallback”:
移动端材质有功能限制(例如纹理采样器数量、部分表达式/着色模型不可用),一旦触发 fallback,观感可能与 PC 预览差很多。移动渲染分析里明确提到 ES3.1 下纹理采样器数量有限、可用着色模型更少。 2
移动端材质性能:指令数、采样数、分支、透明、双面、Clear Coat 等
移动端成本一般优先看“fragment shader 是否被带宽喂不饱”:
- Arm 的 fragment shader 优化建议明确指出:纹理会消耗大量内存带宽,带宽过量会导致 fragment shader 无法获得足够数据。 8
- 透明/Masked 材质在移动端非常贵(overdraw + late-z + blending),移动渲染分析也强调透明/Masked “极其耗性能,建议尽量不透明”。 2 5
- 采样器数量:移动端硬件限制会让你在复杂材质上更容易踩到上限(例如 ES3.1 常见限制 16 个采样器)。 2
常见工程策略:
用“Fully Rough / 降精度 / 合并贴图通道 / 减少层数 / 避免依赖纹理读取(dependent texture read)”来换稳定帧率。 2 8 5
PBR 在移动端的常见误区(专门列出)
- 误区:把“写实”理解成“到处镜面”。正确做法是粗糙度做分布、金属度做物理正确,否则反射系统的近似会被放大成“假”。 27 2
- 误区:用大量实时灯去补材质问题。移动端局部灯昂贵且受上限约束,先把材质、烘焙与反射捕捉器做对,再用少量灯点睛。 21 15 2
- 误区:透明材质想要像桌面一样“又便宜又好”。透明在移动端基本是“成本炸弹”,且反射/灯光模型可能受限(例如需要特殊的 Lighting Mode 才能在某些平台生效)。 28 2 5
如何用材质假装更高级的灯光或反射效果
- 用 Emissive + Fresnel 做边缘光/假高光;再用 Bloom 把“亮”扩散成“在发光”。 1 2
- 用“局部环境贴图(局部 cubemap)”叠加在关键材质上(例如车漆/玻璃),绕开 SSR 的缺失与捕捉器过渡问题。 27 2
- 对二次元/风格化:把“高光形状”当作美术贴图/曲线控制,而不是追求物理正确反射,这在移动端通常更稳定、更便宜。 2 8
6. 后处理与观感补偿
Bloom、Tonemapper、Exposure、Color Grading、AA、屏幕百分比:如何影响灯光/反射观感
- UE 5.5 官方移动更新中提到 Mobile Forward 新增的“更高画质特性”,很多都需要配合 Mobile HDR/后处理链才能真正体现在观感上(例如 Bloom 对 Emissive 的“发光感”贡献非常大)。 1 2
- PPR/移动 SSR 这类屏幕空间反射,本质上与 SceneColor/Depth 强耦合,后处理链(尤其 TAA)会影响稳定性与噪点/闪烁。社区关于移动屏幕空间反射的讨论也明确提到“移动 SSR 需要 TAA”的设定提示。 30 11 3
- 曝光(Auto Exposure)/色调映射(Tonemapper)会决定高光是否“糊成一团”或“亮不起来”;移动端若关闭某些后处理,会直接改变灯光层次感。 2 6
哪些后处理移动端性价比高,哪些代价大(工程口径)
- 高性价比(常用):Bloom(适度)、Color Grading(LUT/轻量参数)、基础 Tonemapper。它们对“氛围感、发光感、整体色彩统一性”的提升很直接。 1 2
- 代价偏大(谨慎):屏幕空间 AO(尤其 GTAO)、SSR/PPR(取决于质量档位与分辨率)、复杂 DOF、复杂体积效果叠加。移动端渲染分析明确指出:移动设备因 dependent texture read、带宽与 RT 解析等限制,后处理在移动上更耗甚至会“卡住渲染管线”。 2 5 8
- 体积雾(Volumetric Fog):UE 5.5 提到 Mobile Forward 支持体积雾,但它通常不应在低端机默认开启,而应做分级。 1 6
当不能上真实反射/动态光时,如何补偿
- 用烘焙 GI(Lightmass)解决“暗部发黑/没反弹光”的大问题。 18 29 2
- 用反射捕捉器分区 + 材质合理粗糙度,解决“金属像塑料/反射空”的大问题。 27 2
- 用 Emissive + Bloom/Color Grading,解决“灯光不够戏剧化/不够亮”的问题。 1 2
- 用 PPR 在少数关键平面上提升“接触反射”,而不是全场景 Planar 反射。 11 3 6
性能成本框架与支持矩阵
7. 讲性能成本时的统一框架(含分级与底层原因)
统一成本拆解:你在 Profiling 时要对应到“哪一类瓶颈”
CPU 开销(偏 CPU 瓶颈)
典型来源:
- Draw call 提交与状态切换、灯光影响物体列表构建、阴影投射体遍历。Arm 的 Vulkan vs OpenGL ES 对比强调:Vulkan 更低 CPU overhead,且多线程更友好;这在“多灯、多阴影、多 pass”项目里尤其关键。 7 14
- 动态灯光阴影的 CPU 成本往往与“灯数 × 受影响物体数 × 物体分裂程度”相关;论坛给出公式化描述:CPU 侧 ~ NumberOfLights NumberOfMeshesAffected NumberOfSeparateObjects。 15
GPU 计算开销(偏算力瓶颈)
典型来源:
带宽开销(偏带宽瓶颈)
典型来源:
- 多 Render Target(GBuffer/后处理链)、高分辨率 ShadowMap、SceneColor/Depth 多次读写。Apple 强调“尽量减少系统内存流量”;Android AGI 文档也把 texture memory bandwidth 作为可观测瓶颈。 5 8 14
Render Target / 深度 / GBuffer / Shadow Map(偏带宽 + 内存)
- Mobile Deferred 的 GBuffer 会增加 RT 数量与读写。 2 3
- ShadowMap(CSM/Spot shadow)对 RT 与带宽同样敏感,且阴影深度 pass 还会额外消耗几何处理。 15 22
Shader Complexity(偏算力 + 带宽)
Overdraw(偏 overdraw 瓶颈)
纹理内存与反射贴图内存(偏内存瓶颈)
分辨率变化对反射/阴影成本的影响
热降频与长时间运行
功能成本分级(相对概念 + 为什么如此)
说明:以下分级是“在移动端普遍场景下”的相对概念;真实成本仍取决于分辨率、材质复杂度、场景几何、灯影响范围、设备 GPU 与驱动。 6 8 15
- 很便宜:Emissive(不带复杂采样)、静态反射捕捉器采样(少量)、静态 Lightmap(压缩开启、分辨率合理)。 2 18 27
- 较便宜:1 盏无阴影 Directional(仅直接光)、少量无阴影局部灯(≤4,半径小)、基础 Bloom/Color Grading。 21 1 2
- 中等:Directional + 1–2 级联 CSM(距离短)、少量聚光阴影(数量极少)、PPR 低质量档(关键平面)、移动 Deferred(但控制 GBuffer 与后处理)。 22 3 11 13
- 昂贵:3–4 级联 CSM、多个阴影聚光、移动 SSR(较高质量/高分辨率)、体积雾叠加、多 RT 后处理链。 22 1 11 6
- 很昂贵:真实 Planar 反射(再渲染一次)、动态 SceneCapture(特别是 Cube)、移动端 Lumen(实验/高端)、桌面渲染器跑在手机上(实验路径)。 3 9 16
8. 支持矩阵(灯光/阴影/反射/后处理汇总)
说明:矩阵以“移动渲染器(Mobile Forward/Deferred)”为主要对象;“Desktop Renderer on Mobile”单独列为实验路径。 1 3
| 功能名 | 移动端是否支持 | 是否推荐量产 | 主要代价(偏向) | 主要风险 | 推荐替代方案 | 适合项目类型 | 低/中/高端建议 |
|---|---|---|---|---|---|---|---|
| 平行光 Directional | 支持 | 推荐 | CSM/阴影贴图(GPU+带宽) | 阴影锯齿/漏光/距离断层 | 烘焙远景 + 近景 CSM;关闭部分物体接收 CSM | 全类型 | 低端 1 级联;中端 2 级联;高端 3–4 但控距离 22 2 |
| CSM(移动) | 支持 | 推荐(但要控) | ShadowDepths(GPU)+ 采样(带宽) | cascades 超限/距离不当 | 降级级联数/距离;烘焙阴影 | 写实/中重度项目 | 低端短距离低级联 22 2 |
| Receive Mobile CSMShadows(按组件) | 支持 | 强烈推荐(优化手段) | 降低 shading cost(省 GPU) | 关闭后“看起来没影” | 只关次要物体 | 全类型 | 全档位建议用 22 |
| 点光 Point(无阴影) | 支持(受上限) | 推荐(少量) | 每像素多灯(GPU/overdraw) | 超上限灯不生效 | Emissive 假光;改聚光 | 多数项目 | 低端尽量不用;中端≤4 21 2 |
| 点光阴影 | 通常不支持/不推荐 | 不推荐 | 立方体阴影贴图(极贵) | 基本不可控 | 用方向光 CSM/聚光阴影/烘焙 | 少数 Demo | 不建议 2 15 |
| 聚光 Spot(无阴影) | 支持(受上限) | 推荐(少量) | 每像素光照(GPU) | 超上限/Shader permutation | Emissive/Decal 假投影 | 室内/舞台光 | 低端少用 2 21 |
| 聚光阴影(Movable) | 支持(需开启) | 谨慎 | ShadowDepths + 采样(GPU+带宽) | 配置/质量档导致不出阴影 | 降阴影数/分辨率;改烘焙 | 写实重点灯 | 高端机分级 3 2 |
| Skylight | 支持 | 推荐 | cubemap 采样(带宽/内存) | 室内漏光/发灰 | 分区 capture;烘焙 AO | 全类型 | 全档位建议 3 27 |
| Rect Light(5.5 Mobile Forward 新增) | 支持(5.5 明确) | 中高端谨慎量产 | shader 更重(GPU) | 设备差异/发热掉帧 | emissive + cubemap | 写实/展示 | 低端避免 1 6 |
| Capsule Shadows(5.5 Mobile Forward 新增) | 支持(5.5 明确) | 推荐(角色类) | 较省(相对) | 形体逼真度有限 | 贴花/顶点 AO | 角色主导项目 | 低中端也可 1 |
| Lightmass Lightmap(静态) | 支持 | 强烈推荐 | 包体/内存(带宽/内存) | UV/压缩伪影/漏光 | 合理密度;必要时关压缩(代价大) | 全类型 | 全档位核心 18 29 |
| Use Lightmap Directionality | 支持 | 按项目取舍 | 更贵但更立体(GPU) | 低端压力 | 关闭方向性 + 材质补偿 | 风格化/低端 | 低端可关 21 2 |
| Volumetric Lightmaps | 支持 | 推荐(有动态角色时) | 内存/插值(中等) | 误解导致“看似没效果” | 配合 CSM/烘焙 | 角色/动态物体 | 中高端更适配 19 20 |
| Reflection Capture(含压缩) | 支持 | 强烈推荐 | cubemap 内存/带宽 | 布置不当跳变 | 分区布置/压缩 | 全类型 | 全档位核心 2 28 |
| Mobile SSR(5.5 打通) | 支持(5.5) | 高端分级推荐 | 带宽+计算(昂贵) | 缺失/闪烁/精度差 | PPR/反射捕捉器 | 写实/车漆/水 | 低端关 1 11 30 |
| PPR(Pixel Projected Reflection) | 支持 | 推荐用于平面 | 中等到昂贵(屏幕空间) | 开关/模式不对无效 | capture + 仅关键平面 PPR | 水面/地面 | 中高端 3 11 28 |
| Planar Reflection(真实再渲染) | 理论可行 | 不推荐 | 很昂贵(额外渲染) | 掉帧/发热 | PPR/SSR | Demo | 基本避免 3 6 |
| 后处理链(Mobile HDR) | 支持 | 推荐但要克制 | 带宽/RT(中等到昂贵) | 低端掉帧 | 只保留 Bloom/ColorGrading | 全类型 | 低端精简 2 5 |
| Lumen(移动端) | Experimental | 不推荐常规量产 | 很昂贵(全链路) | 兼容性与稳定性风险大 | 烘焙 + capture + PPR | 高端写实特化 | 白名单+动态降级 9 6 |
| Desktop Renderer on Mobile(Vulkan Desktop 等) | Experimental | 不推荐 | 很昂贵/不为移动优化 | 包体/兼容/性能风险 | 用 Mobile Forward/Deferred | Demo/实验 | 极少数高端 3 16 |
项目决策、排错、优化与学习路径
9. 项目决策树(简版,但可直接落地)
写实项目
- 目标:稳定 30fps(广覆盖)
选择:Mobile Forward + 静态 Lightmass(高质量烘焙)+ Reflection Capture 分区 + 少量无阴影局部灯 + 近景短距离 1–2 级联 CSM。 2 22 18 - 目标:45–60fps(中高端)
在上面基础上:关键平面加 PPR;或在高端机开移动 SSR(必须 device profile 分级 + TAA 与质量档联动)。 1 11 6
二次元/风格化项目
- 方向:减少真实动态光依赖,把“体积感/高光形状/边缘光”交给材质与后处理(Emissive + Fresnel + Bloom)。
- 灯光:1 个 Directional(可无阴影或短距离阴影)+ 合理 Skylight + 捕捉器;局部灯尽量少、尽量不投影。 2 1
俯视角项目
开放世界项目
室内场景项目
竞速/射击/卡牌/休闲分类(快速策略)
- 竞速(车漆反射敏感):capture + 高端 SSR/PPR 分级;局部灯少而精。 1 11
- 射击(性能/稳定优先):Directional + CSM 短距离;大量 emissive/贴花/后处理做氛围。 22 2
- 卡牌/休闲(成本最敏感):尽量 Unlit/简化 Lit;以烘焙与材质假光为主。 2 8
10. 排错手册(≥30 条,表格)
说明:下表覆盖灯光、阴影、反射、材质、配置、平台差异与驱动差异。验证步骤优先用“真机 + profile + 逐项关开 + 设备分级”。 6 2 26 28 22
| 现象 | 根因归类 | 如何验证 | 如何修复 | 如何避免再次出现 |
|---|---|---|---|---|
| 手机上反射几乎没有/很弱 | 配置/反射捕捉器缺失 | 场景里是否放了 Reflection Capture;材质金属/粗糙是否合理 | 布置 Sphere/Box Capture;合理粗糙度;启用 capture 压缩 | 制作规范:每个室内区必须有 capture;材质审核粗糙度分布 27 2 |
| 预览有反射,打包到 Android 没反射 | 平台差异/配置 | 真机查 Mobile HDR、Planar Reflection Mode、相关 cvar | 开启 Mobile HDR;设置 MobilePPR;设置 r.Mobile.PixelProjectedReflectionQuality>0 | 用 device profile 固化开关;真机回归测试 28 2 3 |
| PPR/Planar Reflection 在 iOS/Android ES3.1 不工作 | 配置/材质模式 | 检查材质透明 Lighting Mode;检查 Mobile HDR | 调整水材质 Lighting Mode(必要时用更昂贵的模式);确认 Mobile HDR | 建立“水材质移动端模板”并锁定参数 28 6 |
| 反射边缘断裂/屏幕外缺失 | 功能限制(SSR/PPR) | 观察物体离开屏幕后反射是否消失 | 用 capture 兜底;限制 SSR 只用于关键区域;提高粗糙度掩盖 | 默认反射以 capture 为主,SSR/PPR 只加分 11 27 |
| 某些 Mali + OpenGL 机型反射异常/破碎 | 驱动/GPU 差异 | 只在特定 GPU/特定 API 复现;切 Vulkan 对比 | 优先 Vulkan;对该机型降级反射(关闭 SSR/降低 cubemap 分辨率) | 建立 GPU 白名单/黑名单;上线前覆盖 Mali/Adreno/Apple 26 14 6 |
| 烘焙后物体发黑 | 资源/Lightmap UV/密度 | Lightmap Density/Lighting Static Mesh Info 检查 | 修 UV2;提高关键物体 Lightmap 分辨率;检查光照重要体积 | 资源规范:UV2 无重叠、合理留白、密度分级 18 32 |
| 烘焙阴影有明显块状压缩伪影 | 压缩设置/带宽取舍 | 对比开启/关闭 Compress Lightmaps | 关键场景可禁用压缩(代价:内存/包体约 4×);或提高分辨率+优化 UV | 默认开启压缩;只对极少数关键地图禁用并单独评估 18 |
| 动态角色在静态阴影下“漂浮” | 功能限制(静态阴影不投到 Movable) | 查看 Volumetric Lightmap 是否开启;角色是否只采样间接光 | 用 Volumetric Lightmaps;或用 CSM 给角色接收/投射近景阴影 | 标准做法:动态角色必须用 VLM + 近景 CSM 19 20 22 |
| Volumetric Lightmap 看起来“没效果” | 常见误解 | 观察间接光颜色是否变化,而不是静态阴影投影 | 正确认知:VLM 提供间接光;静态阴影不影响 Movable | 培训规范:区分“间接光采样”与“阴影投射” 20 19 |
| 动态光在手机上不生效 | 配置/灯数上限 | 检查是否超过移动端局部灯上限;查看 Project Settings 动态灯数 | 降低局部灯数量;缩小半径;改用 emissive/烘焙 | 灯光规范:局部灯必须有预算表与半径上限 21 2 |
| 点光/聚光超过 4 个时部分灯“消失” | 功能限制(上限) | 把灯逐个禁用,观察是否轮换 | 控制在上限内;改用移动 deferred(高端);合并灯/用 emissive | 设计阶段就锁定“每屏幕最大灯数” 21 2 |
| 阴影锯齿严重 | 分辨率/级联/滤波 | 调整 CSM 级联数、距离、分辨率;看 aliasing | 缩短阴影距离;提高关键级联分辨率;减少级联数但提高近景质量 | 根据镜头设定“阴影距离预算” 22 23 |
| 阴影闪烁/爬行 | 精度/级联切换/偏移 | 观察相机移动时阴影边缘抖动 | 调整 shadow bias;优化级联分布;减少远距离阴影 | 统一项目 shadow bias 标准;锁定移动端质量档 22 2 |
| 远处阴影突然消失 | 配置(CSM distance) | 对比不同 shadow distance(Mobile) | 增加动态阴影距离(谨慎);或改为烘焙远景阴影 | 镜头设计阶段定“阴影最远可见距离” 23 22 |
| Far CSM 不生效 | 配置(MaxCascades) | 检查 Num Dynamic Cascades + Far Cascades 是否超 MaxCascades | 提高移动端 MaxCascades 或减少总 cascades | 统一 shadow cascade 预算与上限 22 |
| 某些物体接收阴影成本过高 | 过度接收 CSM | 开启/关闭 receive_mobile_csm_shadows 对比 GPU | 对小物体/远景关闭接收 CSM | 资源导入规则:小物体默认不接收 CSM 22 |
| 聚光阴影在移动端不出 | 配置(Permutation/开关) | 检查是否开启 movable spotlight shadow 相关设置 | 开启相应 cvar/项目设置;控制可见数量 | 建立“移动端灯光开关清单”并锁版本 3 2 |
| 水面反射在编辑器有,手机上没有 | 配置/材质/模式 | 检查 Mobile HDR、Planar Reflection Mode、材质透明 Lighting Mode | 按移动端要求设置;必要时改材质 Lighting Mode | 移动水材质模板 + 真机验证 28 2 |
| 透明材质反射表现差 | 功能限制/透明成本 | 对比不透明版本;查看透明 Lighting Mode | 尽量用不透明假玻璃;必要时使用更贵的透明模式并限用 | UI/特效规范:透明层数预算、限制大面积透明 28 5 2 |
| Android 与 iOS 观感差别大 | 平台差异(TBDR/精度/纹理格式) | 同一场景跨平台截图对比;检查半精度模拟 | 统一色调映射与后处理;对 Android 做 device profile 分级 | 建立“Android Vulkan/Android GLES/iOS Metal”对照测试矩阵 5 14 2 |
| Mobile Previewer 与真机不一致 | 工具限制 | 以真机为准;对比 Mobile Previewer“指定 device profile” | 用 UE 5.5 的 Android profile capture/半精度模拟功能辅助,但最终以真机验收 | 流程上规定“预览仅用于迭代,验收必须真机” 1 |
| 开启 SSR 后明显掉帧 | 带宽/屏幕空间计算 | GPU profile 看后处理/反射 pass | 降 SSR 质量/分辨率;只在高端机开启 | SSR 默认只在高端档位启用 11 6 1 |
| SSR 噪点/闪烁严重 | TAA/精度/粗糙度 | 观察是否随帧抖动;检查是否启用 TAA | 启用 TAA(若移动 SSR 依赖);提高 roughness;降低强镜面面积 | 材质规范:移动端避免大面积粗糙度=0 的镜面 30 11 27 |
| PPR 看起来“像没开” | 配置/模式 | 检查 r.Mobile.PlanarReflectionMode 与 r.Mobile.PixelProjectedReflectionQuality | 设置正确模式(MobilePPR 等),并确保 Mobile HDR 开启 | 把相关 cvar 固化到 DefaultEngine.ini + device profile 3 2 28 |
| 反射 capture 过多导致内存上涨/加载慢 | 内存瓶颈 | 统计 capture 数量与分辨率;查看纹理内存 | 合并 capture 区域;降低分辨率;开启压缩 | 制作规范:capture 必须有“最大数量/分辨率”限制 2 8 |
| 包体变大(Lightmap/反射贴图) | 资源/压缩策略 | 对比关压缩/高分辨率 lightmap 的差异 | 开启 lightmap 压缩;控制 lightmap 密度;压缩 capture | 资源审查:Lightmap Density + lightmap 统计 18 32 |
| 发热后帧率明显下降 | 热降频 | 记录运行时间与 thermal headroom;观察掉帧与温度相关性 | 动态降级:降分辨率/关 SSR/降阴影距离/降特效 | 接入 Android Thermal API 思路做质量自适应(至少做“长跑测试”) 6 14 |
| Vulkan 比 OpenGL ES 更不稳定(闪退) | 驱动/设备差 | 同机型切换 API 对比 | 对问题机型回退 GLES;或做 Vulkan 白名单 | 设备分级:Vulkan 默认、但保留 GLES fallback(或反之) 14 6 |
| OpenGL ES 画质功能缺失 | API 能力差异 | 检查是否使用了需要 Vulkan/Metal 的特性 | 对 GLES 降级:关移动 deferred/关高级反射 | 从立项就决定 GLES 目标与功能上限 14 13 2 |
| 移动 deferred 在 OpenGL 预览不工作 | 工具/预览限制 | 观察 Mobile Preview(OpenGL)是否无法显示 deferred | 不用 OpenGL 预览判定 deferred;以真机为准;需要时开启 r.Mobile.AllowDeferredShadingOpenGL | QA 流程:deferred 必须 Vulkan/Metal 真机验证 4 13 |
| GI/间接光“看起来没了” | 配置/项目状态 | 检查是否关闭 static lighting;检查烘焙是否有效 | 重建光照;确认 lightmap/VLM;不要误指望移动端实时 GI | 项目策略:移动端 GI 默认走烘焙;实时 GI 仅实验高端 18 9 6 |
| 场景太灰/没对比 | Skylight/曝光/色调映射 | 调整曝光、Skylight 强度、Color Grading | 用局部对比 LUT;加 AO/顶点 AO;减少 Skylight 漏光 | 美术规范:室内外分区 capture + 曝光策略 2 6 27 |
| 高光异常(某些机型特别亮/特别暗) | 精度/驱动差异/材质 | 同材质在不同 GPU 对比;切半精度/全精度 | 对关键材质启用全精度;降低高光能量;做机型分级 | 关键材质必须跨 Mali/Adreno/Apple 回归 2 6 26 |
| 动态阴影不显示(打包后) | 配置/质量档 | 检查 Directional 是否 Movable;检查动态阴影距离 | 设置正确 mobility 与距离;检查 device profile 是否把阴影质量设为 0 | 出包前真机 checklist:阴影开关、质量档、profile 全检查 23 22 6 |
| 阴影成本突然升高 | 投射体过多/级联过大 | GPU profile 看 ShadowDepths;统计投射网格 | 减少投射体、简化阴影网格、缩短距离 | 阴影投射体规范:树叶/小件默认不投射 15 22 |
| 多灯导致 CPU 也卡 | CPU 侧灯-物体组合爆炸 | 观察 RenderThread/GameThread 与灯相关开销 | 减灯、减受影响物体、减对象分裂;批处理 | 灯预算不仅看 GPU,也要看 CPU 组合规模 15 7 |
| 反射 capture 切换时“跳变”明显 | 布置问题 | 走到 capture 边界观察跳变 | 调整 capture 影响范围与重叠策略;移动 deferred 提升 blending(高端) | 关卡规范:capture 分区必须覆盖且边界在不显眼处 27 3 |
| 车漆反射像“贴纸” | 材质粗糙/法线/捕捉器 | 降低镜面强度、调整 roughness 纹理;检查 capture | 做真实 roughness 分布;加局部 capture;高端加 SSR | 车漆材质作为专项:必须真机标定 27 1 6 |
| 夜景灯光“像没有照亮” | 功能限制(发光不照场景) | 关掉 post,看 emissive 是否只是贴图亮 | 用烘焙把灯光贡献 bake 进 lightmap;少量真实灯补关键区域 | 夜景策略:静态 GI + emissive + bloom 优先 18 1 2 |
| Lumen 在移动端无效/不一致 | 实验性/兼容性 | 检查是否 Android Vulkan 高端机;是否开启实验路径 | 回退烘焙方案;只在白名单启用;提供开关 | 不把 Lumen 作为移动端默认依赖 9 6 |
11. 优化清单(上线前“TA 检查表”)
技术美术上线前检查项(建议你做成 Jira/飞书 checklist)
- 渲染路径:Mobile Forward/Deferred 是否符合项目定位;Android 是否 Vulkan 为默认;OpenGL ES 是否作为 fallback。 14 13 1
灯光预算:
阴影预算:
- 哪些物体必须接收 CSM,哪些必须关闭 receive_mobile_csm_shadows。 22
反射预算:
烘焙与 Lightmap:
材质规范:
长时间稳定性:
设备分级建议(工程做法)
- 低端:关 SSR/PPR、短距离 CSM、少局部灯、强烘焙、材质 Fully Rough 倾向。 2 22
- 中端:少量 PPR(关键平面)、2 级联 CSM、局部灯 ≤4(无阴影)。 11 21 22
- 高端:可尝试移动 SSR(谨慎)、更多后处理、少量聚光阴影,但必须受热策略约束。 1 6
性能 profiling 流程(推荐顺序)
1) 先确定是 CPU bound 还是 GPU bound(并锁定代表性场景)。 21 6
2) GPU bound:先看 ShadowDepths / 后处理 / 透明过度绘制 / SSR(PPR) / BasePass。 15 2 11
3) CPU bound:看 draw call、灯影响组合、阴影投射体遍历、PSO/管线创建(尤其 Vulkan)。 7 1 15
4) 热问题:用 Android Thermal API/头寸指标确认是否“热导致掉帧”。 6
12. 学习路径(入门→进阶→高级→项目实战)
入门阶段(你应该在 1–2 周内掌握)
必学知识点:
- Mobile Forward vs Mobile Deferred 的区别(为什么 deferred 更适合多灯,但更吃 RT/带宽)。 2 4
- Lightmap/Lightmass 的基本工作流:UV2、密度、重建光照、压缩影响。 18 32
- Reflection Capture 的布置与材质粗糙度对反射观感的决定性影响。 27 2
容易混淆概念:
练习:
进阶阶段(你开始能做“分级与取舍”)
必学知识点:
- CSM 级联数、距离、投射体与性能的关系;会用 receive_mobile_csm_shadows 做局部优化。 22
- 局部灯上限与“为什么移动端多灯贵”的底层原因。 21 25 5
- PPR 基本原理与启用条件(Mobile HDR、PlanarReflectionMode、质量档)。 3 11 28
练习:
- 做一条走廊:2–3 个局部灯(无阴影)+ 1 个主方向光(短距离 CSM)+ 走廊分区 capture + 地面 PPR。
达到水平: - 能稳定完成“中端机 45fps/高端机 60fps”的画质分级策略。 6 14
高级阶段(你能从“管线与硬件”解释并解决问题)
必学知识点:
- 带宽、RT load/store、overdraw、texture sampling 的硬件视角(TBDR、tile memory)。 5 8
- Vulkan vs OpenGL ES 的 CPU overhead 与稳定性取舍,如何做设备白名单/黑名单。 14 7 6
- 真机热稳定:学会用 thermal headroom 判断“为什么 10 分钟后掉帧”。 6
练习:
- 做一套 device profile:低/中/高三档,动态调整阴影距离、SSR 开关、分辨率比例。
达到水平: - 能指出问题更偏:算力/带宽/内存/overdraw/shader,并给出可执行的降级路径。 6 8
项目实战阶段(你能带团队上线)
必学知识点:
- “灯光与反射预算表”制度化:每关/每镜头/每玩法场景有明确预算。 15 6
- 资产制作规范:Lightmap UV、材质层数、透明叠层、capture 布置规范。 32 2 27
- 回归测试体系:跨 GPU/跨 API/长跑热测试。 6 26 14
练习:
移动端灯光与反射设计总原则
1) 移动端永远先定“默认底座”:静态 Lightmass(含 VLM)+ 反射捕捉器分区 + 合理材质粗糙度,是最稳的量产骨架。 18 19 27 2
2) 把实时当作“高端增强层”,而不是默认层:移动 SSR/PPR、聚光阴影、体积雾、矩形区域光,都应做 device profile 分级,并默认可被热策略降级。 1 6 3
3) 每个“贵”都能追到一个底层原因:
- 多灯 → forward 下 overdraw 乘法;deferred 下 GBuffer/带宽上升。 25 4
- 阴影 → ShadowDepths 额外几何 + 采样带宽。 15 22
- 反射 → cubemap 内存/带宽;SSR/PPR 读写 SceneColor/Depth。 8 11 27
4) 先修材质,再谈反射:一半以上的“反射问题”是粗糙度/金属度/法线/透明模式导致的“近似被放大”。 27 2 28
5) 用最少的阴影达成最大叙事:Directional CSM 只给玩家近景信息;远处阴影交给烘焙、贴图、AO、构图与色调。 22 18 2
6) 把“长时间稳定帧率”当成第一 KPI:移动端性能不是一次跑满,而是持续不掉;热降频是移动上线的真实敌人。 6 14
7) 对高端实验路径保持清醒:
移动端 Lumen、桌面渲染器跑手机、SM6 相关路线(Nanite/VSM 等)要么是 Experimental,要么依赖特定设备与修改;不要把它们当作移动量产的默认依赖。 9 16 17
8) 最终以真机为准:UE 5.5 虽增强了 Mobile Previewer,但移动端依旧是“设备/驱动/精度/格式”的组合问题;项目流程必须以真机覆盖与 device profile 分级收敛风险。 1 6 26
重建参考链接
- Unreal Engine 5.5 is now available
- 剖析虚幻渲染体系(12)- 移动端专题 Part 1(UE移动端渲染)
- Mobile Rendering and Shading Modes for Unreal Engine
- Using the Mobile Deferred Shading Mode in Unreal Engine
- Harness Apple GPUs with Metal - WWDC20
- Thermal API | Android game development
- Use Vulkan for graphics | Android game development
- Android Game Development Kit overview (AGI / texture bandwidth / shader profiling)
- Using Lumen Global Illumination on Mobile in Unreal Engine
- Lumen Technical Details in Unreal Engine
- Mobile Rendering | Unreal Engine 4.27 Documentation
- 5.5.4 Hotfix Released
- Unreal Engine Console Variables Reference
- Features and APIs Overview | Android 15 graphics
- Guidelines for creating game with dynamic lights only and good performance
- Mali and Unreal Engine’s Nanite: Enabling the future of mobile graphics
- Virtual Shadow Maps in Unreal Engine
- CPU Lightmass Global Illumination in Unreal Engine
- Volumetric Lightmaps in Unreal Engine
- Volumetric Lightmaps not working on mobile
- Performance Guidelines for Mobile Devices in Unreal Engine
- Use Cascaded Shadows | Unreal Engine 4.27 Documentation
- Lighting for Mobile Platforms | Unreal Engine 4.27 Documentation
- How to increase mobile Max Moveable Spotlight / Point Lights?
- What is the cost of dynamic point lights?
- Broken reflections on Android Mali
- Reflections Captures in Unreal Engine
- Rendering Settings in the Unreal Engine Project Settings
- Stationary Light Mobility in Unreal Engine
- Screen Space Reflections on mobile require TAA (forum discussion)
- Planar Reflections in Unreal Engine
- Understanding Lightmapping in Unreal Engine
turn 占位符到链接映射
turn27view0→ Unreal Engine 5.5 is now availableturn24view0→ 剖析虚幻渲染体系(12)- 移动端专题 Part 1(UE移动端渲染)turn23view0→ Mobile Rendering and Shading Modes for Unreal Engineturn0search27→ Using the Mobile Deferred Shading Mode in Unreal Engineturn17view3→ Harness Apple GPUs with Metal - WWDC20turn17view4→ Thermal API | Android game developmentturn20view2→ Use Vulkan for graphics | Android game developmentturn11search0→ Android Game Development Kit overview (AGI / texture bandwidth / shader profiling)turn12search0→ Using Lumen Global Illumination on Mobile in Unreal Engineturn12search1→ Lumen Technical Details in Unreal Engineturn11search25→ Android Game Development Kit overview (AGI / texture bandwidth / shader profiling)turn22view0→ Mobile Rendering | Unreal Engine 4.27 Documentationturn28search0→ 5.5.4 Hotfix Releasedturn13search0→ Mobile Rendering and Shading Modes for Unreal Engineturn7search23→ Using the Mobile Deferred Shading Mode in Unreal Engineturn25search6→ Unreal Engine Console Variables Referenceturn20view1→ Features and APIs Overview | Android 15 graphicsturn12search16→ Harness Apple GPUs with Metal - WWDC20turn13search3→ Mobile Rendering and Shading Modes for Unreal Engineturn10search25→ Guidelines for creating game with dynamic lights only and good performanceturn17view0→ Mali and Unreal Engine’s Nanite: Enabling the future of mobile graphicsturn12search15→ Mali and Unreal Engine’s Nanite: Enabling the future of mobile graphicsturn15search13→ Virtual Shadow Maps in Unreal Engineturn26search8→ CPU Lightmass Global Illumination in Unreal Engineturn26search4→ Volumetric Lightmaps in Unreal Engineturn26search0→ Volumetric Lightmaps not working on mobileturn26search1→ Performance Guidelines for Mobile Devices in Unreal Engineturn10search6→ Performance Guidelines for Mobile Devices in Unreal Engineturn10search7→ Use Cascaded Shadows | Unreal Engine 4.27 Documentationturn25search3→ Unreal Engine Console Variables Referenceturn10search3→ Use Cascaded Shadows | Unreal Engine 4.27 Documentationturn15search11→ Lighting for Mobile Platforms | Unreal Engine 4.27 Documentationturn10search33→ How to increase mobile Max Moveable Spotlight / Point Lights?turn14search10→ What is the cost of dynamic point lights?turn10search35→ Broken reflections on Android Maliturn0search32→ Reflections Captures in Unreal Engineturn14search1→ Rendering Settings in the Unreal Engine Project Settingsturn13search4→ Unreal Engine 5.5 is now availableturn26search24→ Stationary Light Mobility in Unreal Engineturn26search32→ CPU Lightmass Global Illumination in Unreal Engineturn26search12→ CPU Lightmass Global Illumination in Unreal Engineturn25search8→ Using the Mobile Deferred Shading Mode in Unreal Engineturn0search20→ Rendering Settings in the Unreal Engine Project Settingsturn14search9→ Screen Space Reflections on mobile require TAA (forum discussion)turn14search19→ Planar Reflections in Unreal Engineturn12search4→ Using Lumen Global Illumination on Mobile in Unreal Engineturn26search28→ Understanding Lightmapping in Unreal Engineturn10search13→ Thermal API | Android game developmentturn25search5→ Using the Mobile Deferred Shading Mode in Unreal Engineturn14search21→ Performance Guidelines for Mobile Devices in Unreal Engineturn11search8→ Thermal API | Android game developmentturn19search10→ Harness Apple GPUs with Metal - WWDC20