Chapter 14: Level of Detail and Simplification
本章讨论一个渲染工程中反复出现的问题:同一个模型在离相机很远、屏幕占比很小或短时间被遮挡时,仍按近景精度提交和绘制,会把顶点处理、索引读取、材质切换、内存传输和 streaming 预算浪费在用户难以分辨的细节上。Level of Detail(LOD)就是为同一个资产准备多个复杂度层级,并在运行时选择当前帧足够使用的表达版本。
读完本章,读者应能定位一个资产的 LOD 选择发生在渲染管线的哪一段,判断距离、屏幕空间误差、遮挡和运动状态如何影响层级选择,区分几何简化算法产生的误差、拓扑变化和属性损伤,并设计一条可复查的 LOD 生成与验证流程。
贯穿本章的材料是一帧开放世界街区画面:相机前方 8 米处有一个机械雕像,远处 45 米处有同一资产的另一个实例。原始雕像 LOD0 有 120000 个三角形,包含金属主体、玻璃面罩、软管和天线轮廓,顶点属性包括 position、normal、tangent、UV、material id 和可选碰撞代理。近处实例需要完整轮廓和材质细节;远处实例在屏幕上高度约 60 像素,很多细小结构已经无法稳定分辨。
本章的核心结论是:LOD 选择应以屏幕空间误差和资源预算为主线,距离只是估算屏幕误差的一项输入;Simplification 的目标是生成视觉上可接受、属性上可用、运行时可切换的替代表达;性能收益要用实际瓶颈证据验证,三角形数量下降只是候选证据,还需要对应到整帧或目标 pass 的耗时变化。
14.1 LOD 的作用、距离层级与屏幕误差
LOD 在渲染管线中的位置通常早于 draw command 的最终提交。CPU 或 GPU culling 阶段先得到一个候选可见集,然后 LOD 选择逻辑根据相机、资产包围体、屏幕占比、误差预算和 streaming 状态,为每个实例选择某个 mesh、index range、material set 或 renderer 组合。后续 vertex shader、rasterization、fragment shader 和资源绑定看到的已经是被选中的层级。
距离层级是最直观的 LOD 输入。机械雕像距离相机 8 米时,LOD0 的天线、软管截面和小螺栓可能占据多个像素;同一个资产距离 45 米时,天线可能只剩一两条像素宽的线段,部分螺栓在采样后与主体颜色混合。此时继续提交 120000 个三角形,会让 vertex fetch、vertex shader invocation、post-transform cache 和 index bandwidth 处理很多屏幕上没有稳定贡献的顶点。
距离本身仍然缺少两个条件:相机投影和屏幕分辨率。一个 2 米高的对象在 20 米处能占多少像素,取决于 vertical field of view(vertical FOV)和渲染目标高度。同样距离下,窄 FOV 会放大对象,高分辨率会让同一几何误差覆盖更多像素。LOD 阈值写成固定米数会在不同镜头和平台上产生不稳定结果。
更稳定的判断方式是把对象空间误差换算成屏幕空间误差。若某个 LOD 相对原始模型的最大位置误差约为 ,对象到相机距离为 ,垂直视场角为 ,屏幕高度为 ,可用近似式 估算这个误差在屏幕上覆盖多少像素。这个公式的工程含义很直接:同样的对象空间偏差,离相机越远,屏幕误差越小;屏幕越高或镜头越窄,误差越显眼。
下面的简化代码展示一个运行时选择条件。它回答的问题只有一个:某个 LOD 的预计算误差在当前相机下是否落入像素预算。
#include <cmath>
float projectedErrorPixels(float worldError,
float distanceToCamera,
float verticalFovRadians,
float screenHeightPixels) {
float pixelsPerWorldUnit = screenHeightPixels /
(2.0f * distanceToCamera * std::tan(verticalFovRadians * 0.5f));
return worldError * pixelsPerWorldUnit;
}
bool canUseLod(float lodWorldError,
float distanceToCamera,
float verticalFovRadians,
float screenHeightPixels,
float allowedPixels) {
return projectedErrorPixels(lodWorldError,
distanceToCamera,
verticalFovRadians,
screenHeightPixels) <= allowedPixels;
}
这段代码省略了包围体半径、非均匀缩放和近裁剪边界,但保留了 LOD 判断的主干。机械雕像的 LOD2 如果相对 LOD0 的几何误差约 2 厘米,在 60 度 vertical FOV、1080 像素高度、距离 45 米时,屏幕误差约 0.42 像素;在距离 8 米时约 2.34 像素。前者通常可以接受,后者可能造成轮廓跳动和法线高光变化。
LOD 层级可以按资源预算组织。LOD0 保存完整轮廓和材质分组,面向近景检查;LOD1 保留主体形状和主要硬边,删除内部螺栓与细管;LOD2 合并细长结构并减少材质切分,面向远景;LOD3 可能变成 billboards、impostor 或极低面数代理。Unity Manual 的 Introduction to level of detail 也把 LOD 的收益归到减少多边形、材质复杂度和 renderer 数量上,这和工程中观察 draw、vertex 和 material 成本的方式一致。
屏幕误差还要和资源预算结合。远处雕像如果处在阴影 pass、反射 pass 和主 color pass 中,LOD 选择可以按 pass 使用不同阈值:主视图可能使用 LOD2,低分辨率反射使用 LOD3,阴影只保留投影轮廓。这样做的判断依据是输出目标不同:主视图关心颜色、法线和轮廓,阴影 pass 更关心遮挡体积,反射 pass 常受分辨率和粗糙度滤波限制。
一个可复用的判断顺序是:先估算对象屏幕占比,再换算 LOD 误差到像素,接着检查该 pass 需要的视觉信息,最后结合当前帧预算选择层级。距离只是第一步输入,最终选择来自可见像素、误差阈值和资源路径的合并判断。
14.2 Simplification Algorithms and Error Metrics
Simplification 在本章中指把一个高复杂度 polygon mesh 转成低复杂度 mesh 的过程。输入通常是顶点缓冲、索引缓冲、拓扑邻接关系和属性集合;输出是一个三角形更少、内存更小、在指定观察条件下仍能代表原模型的 mesh 或 index range。它解决的是 LOD 资产如何生产的问题,运行时 LOD 选择依赖这些离线或导入阶段生成的结果。
最常见的几何简化家族包括 vertex clustering、vertex decimation、edge collapse 和 pair contraction。Vertex clustering 把空间落在同一网格单元的顶点合并,速度快,适合点云、极远景或粗代理,但轮廓控制弱。Vertex decimation 选择顶点删除并重三角化局部洞,适合局部规则网格。Edge collapse 每次把一条边的两个端点折叠成一个新点,能细粒度控制误差,是实时资产 LOD 里最常见的基础操作。Pair contraction 扩展了 edge collapse,可以合并空间上接近但拓扑上没有边连接的顶点,更适合处理很多分离小部件组成的模型。
Quadric Error Metrics(QEM)是理解现代网格简化的关键误差模型。Michael Garland 和 Paul Heckbert 的论文 Surface Simplification Using Quadric Error Metrics 提出用二次型近似顶点到一组局部平面的误差,并在迭代收缩顶点对时累加误差信息。工程上可以把它理解成:每个顶点携带一份“移动到哪里会偏离原表面多少”的局部代价,简化器优先执行代价最低的折叠。
在机械雕像上,QEM 会倾向保留大的金属外轮廓和平面交界,因为这些位置对应多个相交面,顶点移动会同时偏离多组平面。位于大平面中间的小螺栓、密集细管或重复装饰,如果屏幕上贡献很小,通常会更早被折叠或合并。这样生成的 LOD1 和 LOD2 才能在三角形大幅减少后仍保持主体形状。
几何误差只覆盖 position 层面的变化,真实渲染还受属性误差控制。normal 变化会改变高光方向,tangent 变化会影响 normal map,UV 变化会拉伸贴图,vertex color 变化会改变烘焙信息,skin weight 变化会改变动画变形,material boundary 变化会改变 draw 拆分和材质选择。一个几何上看似接近的 LOD,可能因为 UV seam 被折叠而出现贴图错位,或因为法线被平均而丢失硬边。
误差指标可以按观察对象分成三类。第一类是位置误差,回答“低模表面距离原表面多远”。第二类是属性误差,回答“低模顶点携带的渲染属性还能否产生稳定着色”。第三类是拓扑约束,回答“边界、孔洞、断开部件和材质分区是否允许被改变”。LOD 生产时应把三类指标同时写入导入配置,而非只给一个目标三角形比例。
| 算法或指标 | 主要输入 | 优势 | 风险 | 适用位置 |
|---|---|---|---|---|
| Vertex clustering | 空间网格、顶点位置 | 速度快,极端降面稳定 | 轮廓粗糙,属性损伤大 | 极远景、点云、碰撞粗代理 |
| Edge collapse | 拓扑边、误差代价 | 控制细,质量高 | seam 和边界处理复杂 | 常规 LOD 链 |
| Pair contraction | 空间邻近点、误差代价 | 可合并分离小部件 | 可能改变拓扑和连通性 | 由很多小零件组成的远景模型 |
| QEM | 局部平面集合、二次型误差 | 质量和速度平衡好 | 对属性误差需要扩展 | 常规网格简化基础 |
| Attribute error | normal、UV、color、weight | 保持着色和贴图稳定 | 权重设置影响简化程度 | 角色、硬表面、贴图密集资产 |
现代工具常把这些思想包装成导入器或库接口。例如 meshoptimizer 的文档把 meshopt_simplify 定义为基于顶点和索引缓冲生成更少索引的简化算法,并提供 target error、attribute-aware simplification、边界锁定和 LOD 链误差返回等工程接口。这里的关键点是:简化输出包含低面数结果,也应带有可用于运行时 LOD 选择的误差数值。
拓扑变化要按资产用途判断。机械雕像的内部螺栓在远景可以合并到主体表面,玻璃面罩边界和天线尖端需要更严格保护。若机械雕像用于碰撞,render LOD 和 collision proxy 可以分开生成;render LOD 关心屏幕误差,collision proxy 关心物理稳定性和交互边界。把两者绑定成同一个 mesh 会让视觉和物理互相牵制。
简化算法的可复用判断顺序是:先确定目标观察距离或误差像素,再选能保护关键属性的误差模型,接着锁定轮廓、材质边界和 UV seam,最后用画面与指标共同验证。一个 LOD 结果合格,意味着它在目标屏幕范围内保持主体形状、着色连续性和运行时资源收益。
14.3 可视度驱动的 LOD 策略
可视度驱动的 LOD 策略把“这个对象是否值得使用高精度表达”放回当前帧的可见性条件中。屏幕占比、遮挡状态、运动速度和相机距离共同决定层级选择。远处对象、被遮挡对象和高速运动对象通常可使用更低复杂度表达;近处、轮廓清晰、正在交互或占据画面中心的对象应提高阈值。
下面的流程图描述一个实例在当前帧进入 LOD 选择的主路径。图中忽略了平台特定 API 细节,重点是判断顺序。
屏幕占比是 LOD 选择的首要可视度输入。Unity 的 LOD Group component reference 使用对象占屏幕高度百分比作为编辑器中的层级边界,这说明很多引擎把“对象在画面中有多大”作为用户可调的直观表达。工程里可以把这个比例换算成像素高度、solid angle 或包围球投影面积,最终都服务同一个目标:估算人眼和 shader 采样能看到多少几何细节。
遮挡状态会改变 LOD 和 streaming 优先级。一个雕像虽然距离相机 10 米,但 90% 被墙遮挡,主视图中只露出少量天线和轮廓边。这时可以保留露出部分需要的轮廓精度,同时降低贴图 mip、内部零件 LOD 和下一帧 streaming 优先级。若使用 hierarchical Z buffer 或 occlusion query,结果存在一帧或多帧延迟,LOD 选择应配合保守阈值,减少对象从遮挡中出现时的突变。
运动速度影响可见细节的稳定性。高速横向移动的远处雕像,在 temporal anti-aliasing、motion blur 或相机快速旋转下,细小三角形的贡献会被时间采样和重投影平滑。运行时可以在运动速度较高时提高允许误差,在对象减速或进入镜头中心时逐步恢复精细层级。这个策略的边界是轮廓和高光,细杆、天线、玻璃高光在运动中仍可能产生闪烁,需要单独保护。
相机距离仍然有价值,但应作为可视度估算的一部分。距离能快速筛掉大量远处实例,适合宽相位判断;屏幕占比和误差像素用于最终选择。机械雕像这种高度固定的资产,距离阈值可以作为缓存;角色、伸缩动画或非均匀缩放对象,应使用实时包围体重新估算屏幕占比。
LOD 切换要处理 temporal stability。直接从 LOD0 跳到 LOD1,可能造成 silhouette pop、法线高光跳变、贴图接缝变化和阴影形状突变。常见做法包括 hysteresis(滞回)、cross-fade(交叉淡入淡出)、dithered transition(抖动过渡)和按 pass 分离切换。交叉淡入淡出会在过渡区同时绘制两个 LOD,短时间增加 draw 和 fragment 成本;抖动过渡需要和 TAA 或 alpha test 配合,可能引入噪声。
CPU 驱动和 GPU 驱动的 LOD 管线有不同实现位置。CPU 驱动管线通常在场景遍历或 renderer list 构建阶段选择 LOD,然后提交具体 mesh 和 material。GPU driven rendering 会在 compute shader 中完成 culling、LOD 选择、compaction 和 indirect draw 参数写入,适合大量实例和 meshlet 组织。两种方式的判断标准一致:LOD 选择结果要落到可执行的资源绑定、索引范围和 draw 参数。
可视度驱动策略的检查顺序是:先确认对象是否进入可见集,再估算屏幕占比和误差像素,接着根据遮挡与运动调整阈值,最后用滞回或过渡区控制 temporal stability。这样得到的 LOD 决策可以解释每一次切换,也能在 frame capture 中追踪到对应的 mesh、material 和 draw command。
14.4 自动生成多个 LOD 层级
自动生成 LOD 链的目标是把资产导入阶段变成可复查的生产流程。输入是一份高精度源 mesh 和一组渲染约束;输出是一串带误差、阈值、资源引用和验证结果的 LOD。机械雕像这类硬表面资产需要保留外轮廓、硬边法线、UV seam、材质边界和玻璃部件;角色资产还要处理 skin weight、骨骼索引和动画变形后的轮廓。
第一步是清理输入。重复顶点、退化三角形、断裂的法线 seam、错误的材质 id 和单位缩放问题会直接影响简化结果。位置相同但属性不同的顶点可能代表 UV seam、硬边或材质边界;导入器应先区分“应焊接的位置重复”和“应保留的属性不连续”。输入清理后的资产才能让简化算法把资源花在真实几何误差上。
第二步是定义保护规则。机械雕像的外轮廓边、玻璃面罩边界、天线端点和材质分区边界可以被标记为高优先级。UV seam 可按贴图密度设置权重,normal 和 tangent 可按高光敏感度设置权重。对 skinned mesh,应保护关键关节附近的权重分布,简化后重新归一化 bone weights,并用动画姿态抽样检查肘部、膝盖、肩部等位置的变形。
第三步是生成目标层级。层级可以按目标三角形比例生成,例如 100%、50%、25%、12.5%;也可以按目标误差生成,例如 0.5 像素、1 像素、2 像素对应的对象空间误差。按误差生成更接近运行时选择逻辑;按比例生成更便于资产预算管理。大型项目通常把两者结合:每个资产类别有最大三角形预算,同时每个 LOD 必须满足屏幕误差阈值。
第四步是检查视觉与属性结果。LOD0 到 LOD1 应保留主要轮廓;LOD2 可以牺牲内部细节,但应维持材质分区和大面法线;LOD3 可以合并材质和使用 impostor,但需要在目标距离下检查 alpha、阴影和反射。检查结果应包括三角形数、顶点数、index buffer 大小、vertex buffer 大小、材质数量、submesh 数量、误差数值和推荐切换阈值。
自动化流程可以写成一组稳定的导入阶段动作:清理输入、生成邻接、标记保护边界、运行简化器、修复属性、生成阈值、导出资源、截图验证。下面的列表按生产顺序组织,每一项都应有工具日志或资产元数据记录。
- 输入规整:统一单位、坐标轴、缩放、法线方向和材质 id,删除退化三角形,记录源资产版本。
- 顶点焊接:按位置焊接真正重复的顶点,同时保留 UV seam、硬边和材质分界造成的属性拆分。
- 保护标记:给轮廓、开口边界、材质边界、关键动画关节和碰撞边界设置保护权重。
- 误差生成:按目标像素误差或目标三角形预算生成 LOD1、LOD2、LOD3,并记录每层对象空间误差。
- 属性修复:重新计算或修复 normal、tangent、skin weight、bounds、lightmap UV 和碰撞代理。
- 阈值写入:把每层误差、推荐屏幕高度、过渡宽度和 streaming 优先级写入资产元数据。
- 画面复查:在固定相机距离、固定 FOV 和固定光照下截图比较,观察轮廓、贴图、阴影和高光变化。
材质边界是自动 LOD 中常见的失败点。若机械雕像的玻璃面罩和金属主体共享一个简化过程,边界被折叠后可能产生材质穿插或错误 draw 拆分。稳定做法有两类:按 submesh 分别简化并锁定边界,或者把 material id 编入顶点属性并让简化器把它作为属性误差的一部分。前者更安全,可能降低简化幅度;后者更灵活,需要更严格的验证。
UV 和贴图密度决定远景是否出现拉伸。几何误差 1 厘米的 LOD 可能在低频贴图上完全可接受,在高频文字、图案、铭牌上会产生明显变形。导入阶段应为高频 UV 区域设置更高属性权重,或在远景 LOD 中改用单独烘焙的低频纹理。这样能把几何简化和材质简化放到同一资源预算中处理。
Skin weight 的处理需要以动画姿态验证。角色 LOD 如果只在 bind pose 下检查,关节弯曲后可能出现塌陷和穿插。更可靠的做法是在导入阶段抽样几组关键动画姿态,比较 LOD0 和候选 LOD 的屏幕轮廓、关节体积和法线变化。简化后若 bone weights 被更新,应重新归一化并限制每顶点骨骼数量,减少 shader 输入带宽。
碰撞代理和 render LOD 应分离管理。render LOD 随相机变化,collision proxy 需要在物理和交互中保持稳定。机械雕像的远景 LOD 可以把软管合并到主体表面,但碰撞代理仍需保留玩家可能接触到的主要边界。工程上通常导出专用 collision mesh、navigation proxy 和 occluder mesh,它们和可见 mesh 共享源资产,却服务不同系统。
LOD 切换与 cross-fade 需要写进资产策略。Unity 文档中的 LOD Group 支持 Cross Fade 和 Fade Transition Width,这类设置在运行时会影响过渡区的绘制成本。对于机械雕像,LOD0 到 LOD1 可使用较窄过渡区,因为两者轮廓接近;LOD2 到 LOD3 如果材质和形状差异大,应使用更宽过渡区或 impostor 专用过渡。
自动生成 LOD 链的验收顺序是:先确认输入清理无错误,再确认简化器记录了误差和保护信息,然后检查每层的几何、属性、材质和碰撞边界,最后在目标距离和目标 pass 中观察过渡。这样生产出的 LOD 才能被运行时策略安全消费。
14.5 LOD 对渲染性能提升作用
LOD 的性能收益来自具体资源路径变化。三角形减少会降低 index fetch、vertex fetch、vertex shader invocation、primitive assembly 和 rasterization 前的部分工作;材质合并会降低 draw count、pipeline state 切换和 descriptor binding;贴图 mip 与材质简化会降低 texture sampling 与带宽;极远景 impostor 可能把几何成本转成少量 fragment 成本。收益大小取决于当前帧瓶颈所在位置。
如果场景 vertex-bound,机械雕像从 120000 个三角形降到 15000 个三角形,通常会减少 vertex shader 时间、顶点属性带宽和 post-transform cache 压力。frame capture 中可观察到 vertex shader invocation 数量下降,index buffer 读取减少,相关 draw 的 GPU 时间下降。此时 LOD 收益会比较直接。
如果场景 fragment-bound,降低三角形数可能收益有限。透明植被、玻璃、粒子和高频材质常受 overdraw、texture fetch 或 blend 限制。机械雕像的玻璃面罩如果使用昂贵的透明材质,远景 LOD 只减少金属主体三角形,主 pass 时间可能仍由玻璃 fragment shader 主导。此时应同时降低材质复杂度、减少透明层数或为远景使用更便宜的 shader variant。
如果场景 CPU submission-bound,LOD 的收益取决于 draw count 和状态切换。单个 mesh 从 120000 三角形降到 10000 三角形,但仍拆成 12 个 submesh、12 次 draw、多个材质绑定,CPU 侧收益可能有限。远景 LOD 应考虑合并 submesh、减少材质数量、使用 texture atlas 或 material variant,把几何简化和提交简化一起完成。
如果瓶颈在内存和 streaming,LOD 会影响 vertex buffer、index buffer、texture mip、meshlet page 和 asset residency。大型开放世界中,远景资产使用低 LOD 能减少常驻内存和加载带宽,并让 streaming 系统优先加载近景资产。此时要观察 GPU memory residency、upload bandwidth、page fault、texture mip streaming 和磁盘读取队列,而非只观察 draw 的局部 GPU 时间。
| 瓶颈类型 | LOD 可能带来的变化 | 应观察的证据 | 常见边界 |
|---|---|---|---|
| Vertex-bound | 顶点数、索引数、VS invocation 下降 | GPU profiler 中 vertex stage 时间下降 | 复杂 fragment shader 仍可能主导帧耗时 |
| Fragment-bound | 远景材质、透明层、overdraw 降低 | overdraw、PS invocation、texture bandwidth 下降 | 几何降面本身收益有限 |
| CPU submission-bound | draw count、state change、renderer 数量下降 | CPU render thread、command recording 时间下降 | LOD 拆分过多会抵消收益 |
| Memory-bound | vertex/index/texture 常驻数据下降 | bandwidth、cache miss、streaming 队列改善 | 多套 LOD 会增加离线包体和管理成本 |
| Streaming-bound | 低 LOD 优先加载,近景资源排队减少 | asset residency、mip level、IO 峰值变化 | 错误阈值会造成贴图或几何突变 |
| Shadow/reflection pass | 使用 pass 专用低 LOD | pass GPU time 和 primitive count 下降 | 阴影轮廓变化会暴露切换 |
LOD 也会带来成本。第一,多个 LOD 增加资产包体、构建时间和 QA 面积。第二,cross-fade 过渡区可能同时绘制两个层级。第三,LOD0、LOD1、LOD2 若使用完全独立的 vertex buffer,会增加内存占用;若共享 vertex buffer,又需要处理顶点顺序和 cache locality。第四,过于激进的 LOD 会产生 pop、贴图漂移、阴影变化和动画塌陷,造成视觉质量回退。
性能复盘应从 frame 级别开始。先确认当前帧主要耗时在 CPU、GPU、内存还是 streaming。接着定位包含机械雕像的 pass,记录 LOD0 和候选 LOD 的 draw count、triangle count、vertex count、material count、texture mip 和 shader variant。然后在固定相机路径上切换 LOD 策略,比较帧时间、pass 时间和视觉差异。最后把收益写回资产规则,例如“远景硬表面 LOD2 目标 15% 三角形、材质数降到 2、屏幕误差小于 1 像素”。
一个可靠的 LOD 收益结论应该包含三部分:瓶颈证据、资源变化和视觉边界。“LOD2 比 LOD0 少 80% 三角形”属于候选证据;完整判断还需要看到目标 pass 时间下降、提交或带宽指标改善,并确认目标距离下轮廓、贴图、阴影和动画仍在预算内。这样 LOD 才从资产处理技巧变成可维护的渲染系统策略。
最小自检任务
给定一个场景:屏幕高度 1440 像素,vertical FOV 为 60 度。一个 3 米高的机械雕像距离相机 36 米,LOD1 的对象空间最大几何误差为 3 厘米,LOD2 的对象空间最大几何误差为 8 厘米。当前目标是主 color pass 中误差不超过 1.5 像素,并且该 draw 在 profiler 中显示 vertex shader 时间高于 fragment shader 时间。请判断当前帧应优先选择哪个 LOD,并说明还需要检查哪些资源和视觉证据。
答案要点
先把对象空间误差换算成屏幕误差。近似式为 。在 1440 像素、60 度 FOV、36 米距离下,LOD1 的 0.03 米误差约为 1.04 像素,LOD2 的 0.08 米误差约为 2.77 像素。因此在 1.5 像素预算下,主 color pass 应优先选择 LOD1。
由于 profiler 显示 vertex shader 时间更高,LOD1 相比 LOD0 有机会降低顶点处理、索引读取和 vertex fetch 成本。判断还需要记录 LOD1 的 triangle count、vertex count、index buffer 大小、材质数量和 shader variant,确认 draw count 没有因为 LOD 拆分增加。视觉上应检查机械雕像的外轮廓、玻璃边界、天线、硬边高光、UV 纹理和阴影轮廓,确认切换区使用滞回或 cross-fade 后没有明显 pop。
LOD2 在主 color pass 中超出 1.5 像素预算,当前相机条件下不适合作为主视图层级。它可以考虑用于反射、低分辨率阴影或更远距离的实例,但需要单独验证对应 pass 的视觉目标和误差阈值。
本章知识点总结
- LOD 位置:LOD 选择通常发生在可见集构建和 draw command 提交之前,结果会改变 mesh、index range、material 或 renderer。
- 屏幕误差:距离只是 LOD 输入之一,稳定选择应把对象空间误差换算成像素误差。
- 资源预算:同一个资产在主视图、阴影、反射和 impostor pass 中可以使用不同 LOD 阈值。
- 简化定义:Simplification 把高复杂度 mesh 转成低复杂度 mesh,并保留可用于运行时选择的误差信息。
- QEM 作用:Quadric Error Metrics 用局部平面误差估算顶点折叠代价,适合生成质量和速度平衡的 LOD。
- 属性误差:normal、tangent、UV、color、skin weight 和 material boundary 都会影响低模的最终画面。
- 拓扑边界:边界、孔洞、断开部件和材质分区是否允许改变,决定简化器可以执行哪些折叠。
- 可视度输入:屏幕占比、遮挡状态、运动速度和相机距离共同决定当前帧的 LOD 选择。
- 切换稳定性:滞回、cross-fade 和 dithered transition 用于减少 LOD 层级切换造成的时间闪烁。
- 生成流程:自动 LOD 生成应包含输入清理、保护标记、误差生成、属性修复、阈值写入和画面复查。
- 材质边界:多材质资产需要锁定边界、按 submesh 简化或把 material id 纳入属性误差。
- 角色约束:Skinned mesh 的 LOD 需要在动画姿态下检查轮廓、权重归一化和关节变形。
- 碰撞分离:Render LOD 服务屏幕质量和性能,collision proxy 服务物理稳定性和交互边界。
- 收益证据:LOD 的性能收益应由 vertex、fragment、CPU submission、memory 或 streaming 指标证明。
- 成本边界:多套 LOD 会增加包体、构建时间、过渡绘制和 QA 面积,需要纳入资产预算。