四、纹理压缩
我们前面提到的技术包括用 SH 计算车漆的高光反射、使用 IBL 纹理计算环境反射、使用光照贴图在场景中保存烘焙的全局光照(Global Illumination,GI),以及通过自动亮度调整来获得更好的光照。我们还有潜在可见性数据(Potential Visibility Data),虽然在本次演讲中没有提到,但是在游戏中也有应用。很明显,所有这些技术的关键词都是烘焙。
烘焙会导致包体过大。游戏6GB的包体中,超过 80% 的内容都是贴图。
我们检查了贴图内容,以下面为例,包体里包含 PBR 渲染所需的三张贴图。我们注意到这三张贴图非常相似,都包含了Window (具有透明度的表面区域)。
其次,它们都包含了三角形。法线贴图上的三角形虽然不明显,但确实存在。
我们的想法是,既然这些 PBR 参数都存在相同部分,那么相同部分其是冗余数据,如果我们能减去相关性,就可以节省空间。
我们用 PCA (主成分分析)来消除相关性。我会通过一个简单的二维空间示例演示 PCA 的工作原理。
假设我们有一个包含许多红点的XY 平面,我们需要用二维变量来描述这些红点。但是如果我们能找到一条穿过所有红点的直线,就可以将数据从二维空间转换到一维空间。而 PCA 的作用就是找到这条直线。
再回到我们的问题,我们可以将 PBR 纹理表达为 9 维向量,PCA 的任务是找到最佳4维平面对9维向量进行拟合。
与参考图相比,PCA 的场景亮度更高。所以我们在输入中增加了权重,并通过机器学习来确定权重。