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

原题 Q02 · 当前收录 1 / 49

学习状态 未开始

PBR 与 BRDF 原理

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

面试官问

PDF 第 4 页

请详细解释迪士尼 PBR 材质模型的 BRDF 实现原理,与标准 Oren-Nayar 模型的核心差异是什么?(常问题,理清逻辑)

学习进度

0/9 已勾

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

先把题目说成人话

这道题表面上在问两个模型的区别,实际先要纠正比较对象:迪士尼原则材质是一整套材质方案,奥伦—纳亚只是其中“粗糙表面怎样漫反射”的一种算法。它们不能整套对整项地比较。

光照到一点表面后,程序要根据灯从哪边来、相机从哪边看,决定有多少光返回相机;这条方向规则叫双向反射分布函数(BRDF)。迪士尼原则材质(Disney Principled)把漫反射、镜面、金属、布料绒光和清漆等响应组织进一套美术参数。若只讨论粗糙漫反射,真正应与奥伦—纳亚(Oren–Nayar)比较的是其中的伯利漫反射(Burley Diffuse)。

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

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

先做一颗白色石膏材质球。场景里只有一盏可以绕球移动的灯,相机固定不动。为了只看漫反射,先关掉镜面、清漆和布料绒光。

灯在相机附近时,石膏球正面收到一片柔和的回光;灯移到侧面,那片亮区跟着挪动。现在提高“表面有多粗糙”,再重复同一条灯光路线。画面变化才是这道题真正要解释的部分。

(右脑)画面:把石膏球想成由无数粒细小粉末压成。灯光从正面照来时,许多朝向灯的小面把光送回眼睛;灯绕到侧面后,有些小面仍朝着灯,有些被邻近颗粒挡住,回到眼睛里的光重新分布。我们先只看这片柔和的回光,球边那道尖锐亮线暂时用黑布遮住,因为它属于另一种反光。

(左脑)对表:石膏球的柔和主体对应漫反射,尖锐亮线对应镜面反射。最简单的兰伯特漫反射只看表面与灯的夹角;伯利和奥伦—纳亚还会看观察方向与粗糙程度。因此公平比较必须固定颜色、法线、灯和相机,只替换漫反射算法。迪士尼的其他层先关闭,等比较结束再接回去。

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

小明直接在完整材质上切换公式。他看到球边有一圈亮光,便说奥伦—纳亚的漫反射更亮。

可是关闭镜面后,那圈亮光几乎消失了。刚才比较到的是掠射角增强的镜面反射,不是两种漫反射的差异。只看最终像素,很容易把不同层记到同一本账上。

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

小红保留同一颗非金属石膏球,并做三次观察。

第一次把表面设得接近光滑。奥伦—纳亚会回到兰伯特;伯利在球的大部分区域也很接近兰伯特,但掠射区域仍保留自己的经验修正,所以不能说两者在整个半球上完全相同。

第二次提高各自定义下的粗糙度。灯靠近相机方向时,奥伦—纳亚会表现出明显的回返反射;灯和相机方位错开后,这部分变弱。它来自“许多粗糙小面彼此遮挡、又把光送回来源附近”的统计模型。

第三次换成伯利。它同样让结果随灯、相机和粗糙度变化,但目标不同:它是根据实测材质拟合出的、适合统一美术工作流的平滑响应。这里不能把伯利的零到一粗糙度,直接当成奥伦—纳亚的小面斜率标准差;同名旋钮并不代表同一把物理尺。

我:用检查结果修正模型

现在可以正面回答原题:

  • 迪士尼原则材质不是单一漫反射公式,而是把多种反光组织起来的一套原则化材质模型;主镜面通常采用微表面分布,漫反射常用伯利项,还可加入绒光、清漆和各向异性等分量。
  • 伯利漫反射强调与整套材质参数配合,粗糙度是面向制作的工作流参数;奥伦—纳亚从粗糙小面的统计假设出发,粗糙度表示小面斜率分布。
  • 需要统一的角色和场景材质工作流时,伯利通常更顺手;需要突出粉笔、月壤等粗糙表面的回返反射时,可以评估奥伦—纳亚。
  • 最终仍要比较目标 Shader 的画面和 GPU 成本。模型名字不能直接推出谁一定更快,也不能推出谁在所有材质上一定更真实。

(右脑)画面修正:重新看那颗石膏球:外层的尖亮高光已经单独拿走,桌上只剩柔和的主体回光。奥伦—纳亚像从粉末颗粒的朝向和遮挡推算回光;伯利像为整间材质工作室整理出一只稳定、好用的粗糙度旋钮。两者都能让粗糙表面离开最简单的漫反射,但来路、参数含义和要服务的系统不同。

(左脑)严格对表:比较时,颜色 ρ\rho 在线性空间;NN、LL、VV、HH 是同一坐标空间中的单位方向,点积无量纲;角度以弧度进入三角函数。伯利粗糙度 rr 是无量纲工作流参数,奥伦—纳亚的 σ\sigma 是以弧度表示的小面斜率标准差,不能令 r=σr=\sigma 后宣称公平。固定输入并关闭其他层后,分别记录两种漫反射的曲线,再在完整材质中检查能量分配和目标设备成本。

老师解惑

到这里再看公式。完整的迪士尼原则材质可以先写成结构账本;它不是某个 Unity Shader 的逐行源码:

fDisney≈(1−m) fdiffuse+fspecular+(1−m) wsheenfsheen+0.25 wclearcoatfclearcoatf_{Disney}\approx (1-m)\,f_{diffuse}+f_{specular} +(1-m)\,w_{sheen}f_{sheen} +0.25\,w_{clearcoat}f_{clearcoat}

其中 mm 是金属度。式子只说明“有哪些账”,不保证每个引擎都保留相同分量,也不等于严格的物理层栈。主镜面通常使用 GTR2/GGX 微表面分布:

fspecular=DGGX GSmith FSchlick4 ∣N⋅L∣ ∣N⋅V∣f_{specular}=\frac{D_{GGX}\,G_{Smith}\,F_{Schlick}} {4\,|N\cdot L|\,|N\cdot V|}
  • DD 记录微表面法线朝向的分布,粗糙度决定高光宽窄。
  • GG 记录入射和出射方向上的遮蔽。
  • FF 是菲涅耳项:观察越接近掠射,镜面反射通常越强。
  • 清漆常用独立的 GTR1 波瓣,绒光用于布料般的掠射观感。具体引擎可能删减或改写这些层。

Oren–Nayar 常用的定性近似形式为:

fd=ρπ[A+Bmax⁡(0,cos⁡(ϕi−ϕo))sin⁡αtan⁡β]f_d=\frac{\rho}{\pi}\left[A+B\max(0,\cos(\phi_i-\phi_o))\sin\alpha\tan\beta\right] A=1−0.5σ2σ2+0.33,B=0.45σ2σ2+0.09A=1-\frac{0.5\sigma^2}{\sigma^2+0.33},\qquad B=\frac{0.45\sigma^2}{\sigma^2+0.09}

其中 σ\sigma 是以弧度表示的小面斜率标准差,α=max⁡(θi,θo)\alpha=\max(\theta_i,\theta_o),β=min⁡(θi,θo)\beta=\min(\theta_i,\theta_o)。当 σ→0\sigma\to0 时,A→1A\to1、B→0B\to0,模型严格回到兰伯特漫反射。

Burley Diffuse 常写成:

fd=ρπ[1+(FD90−1)(1−N⋅L)5][1+(FD90−1)(1−N⋅V)5]f_d=\frac{\rho}{\pi} \left[1+(F_{D90}-1)(1-N\cdot L)^5\right] \left[1+(F_{D90}-1)(1-N\cdot V)^5\right] FD90=0.5+2 r(L⋅H)2F_{D90}=0.5+2\,r(L\cdot H)^2

两个方括号相乘;rr 是无量纲的材质工作流粗糙度,它不是奥伦—纳亚的 σ\sigma。两种漫反射都带有 1/π1/\pi,因为 BRDF 表示“每单位入射辐照度、向每单位立体角返回多少辐亮度”,其量纲可写作 sr−1sr^{-1}。

  • 迪士尼原则材质:完整体系;不能直接与一个漫反射模型放在同一层级比较。
  • 伯利漫反射:迪士尼体系里的漫反射项,以实测外观和制作参数为导向。
  • 奥伦—纳亚:从粗糙小面的统计假设推导漫反射,并显式表现回返反射。
  • 工程边界:把漫反射接回镜面、清漆等分量时仍要检查总能量;不能孤立地把每层都调亮再相加。

工具分工

  • 漫反射对比实验:固定灯、相机和颜色,只切换兰伯特、伯利与奥伦—纳亚,先看方向差异。
  • Unity Frame Debugger:确认实际运行的 Pass 与 Shader 变体;它不能替代 GPU 计时。
  • Unity Profiler / RenderDoc:前者在目标 Player 中比较 GPU 时间,后者检查像素中间量和最终合成。

记忆钩子

先分清整套材质和其中一层:迪士尼不是奥伦—纳亚的同级对手,伯利漫反射才是。

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

下一步:验证这条因果

同一粗糙表面在 Burley 与 Oren–Nayar 下的可见差别。

教学边界:它不替代完整推导,也不代表所有项目都该换模型。

进入教学 Lab:「Diffuse BRDF:Lambert 到 Burley」