跳到主要内容
腾讯题库 · Q03

原题 Q03 · 当前收录 2 / 49

学习状态 未开始

Metallic 与 Albedo

概念理解 PBR · material 对应课程:PBR 与光照

面试官问

PDF 第 6 页

在 PBR 工作流中,金属度(Metallic)为 1 的物体,其 Albedo 贴图应如何处理?若绘制一块纯黑煤炭,Albedo 值应为多少?(必问题,理清逻辑)

学习进度

0/9 已勾

只保存在这台浏览器;勾满 9 项即视为本题完成。

先把题目说成人话

拿手电同时照铜片、黑塑料和煤块,三者都可能出现亮点;可亮点并不能告诉你“它就是金属”。如果为了让煤更亮而把它设成金属,或因为煤很黑就把颜色填成绝对零,它在不同环境里会像错误的金属块或失去全部表面层次。现实要解决的是:先认清材料身份,再决定颜色走向哪一种反光。

材质的基础颜色输入叫基础颜色(Base Color,也常写 Albedo),控制金属与非金属能量路径的参数叫金属度(Metallic),控制高光摊宽程度的参数叫粗糙度(Roughness)。光照计算使用的颜色值叫线性颜色(Linear Color),贴图文件常用的存储编码叫标准红绿蓝编码(sRGB);同一块煤在这两个口径下不会写成同一个数字。

这是虚构教学故事,不是个人项目经历。

场景:先让问题变得看得见

桌上放一块铜片和一块煤。铜片的 Base Color 是铜的有色反射;煤的 Base Color 是暗色漫反射。两者都可能有高光,却走不同的能量路径。

先看整体关系:Metallic 越接近 1,漫反射那只桶越空,Base Color 越多地转去给镜面反射着色;越接近 0,Base Color 越像表面自身的漫反射颜色。

(右脑)画面:同一盏灯下放着一片铜、一块黑塑料和一块煤。慢慢转动它们,铜的亮处带着铜色;黑塑料虽然很黑,表面仍会掠过一小片白亮;煤也不是吞掉一切的黑洞,凹凸和细碎亮点仍让你看得见它的表面。再把它们磨粗,亮点会散开,却没有一件东西因此变成另一种材料。

(左脑)对表:本题要区分三个对象:材质的导体/电介质身份、线性光照计算中的 Base Color、贴图文件里的 sRGB 编码值。煤有高光是观察事实,“所以煤是金属”是假设;常见工作流里的电介质 F0≈0.04F_0\approx0.04 是模型近似,不是煤的 Base Color。证据应来自受控实物参考、扫描或项目材质规范,例值必须注明颜色空间与曝光,线性 0.03 与 sRGB 约 0.19 不能混报;分流阀只是因果类比,类比不等于证明。

小明:先形成一个完整猜测

小明认为:“煤会反光,所以 Metallic 应该拉高;既然叫纯黑煤炭,Base Color 就填 0。”

这个猜测把“有高光”和“是金属”混在一起。塑料、湿石头和煤都能有镜面反射;是否为金属取决于导体/电介质身份,不取决于高光是否明显。Metallic=0 时把 Base Color 填成绝对零,会让漫反射基色归零并吞掉煤的表面层次;但电介质镜面 F_0 仍然存在,所以它不是“完全没有反射”的洞。

小红:把猜测放回现实检查

小红先固定 Base Color 和粗糙度,只切换 Metallic:

  • Metallic 为 0 时,Base Color 进入漫反射;镜面 F0F_0 保持电介质范围,通常近似 0.04。
  • Metallic 为 1 时,漫反射趋近零,Base Color 用来给镜面 F0F_0 着色。铜、金等金属因此有带颜色的镜面反射。

再固定 Metallic 为 0,只比较煤的 Base Color。数学意义的纯黑是 0;现实煤炭不是数学纯黑。用于理解的假设例值可以取线性空间 0.02–0.05;按标准 sRGB 编码约为 0.15–0.25。例如线性 0.03 转成 sRGB 约为 0.19。这个范围不是煤炭认证标准,只说明“很黑”不等于数值零;最终应由受控光照下的实物参考或扫描数据决定。

我:用检查结果修正模型

我给铜片使用 Metallic 1,Base Color 表示铜的镜面反射颜色;给普通煤使用 Metallic 0,以暗但非零的 Base Color 表示漫反射,并单独调整 Roughness 控制高光宽度。

煤表面若湿润或有亮晶晶的夹杂,应通过粗糙度变化、法线和必要的分层材质表现,不应为了“更亮”把整块煤改成金属。项目使用 Linear Color Space,且 Base Color 贴图启用 sRGB 标记时,Unity 会在采样时把它解码到线性空间参与光照;Gamma Color Space 项目不能这样概括。数字必须和项目色彩空间及贴图导入语义一起记录。

(右脑)画面修正:小明因为煤会闪亮,就把它当成金属,又把颜色压到绝对的零,结果煤块变成一团没有表面的死黑。小红把灯光固定下来重新看,才发现“有亮点”和“是金属”并不是一回事。普通煤仍应保留暗部里的细微颜色和层次;湿润表面或晶体带来的闪点,也不会改变整块煤的材料身份。

(左脑)严格对表:材质设置依次检查:先按实物与项目规范判定 Metallic 的 0/1 身份;再在线性空间确定 Base Color 反射率范围;若贴图标为 sRGB,确认 Unity 在进入光照前完成解码;最后独立调整 Roughness、Normal 与必要的分层。验收时固定灯光、曝光和相机,比较材质球与实物参考,并同时记录线性值和纹理编码值;不得把数学纯黑 0、常见电介质 F0F_0 与现实煤炭颜色写成同一个数。

老师解惑

在把电介质 F0F_0 固定为 0.04 的常见 metallic-roughness 工作流中,可以用下面两条关系表达这次分流:

F0=lerp⁡(0.04, BaseColor, Metallic)F_0=\operatorname{lerp}(0.04,\ BaseColor,\ Metallic) DiffuseColor=BaseColor (1−Metallic)DiffuseColor=BaseColor\,(1-Metallic)

这里的 0.040.04 是常见电介质法向入射镜面反射率的近似,不是所有非金属的 Base Color。

  • Base Color / Albedo:在 metallic 工作流里是统一输入;它在非金属上主要给漫反射着色,在纯金属上主要给镜面 F0F_0 着色。
  • Metallic:描述材质在金属与非金属两种能量路径之间的混合。现实表面通常倾向 0 或 1,过渡值常用于边界、混合或抗锯齿。
  • Roughness:控制镜面波瓣宽窄,不负责决定材质是不是金属。
  • 煤炭口径:通常按非金属处理;暗色范围应由参考决定,不能把电介质 F0=0.04F_0=0.04 误抄成煤的 sRGB Base Color。

工具分工

  • Unity Material Inspector:核对 Metallic、Base Map 和 Smoothness/Roughness 的通道与颜色空间。
  • PBR 材质校准场景:在固定曝光、灰球和已知环境光下比较材质身份。
  • Frame Debugger / RenderDoc:检查贴图是否按 sRGB 解码,以及最终材质参数是否进入预期的 Shader 路径。

记忆钩子

金属把 Base Color 送进镜面,煤把暗色送进漫反射;“0.04”先问是谁的数、在哪个颜色空间。

这是教学场景,不是目标项目的真实捕获或个人经历。

下一步:验证这条因果

看见高光异常时,能判断是谁改了能量。

教学边界:它只验证这一条画面因果,不替代完整答案、项目经历或目标设备数据。

进入教学 Lab:「PBR:把一束光拆成可解释的能量」