张勇
← 博客

自研引擎 Shading Model 升级记录

约 2 分钟读完

最近在升级自研引擎的 shading model。

原来的引擎实现和 Unity URP 严格对齐。这个选择在当时很自然:一方面希望借助 Unity 的编辑器能力和生态,另一方面也希望整体技术路线尽量贴近一个成熟、稳定、移动端友好的方案。

但随着项目推进,逐渐能感受到 Unity 在材质表达上的限制。合作方也吐槽过多次,觉得效果没有 UE 精致,也缺少 RealityKit 那种更自然、更有质感的表现。

这次正好有机会深入研究了一番,发现 Unity 的确简化得比较厉害。这个取舍也能理解,毕竟 Unity 很多设计都服务于移动端性能。Unity 工程师在 SIGGRAPH 2015 的《Optimizing PBR for Mobile》分享里,其实已经讲得很清楚:在当时的移动端算力约束下,很多 PBR 项都需要做简化和近似。

只是现在已经是 2026 年了。

移动端设备的性能早已不可同日而语,我们也有了更大的算力预算去呈现更好的效果。过去为了稳定帧率必须省掉的一些项,现在未必还是必须省掉。对于自研引擎来说,这也是一个重新审视 shading model 的机会。

目前我准备从两个维度推进:直接光照和环境光照。再进一步拆成 Diffuse 和 Specular,把影响材质质感的关键项逐个补起来。

按我当前理解的优先级,主要包括:

  1. 基于 Split-Sum 的 LUT
  2. 直接光照中 NDF、Geometry、Fresnel 的分离与更准确计算
  3. 能量补偿,用于近似能量守恒
  4. Multi-bounce AO
  5. 根据粗糙度混合反射方向
  6. 高光遮蔽项近似
  7. 高光抗锯齿

这些项单独看都不是新东西,但实时渲染里,最终质感往往就是靠这些细节一点点堆出来的。尤其是 Specular 相关的部分,一旦简化过头,材质很容易变得塑料、平、假,缺少真实世界里那种复杂但自然的光照变化。

这次也顺手对比了一些现有实现。主观上,单看材质和光照质感,我目前的排序大概是:

UE > Filament >> Unity URP

Filament 的设计很值得参考。它不像 UE 那样直接给出一整套非常完整的高端渲染方案,但能明显感受到它对效果项优先级的判断:哪些近似值得做,哪些成本可以接受,哪些地方会直接影响最终观感。

Unity 则更像是给了一个足够基础、足够通用、足够适配移动端的实现。它的好处是稳定、简单、容易跑得流畅,也允许开发者继续往上升级。但如果目标是更强的材质表现,只停留在 URP 的默认 shading model 上,确实会很快碰到天花板。

UE 则像是直接给了一套豪宅。很多在 Unity 里需要自己补的东西,UE 已经默认放进来了。以前移动端算力受限时,Unity 更容易做出流畅稳定的渲染,而 UE 往往需要更多优化。现在时代不同了,UE 在手游行业越来越受欢迎,也不无道理。

对我来说,这次升级不是为了简单追某个引擎的效果,而是重新梳理自研引擎在材质表达上的能力边界。Unity 给了一个很好的基础实现,但基础实现不应该成为最终答案。随着移动端算力提升,我们应该把过去被性能预算压掉的那些质感细节,一项一项拿回来。

评论