跳到主要内容
腾讯题库 · Q09
先留一次裸跑

第 09 题 / 50

学习状态 未开始

Roughness 高光分布

面试官问

PDF 第 19 页

在 PBR 材质中,粗糙度(Roughness)与金属度(Metallic)的贴图如何影响反射高光的分布?请结合 Shader 代码片段说明。(必问题,理清逻辑)

Shader PBR · roughness 对应课程:pbr

先留下证据,再接受教学

第一步不是答对,是看见自己现在怎么想

未开始

先别看答案:粗糙度、GGX 的 D,和完整 Cook–Torrance 高光分别在描述哪一层事情?

这不是考试,也不计时。写错、写一半或写「不知道」都有效;系统只保存学习行为,不会把完成操作冒充“已经掌握”。

你对这次回答有多确定?
1 = 几乎在猜 · 5 = 能解释,也能应对追问
给我一个不泄露答案的起点

先只回答:D 是整张材质的最终亮度,还是一个“朝向有多常见”的分布?

还是卡住:告诉我该分哪几类

把问题拆成三层:微表面朝向分布 D → 单点 BRDF → 灯光积分后的像素。

这些记录只存在当前浏览器 可以导出,也可以删除本题全部学习证据。

教学答案 · 首次回答锁定后再看 也允许跳过裸跑;系统会如实记录答案提前暴露
先把问题答上

你可以直接这样回答

约 30 秒

Roughness 主要改变微表面分布:低 roughness 高光尖, 高 roughness 高光宽;Metallic 改变 F0 和漫反射/镜面能量分配,金属会让高光带上 base color。两者都不能被当作简单亮度开关,我会用 NDF、F0、kD 和峰值/宽度证据说明。

这道题真正想听什么?

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

这题要把两个贴图通道放回不同的职责:Roughness 改微表面朝向分布和遮蔽,主要表现为高光的宽度、峰值和尾部;Metallic 改介电/金属的能量分配和 F0,主要表现为高光颜色与漫反射是否保留。它们都可能改变“看起来亮不亮”,但证据不同。

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

Shader 中 roughness 通常先变成 alpha,再进入 GGX 的 D 和 Smith G;这改变高光形状与遮蔽。Metallic 则参与 f0=mix(0.04,baseColor,metallic)kD,决定颜色和能量去哪。验证时固定光照,先做 roughness 表,再做 metallic 表,不让曝光掩盖变量。

面试官可能继续追问什么?补充自测 · 约 3 分钟 · 检查自己是不是真的懂了
  • 问:roughness=1 是完全不反光吗? 答:不是。反射能量仍在,只是高光非常宽、峰值低,受环境/灯光和 tone mapping 影响后可能不显眼。
  • 问:metallic=1 只是高光更亮吗? 答:不是。它改变 F0 和 kD,把 base color 带进反射,漫反射不再承担同样的能量。
  • 因果链: 贴图采样 → roughness²/metallic 分流 → D/G/F → N·L 与光源 → 高光形状/颜色。每一步都可用 debug 对照。
如果概念还是悬空,就去做实验关键证据 · 约 5–15 分钟 · 预测 → 单变量 → 观察

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

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

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

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

1. 先预测

PBR Lab 选择球体,固定 baseColormetallic=0.2lightIntensity=5,只拖 roughness,然后切 debugMode=NDF / D。预测高光像一块橡皮泥:粗糙度低时尖而亮,粗糙度高时宽而散。接着固定 roughness,只把 metallic 从 0 到 1,预测高光颜色染上 base color、漫反射退场。不要用“一个亮度条”去概括两种变化。

公式的口语翻译:

alpha = roughness²
D_GGX(h) = alpha² / (π · ((n·h)² · (alpha² - 1) + 1)²)

前半句是在说 shader 先把粗糙度变成微表面分布宽度;后半句是在半程方向 h 上数“小镜子有多集中”。粗糙表面不是减少所有能量,而是把峰值摊到更宽的方向。

老师追问

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

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

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

2. 再动手

PBR 代码页 固定灯和相机,记录 roughness 0.1/0.5/0.9 的高光峰值与覆盖宽度;再在 compose 固定 roughness,只记录 metallic 0/1F0kD 和高光色。两个表格不要混写,保证一次只改一个变量。

3. 最后对证据

NDF debug 中 roughness 增大时亮带变宽;brdf-energy 可能不按峰值直觉变化,说明“峰值”和“总能量”不是同一指标。metallic 增大时 base color 更多出现在镜面,漫反射减少。若粗糙度变化只造成整屏同色变暗,检查是否把 roughness 错接到最终颜色而非 D/G。

答案在代码哪里发生?实现定位 · 约 3 分钟 · 变量、函数和关键行
  • GGX NDF:roughness 先平方再进入 D
  • Smith G:粗糙表面在掠射角的遮蔽/阴影限制。
  • Fresnel 与 compose:metallic 参与 F0、kD 和最终能量路径。
完整 5 分钟版本面试扩展 · 约 5 分钟 · 项目边界、验证与降级

贴图验收会检查 roughness 线性采样、金属度通道的 0/1 约定、压缩误差和 mip 行为。根据平台可降低高光质量或法线细节,但保留材质身份的 F0/颜色特征;性能结论必须用目标设备 GPU/带宽复测。当前 Lab 的 shader 片段展示直接光照,未覆盖完整 IBL 过滤。

哪些说法最容易答歪?必看陷阱 · 约 1 分钟 · 面试前最后检查
  • 只说“roughness 越大越暗”,没有说明高光宽度和能量分布。
  • 用 metallic 补亮塑料,或用 roughness 补性能。
  • 把粗糙度贴图按 sRGB 解码,导致 alpha 分布错误。
  • 只看最终颜色,忽略 NDF/F0/kD 证据与灯光固定条件。