94.反射探针

94.性能优化-GPU-着色器优化-降低填充率压力-反射探针


94.1 知识点

反射探针的作用

反射探针(Reflection Probe)用来捕捉某个空间内的环境反射信息。Unity 在场景中放置一个立方体探针,拍摄周围环境生成一张立方体贴图(Cubemap),运行时物体表面就能从中采样反射。简单来说:用一张 Cubemap 模拟物体周围的反射环境,让金属、玻璃等材质看起来有倒影感。

反射探针的原理

1. 烘焙阶段: Unity 以探针位置为中心渲染场景的 6 个方向(±X、±Y、±Z),生成一张 6 面的 Cubemap,包含该点周围环境的颜色和亮度信息。

2. 运行阶段: 对于反射性材质(如金属),Shader 在像素着色时根据法线方向在 Cubemap 中查找对应方向的颜色,作为反射光加入最终颜色。

3. 混合: 若物体位于多个反射探针之间,Unity 根据位置权重对反射贴图进行插值混合,保证反射在空间上连续、平滑。

反射探针的三种类型:

  • Baked(烘焙):只在烘焙时生成 Cubemap,运行时不更新。适用于静态场景、固定反射环境。
  • Realtime(实时):运行中定时或每帧重新渲染 Cubemap,性能消耗较大。适用于镜面、水面、动态光照变化。
  • Custom(自定义):手动指定 Cubemap。适用于特殊效果或自定义反射。

反射探针的使用

主要步骤

  1. 在场景中创建 Reflection Probe。
  2. 设置反射探针相关参数。
  3. 根据类型决定是否烘焙(烘焙型需要将静态物体勾选 Reflection Probe Static)。
  4. 设置对象让其支持反射探针:URP 在管线资源里设置;内置渲染管线在对象的 Renderer 组件上设置。

创建反射探针

右键 → Light → Reflection Probe

创建后可以看到一个立方体 GameObject 挂着反射探针组件。

反射探针参数

Type(类型)

Baked(烘焙): 只在烘焙时生成 Cubemap,运行时不更新。最常用,适合静态场景、室内、固定反射环境。

Custom(自定义): 使用手动指定的 Cubemap;可勾选 Dynamic Objects 让动态物体出现在反射中。

Realtime(实时): 运行中定时或每帧重新渲染 Cubemap。

  • Refresh Mode(刷新模式):
    • On Awake:场景加载时更新一次。
    • Every Frame:每帧重新渲染,效果最实时但消耗极高。
    • Via Scripting:仅脚本手动调用时更新。

  • Time Slicing(时间切片):
    • All faces at once:一次渲染全部 6 面,占用一帧大量 GPU 时间。
    • Individual faces:每帧只渲染一面,分摊到 6 帧,减少性能峰值。
    • No time slicing:无切分优化,一次性全量渲染。

Runtime Settings(运行时设置)
  • Importance:探针优先级,多探针影响同一区域时,权重高的优先。
  • Intensity:反射亮度倍数;一般保持 1,偏暗可提高到 1.2–2。
  • Box Projection:启用盒体投影,让 Cubemap 按包围盒进行位置校正,室内、走廊场景更贴近真实空间。
  • Blend Distance:探针间的混合过渡距离;建议 0.5–2。
  • Box Size:探针影响范围大小,一般设为能包裹目标区域。
  • Box Offset:探针中心偏移,微调采样中心。
Cubemap Capture Settings(立方体纹理捕获设置)
  • Resolution:Cubemap 每面分辨率;更清晰可用 256–1024,但增加内存。
  • HDR:高动态范围捕捉,保留更宽亮度范围;推荐始终开启。
  • Shadow Distance:捕获时的阴影距离;默认 100 足够。
  • Clear Flags:捕获背景;通常选 Skybox。

  • Background Color:Clear Flags 为 Solid Color 时的背景色。
  • Culling Mask:哪些层包含进反射贴图;默认 Everything,可排除 UI、特效层。
  • Occlusion Culling:捕获时是否启用遮挡剔除。
  • Clipping Planes:近/远裁剪面;默认 Near=0.3、Far=1000 通常合适。
Bake(烘焙按钮)

点击 Bake 只烘焙当前选中的探针。点击下拉箭头可选择 Bake All Reflection Probes 烘焙场景中所有探针。

烘焙反射探针

复制多个反射探针,点击 Bake 只烘焙一个;如果想烘焙全部,点击下拉框选 Bake All Reflection Probes。

烘焙后可能发现反射贴图中没有周围的 Cube——这是因为需要将静态物体勾选 Reflection Probe Static(反射探针静态对象),才能被反射探针捕获。

勾选后重新烘焙,可以看到 Cubemap 中已经能反射 Cube 了。

设置对象支持反射探针

URP:Project Settings → Graphics 的渲染管线资源中,确保 Reflection Probes 相关选项已启用(Probe Blending、Probe Atlas Blending、Box Projection 等)。

内置渲染管线: 在对象的 Renderer 组件上,将反射探测器设置为 Blend ProbesBlend Probes And Skybox

验证反射效果

创建材质,将金属度和光滑度设为 1,给 Cube 设置不同颜色后重新烘焙,可以在反射球体上看到周围环境的倒影。移动球体时反射随之变化。为了更真实的效果,可以对反射探针使用更合理的布局。

反射探针布局技巧

  1. 室内房间:每个房间中心放一个探针,包围整个房间。
  2. 室外区域:每隔一段距离放探针,保证环境颜色平滑过渡。
  3. 镜面或金属地面:使用 Realtime 探针或自定义反射。
  4. 多层空间(楼上楼下):每层独立放置探针。
  5. 走廊、通道:间隔放置多个探针实现连续反射变化。

反射探针常见问题

问题 原因与解决
反射与环境颜色不符 探针位置错误或影响范围太小,调整 Box Size 与 Box Offset
反射贴图模糊 Cubemap 分辨率太低,提高 Resolution
动态物体反射不更新 探针为 Baked,改为 Realtime 或手动更新
探针间反射突变 探针太稀疏,增加数量或增大 Blend Distance
室内反射偏暗 提高 Intensity 到 1.3–2
反射拉伸失真 开启 Box Projection 并正确设置 Box Size
反射边界突变 增大 Blend Distance 到 1–2
镜像效果不动 检查 Type 是否应从 Baked 改为 Realtime

94.2 知识点代码

Lesson94_性能优化_GPU_着色器优化_降低填充率压力_反射探针.cs

public class Lesson94_性能优化_GPU_着色器优化_降低填充率压力_反射探针
{
    #region 知识点一 反射探针的作用

    // 反射探针捕捉空间内的环境反射信息,生成 Cubemap,
    // 让金属、玻璃等反射性材质获得倒影效果。

    #endregion

    #region 知识点二 反射探针的原理

    // 烘焙阶段:以探针为中心渲染 6 方向生成 Cubemap。
    // 运行阶段:Shader 根据法线在 Cubemap 中查找反射颜色。
    // 多探针时按位置权重插值混合,保证空间连续。
    // 三种类型:Baked(静态)、Realtime(实时)、Custom(自定义 Cubemap)。

    #endregion

    #region 知识点三 反射探针的使用

    // 1. 创建 Reflection Probe,设置参数。
    // 2. 静态物体勾选 Reflection Probe Static 后烘焙。
    // 3. URP 在管线资源启用 Probe Blending;内置管线在 Renderer 上设 Blend Probes。
    // 布局:室内居中、室外间隔、走廊多段、每层独立。
    // 常见问题:模糊提高分辨率、突变增大 Blend Distance、失真开 Box Projection。

    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏