跳到主要内容
腾讯题库 · Q18
先读 30 秒回答

第 18 题 / 50

学习状态 未开始

Shader 溢出调试

面试官问

PDF 第 40 页

你如何调试 Shader 中的“颜色溢出”或“数值溢出”问题?请列举至少三种工具或方法。(常问题,理清逻辑)

Shader debugging · numeric 对应课程:shader-performance

先把问题答上

你可以直接这样回答

约 30 秒
  • 先让错误可见:在真实 shader 中我会把最终颜色换成中间值 debug,检查 NaN/Inf、除零、radiance 范围、精度和 target 格式。
  • 再固定证据:用 GPU frame capture 或固定失败预设复现;当前 Lab 只有 HDR cost、precision budget 和 cost-debug 文本。
  • 最后守住修复边界:Clamp 只在明确输出边界止血,不能替代上游根因修复;我会同时保留原始值和处理后值。

这道题真正想听什么?

先确认比较对象和回答边界,再决定要不要展开公式、工程实现或性能取舍。

它考的是诊断顺序:把“白了”拆成输入过大、除零、NaN/Inf、低精度、render target 范围、颜色空间或 tone mapping 的哪一段。至少三种方法可以是中间值 debug、GPU frame capture/RenderDoc 类工具、NaN/Inf mask、精度切换、固定失败预设与逐项 clamp。Clamp 是止血,不是根因解释。

把答案讲到 2 分钟面试必答 · 约 2 分钟 · 补足因果、输入和取舍

至少三种方法是:中间通道/范围 mask、GPU capture 查看资源与格式、f32/f16 A/B 和固定参数回归。高光爆白可能是输入过大,也可能是低精度、除零或 tone mapping;证据要区分它们。移动端使用 f16 前先做误差预算,不全局替换。

面试官可能继续追问什么?补充自测 · 约 3 分钟 · 检查自己是不是真的懂了
  • 问:画面爆白就把曝光调低吗? 答:先看 radiance、分母、精度和 target 格式;曝光降低可能只是把错误压到看不见。
  • 问:至少三种工具/方法怎么说? 答:中间通道染色;GPU frame capture 查看资源/格式/指令;NaN/Inf/范围 mask;f32/f16 A/B;固定参数回归。选择能复现问题的组合。
  • 因果链: 输入/运算 → precision/range → target 写入 → tone mapping → 颜色症状。记录原始值与处理后值才能区分根因。
如果概念还是悬空,就去做实验关键证据 · 约 5–15 分钟 · 预测 → 单变量 → 观察

实验不是第二份答案,它只负责证明答案

如果上面的解释已经听懂,可以直接跳过。卡住时,再沿着这三步把抽象词变成画面证据。

  1. 先猜 这份数据从哪里进入 Shader,经过哪一步,最后改变哪个像素?
  2. 去取证 固定其他条件,只改一个参数。先写下变化,不用“更真实”“更高级”这种空词代替证据。
  3. 再追问为什么 是哪一步造成这个结果?如果结果相反,先检查输入、空间、算法,还是显示输出?
我完全没头绪,给我一个起点

先截下默认状态,只动页面当前开放的那个参数。你只需要说清楚“原来怎样 → 改了什么 → 现在怎样”。

1. 先预测

打开 Shader Overflow Debugger Lab,先设 hdrValue=4shaderWork=22precision=f32clampHdr=truedebugMode=precision。把 hdrValue 拉到 48、切 f16、关闭 clamp 后,当前 PerformanceRenderer 只会把高 HDR 且未 clamp 的 hdrCost 反映到 GPU ms,并在 cost-debug 文本里标出 debugMode;它不会生成 NaN/Inf 或中间通道视图。precision 是教学预算维度,真实精度误差要用 shader/frame capture 另行验证。把 radiance 想成水箱水位:HDR 允许高水位,但水箱、管道和刻度都有上限。

公式的口语翻译:

safe = isFinite(value) && abs(value) <= targetRange
output = clamp(value, minRange, maxRange)

第一句是在问“这个数是不是有限且在目标范围内”;第二句是在输出边界止血。它们不能替代检查上游除法分母、光源单位或精度损失。

老师追问

先别急着查答案: 先追一条数据从输入到像素:它经过哪一步计算,哪一个中间通道会先暴露问题?

为什么: 你刚才的预测依赖哪个前提?如果把“Shader 溢出调试”里最关键的变量或约束关掉,画面/输出会先坏在哪里?

如果结果相反: 先排除哪一层,再谈结论?这个规则的边界是什么?

2. 再动手

Precision 代码 逐项执行:A 仅增 hdrValue;B 仅切换 precision;C 关闭 clampHdr;D 切 shader-error debug。记录 PerformanceRenderer 的 GPU ms、FPS、Draw Calls、Bandwidth、VRAM 与 cost-debug 文本;最后注明这些是教学预算证据,NaN/Inf 和中间通道必须在真实 shader/frame capture 中复核。

3. 最后对证据

在这个教学模型中,hdrValue 较高且 clampHdr=false 会让 hdrCost 推高 GPU ms;precision 只是预算/解释维度,不代表真实精度误差。cost-debug 是通用 debug 文本,bandwidth 说明 target 代价,都不等于 NaN/Inf 检测或数值正确性。

答案在代码哪里发生?实现定位 · 约 3 分钟 · 变量、函数和关键行
完整 5 分钟版本面试扩展 · 约 5 分钟 · 项目边界、验证与降级

工程中会在关键阶段加入有限的 NaN/Inf、法线长度、分母和 HDR 范围检查,线上保留计数/采样而关闭昂贵可视化。质量档位可降低曝光、采样或改低精度,但必须有目标设备阈值、回滚和对比图。当前 Lab 的 hdrValue/shaderWork 是教学模型,不能当作真实硬件极限。

哪些说法最容易答歪?必看陷阱 · 约 1 分钟 · 面试前最后检查
  • 到处 clamp,让材质能量被悄悄压平。
  • 只调曝光,不查输入范围、除零和精度。
  • 把 f16 省带宽/寄存器当成必然正确。
  • 只看最终颜色,不保存触发溢出的参数和中间证据。