你可以直接这样回答
SSR 从法线和视线得到反射方向,在屏幕空间有限步进,用深度缓冲判断命中,再采样颜色。它只能看到当前屏幕内的证据;走出屏幕或超过预算要承认 miss,用探针/环境图 fallback。移动端主要控制步数、分辨率、深度读取和带宽。
这道题真正想听什么?
先确认比较对象和回答边界,再决定要不要展开公式、工程实现或性能取舍。
它考你是否知道 SSR 是“屏幕里有什么就只能看到什么”的近似。典型流程是:从法线和视线算反射方向,在屏幕空间沿射线步进,把每一步投影到 UV,再与深度缓冲比较,命中后采样颜色;走出屏幕、超过步数或遇到没有深度的动态物体,就必须报告 miss 并交给探针/环境图兜底。移动端的热点通常是步数、分辨率、深度读取和带宽,而不是一句“SSR 很贵”就结束。
把答案讲到 2 分钟面试必答 · 约 2 分钟 · 补足因果、输入和取舍
我会把 ssrStepSize、ssrMaxSteps、ssrThickness、ssrMaxDistance 和 ssrEdgeFade 分开解释:步长影响漏采样,步数和距离限制探路预算,厚度是深度误差容忍,边缘淡出降低低可信反射。验证用 hit/miss、平均步数、边界 debug 和 GPU ms,而不是只看反射是否“好看”。
面试官可能继续追问什么?补充自测 · 约 3 分钟 · 检查自己是不是真的懂了
- 问:为什么 SSR 不能反射屏幕外的大楼? 答:它没有那块几何的颜色/深度证据;应 miss 后采样 reflection probe、环境图或简化颜色,而不是复制最后一个像素。
- 问:步长越小一定越好? 答:更容易找到薄物体,但步数和带宽增加;要用命中率、平均步数和 GPU 时间找拐点。
- 因果链: 反射方向 → UV 步进 → 深度比较 → hit/miss 可信度 → 颜色合成。边界、动态物体和粗糙表面是结构性失败,不是单纯 bug。
如果概念还是悬空,就去做实验关键证据 · 约 5–15 分钟 · 预测 → 单变量 → 观察
实验不是第二份答案,它只负责证明答案
如果上面的解释已经听懂,可以直接跳过。卡住时,再沿着这三步把抽象词变成画面证据。
- 先猜 这份数据从哪里进入 Shader,经过哪一步,最后改变哪个像素?
- 去取证 固定其他条件,只改一个参数。先写下变化,不用“更真实”“更高级”这种空词代替证据。
- 再追问为什么 是哪一步造成这个结果?如果结果相反,先检查输入、空间、算法,还是显示输出?
我完全没头绪,给我一个起点
先截下默认状态,只动页面当前开放的那个参数。你只需要说清楚“原来怎样 → 改了什么 → 现在怎样”。
1. 先预测
打开 SSR Failure Lab,先用 ssrMaxSteps=32、ssrStepSize=0.035、ssrThickness=0.04、ssrMaxDistance=12、ssrEdgeFade=0.12。先猜:把步数降到 8,反射会更容易断;把步长增大,薄物体可能被跨过去;把相机转到屏幕边缘,可信度下降。把 debugMode 切到 ssr、bounds、depth,像给探路者戴三种不同颜色的头盔。
这是教学重建/概念近似,用来帮助初学者理解“深度差落进容错带”;它不是当前 traceSsr 的实际比较式:实际代码读取 device depth,再和步进得到的 rayDepth 比较。
公式的口语翻译:
pᵢ₊₁ = pᵢ + stepSize · reflectionDirection
hit ⇔ |linearDepth(pᵢ) - sceneDepth(uvᵢ)| < thickness
第一行是在屏幕上的反射方向迈小步;第二行是在问“脚下的深度和场景表面是否落在容错带里”。ssrThickness 是深度误差,不是亮度;ssrMaxSteps 和 ssrMaxDistance 分别限制最多走几步、最远走多远,不保证屏幕外找到东西。
老师追问
先别急着查答案: 先追一条数据从输入到像素:它经过哪一步计算,哪一个中间通道会先暴露问题?
为什么: 你刚才的预测依赖哪个前提?如果把“SSR 屏幕空间反射”里最关键的变量或约束关掉,画面/输出会先坏在哪里?
如果结果相反: 先排除哪一层,再谈结论?这个规则的边界是什么?
2. 再动手
在 SSR 代码页 固定镜面材质,只改一个控制并记录:A ssrMaxSteps=8/32/64;B ssrStepSize=0.02/0.08;C ssrEdgeFade=0/0.25。每次切到 bounds debug,写下 ssr-hit、trace-confidence、平均步数和画面边缘的变化,再说明移动端可以降低哪一个预算。
3. 最后对证据
步数少时 max-steps miss 增多,步长过大时会漏过薄几何;边缘 fade 增大后反射会柔和退场,但不是命中率提高。trace-budget 只能说明探路工作量,不能证明反射物理正确;bounds-debug 出现屏幕外颜色时,应接受这是信息边界。
答案在代码哪里发生?实现定位 · 约 3 分钟 · 变量、函数和关键行
- SSR 步进与深度命中:反射方向、UV 和深度比较在这里串起来。
- 屏幕边界:区分 off-screen、max-steps 和真正的 miss。
- 调试通道:把深度、命中和最终合成分开看。
完整 5 分钟版本面试扩展 · 约 5 分钟 · 项目边界、验证与降级
项目里可以用半分辨率、限制高反射区域、降低步数、temporal reuse 或按设备档位关闭 SSR;动态物体和屏幕外区域保留 probe/环境图。先用固定镜面场景记录命中率、边缘失败比例、平均步数、GPU 时间,再比较降级后的画质。当前 Lab 是教学模型,不能宣称覆盖真实引擎的所有深度格式和后处理顺序。
哪些说法最容易答歪?必看陷阱 · 约 1 分钟 · 面试前最后检查
- 走出屏幕后复制最后一个像素,造成屏幕边缘拉丝。
- 把
thickness当亮度或把提高步数当成“修复所有 miss”。 - 忘记线性深度/设备深度的转换,命中率看似高但空间关系漂浮。
- 只看平均 FPS,忽略高反射镜头的峰值步进成本。