常见坑速查:精度、色彩空间、排序与 artifact
最后一篇当速查手册:一批「编辑器里好好的,真机/换设置就出问题」的坑,每个给症状、根因、处置。遇到怪现象先来这里对表。
精度:half 与 float
症状:大世界坐标下顶点抖动、贴图 UV 波纹、远处材质闪烁;手机上比 PC 更早出现。
根因:编译器自动选精度,移动端默认倾向 mediump(fp16):范围 ±65504、约 3 位有效十进制——世界坐标动辄几万,fp16 直接不够(见 /notes/unity/principles-4/)。
处置:位置、UV、时间相关计算保持 float;颜色、法线、方向用 half 换吞吐。强制写法:min16float/precise 修饰按平台规则使用;改完看编译产物的精度标注(见 /notes/unity/performance-2/)。
色彩空间:Linear 与 Gamma
症状:换到 Linear 色彩空间后整体变暗/变亮;手机与 PC 颜色不一致;渐变带条纹(banding)。
根因:光照数学必须在线性空间做(光的叠加是线性的)。Gamma 工作流里贴图/帧缓冲都是 gamma 编码值,shader 里的混合、光照全在编码值上算——结果既不对也不稳定。URP/HDRP 强制 Linear;Built-in 项目可切换。
处置:Built-in 项目开 Project Settings → Color Space = Linear;贴图按 sRGB 标记导入(采样自动解码为线性);自定义 shader 写回 HDR/中间 RT 时注意手动 gamma 编码;banding 用 dither 或 10bit 目标。PBR 参数(见 /notes/unity/lighting-3/)只有在线性空间里才「物理」。
透明排序毛刺
症状:两个透明物体/粒子系统互相穿插时,遮挡关系逐帧翻转。
根因:Unity 按包围盒中心距离排透明 Draw Call(见 /notes/unity/structure-3/),互相穿插的物体无论怎么排都必错一部分帧。
处置:拆小包围盒(分段网格);改加法混合(One One 与顺序无关,见 /notes/unity/structure-3/);或接受小错。深度写不写(ZWrite)决定它挡不挡后面的透明,先确认预期。
Z-fighting
症状:共面/近面贴图(贴花、地面 decals)闪烁。
根因:深度精度不足(见 /notes/unity/principles-3/)。处置:Near 平面别小于 0.1–0.3;贴花用 Polygon Offset 或深度偏置;别用两个完全共面的面。
法线贴图与导入设置
症状:细节明暗反向、接缝、平贴图也凹凸。见 /notes/unity/effects-1/ 的坑表——九成是导入类型/压缩格式/切线设置,不是代码。
预乘 alpha 与 Blend 不匹配
症状:特效边缘黑边/白边。
根因:纹理已预乘 alpha 却用 SrcAlpha OneMinusSrcAlpha(二次相乘出黑边),或未预乘却用 One OneMinusSrcAlpha(白边)。处置:纹理与 Blend 成对检查(见 /notes/unity/structure-3/)。
平台差异三连
- 压缩格式:PC 的 BC 格式在移动不支持(用 ASTC),未压缩回退 = 带宽爆炸(见 /notes/unity/performance-1/)。
- API 严格度:Vulkan/Metal 对未初始化 uniform、语义错比 GLES 宽容度低——「GLES 能跑 Vulkan 黑屏」先查未定义行为。
- 精度规则:见上文,移动端默认更激进地降精度。
自检三问
- 为什么 banding 在 Gamma 空间比 Linear 空间严重?
- 黑边和白边分别对应哪种「纹理 × Blend」错配?
- 远处材质在手机上抖动、PC 正常,第一反应查什么?