Skip to main content

反射探针的基础知识

想象反射探针是一个360度拍照的摄像头,它会拍下周围环境的六个面,拼成一个立方体盒子般的贴图(Cube Map)。当如你设置512分辨率时,相当于6个 512x512 像素的照片——六个面拼起来就像展开的纸盒,不过 Unity 会自动帮我们整理这些图片。

系统不仅存高清版本,还会自动生成"打了马赛克"的低清版。这些模糊处理的图片可不是偷懒,而是专门用来表现像磨砂金属、粗糙墙面这种不光滑材质的反射效果,这样看起来更真实。

实际运行时,物体会找离自己最近的2个反射探针,根据距离远近自动混合两个探针的效果。如果周围只有一个探针,那就直接用那个。

除了反射探针对象之外,每个场景都有一个保底的“环境反射”,这通常是从天空盒材质生成的,但可以自己上传其他立方体贴图(比如想让整个场景都泛着金库的金色反光就可以这么玩),“环境反射”会在当物体附近没有反射探针时启用。

一个反射探针纹理的示意

image-1643385044625.png

在这张图像中,您可以看到反射探针所记录的内容。通常,反射探针以未压缩的形式存储,所有面就像这样展开,但 Unity 在导入它们或任何其他以同样方式排列的立方图纹理时,将自动组合它们。您可以看到这个示例中的探针包含了一座建筑物,上方的天空,以及一个外部区域。尽管探针每边只有512像素,它仍然非常清晰,并包含了实时中看起来准确和清晰的反射。

动态对象如何工作?

动态对象使用最接近其网格上锚点位置的探针。

probes1.png

角色、车辆等这些会动的物体(称为动态物体),它们的"反射锚点(Anchor)"其实有点反直觉——默认不是模型中心,而是网格的原始坐标点(就是建模软件里那个(0,0,0)的位置)。比如你从网上下载的模型,这个点可能还在脚底板的位置。不过别担心,在 Unity 里可以通过拖任意空物体到"Anchor Override"栏位,以自己指定定位点。

anchoroverride.png

如果细心留意,你会发现大部分虚拟形象使用 Chest 作为所有子物体的 Anchor,以保证虚拟形象所有身体部位时刻处在同样的亮度,否则就会在部分场景遇到身体亮度分裂的问题。

静态物体的反射探针如何工作?

静态物体的反射原理和动态物体是一样,但这里有个坑:Unity的静态合批功能(就是把多个物体合并渲染提升性能)有个限制——只能合并受同一个探针影响的物体。比如说,你的场景里有十个箱子,如果五个受探针A影响,五个受探针B影响,那它们会被分成两批渲染。这时候可以试试给这些箱子设置同样的锚点(Anchor),说不定能让它们合并。实在不行的话,就得手动合并模型了。

着色器如何处理反射探针?

大部分情况直接用Unity标准着色器就行,开发者不用自己造轮子。系统会自动处理好这些事:

  • 根据摄像机角度计算反射方向

  • 混合两个探针的效果

  • 用遮挡贴图控制哪些部位反射弱(比如凹陷处)

  • 根据材质粗糙度决定用高清还是模糊的贴图