想象你是一位摄影师,走进一间专业摄影棚,桌上放着一瓶香水。你要把它拍出「广告大片」的质感:玻璃晶莹、液体剔透、瓶身的哑光标签恰到好处。老派的灯光师全凭经验和手感,一盏一盏灯试着打;而新一代灯光师则带着一张「测光表」和一本「布光手册」——他知道光线打到不同材质上会发生什么:多少被吸收、多少被反射、多少以什么角度弹出。只要按照这套物理规则来,换任何摄影棚、换任何打光角度,那瓶香水都稳得像真实世界里的东西。 这套「科学布光规则」,就是 PBR(Physically Based Rendering,物理渲染)。它先由 Cook-Torrance 模型告诉你光线如何在微观粗糙的表面上发生反射,再由 Disney 原则化模型把一堆复杂的物理公式,拧成美术师随手就能扭动的「傻瓜旋钮」。这篇文章,会带着你从「凭感觉调材质」升级为「按物理规律拍大片」。

岗位关联

掌握 PBR 是图形渲染从业者的基本功。学会它,你就能独立搭建出游戏、影视级别的写实材质管线,让作品质感瞬间跨过「塑料感」的分水岭,也让你在技术美术和渲染工程师的岗位上更有竞争力。

目录
  1. 可视化演示
  2. 概念起源:从「凭手感调灯」到「科学布光」
  3. 微表面理论:把表面放大一万倍看
  4. Cook-Torrance 模型:灯光师的三件法宝
  5. 三项核心因子:GGX、Smith、Schlick 三兄弟
  6. Disney原则化:把物理公式变成「傻瓜式旋钮」
  7. PBR实践流程:从摄影棚到工业流水线
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示PBR能量守恒、Cook-Torrance微表面BRDF三函数、GGX粗糙度参数及Fresnel-Schlick近似效应,侧边指标实时切换深入理解物理渲染核心原理。

本节配有交互动效(进入视口后自动加载,约 3KB)。

能量守恒:反射+折射≤入射光 PBR要求光照计算遵循物理定律:反射光能量不超过入射光 金属材质全反射无折射,非金属材质有反射和折射 E_reflected + E_refracted ≤ E_incident 能量守恒是PBR区别于经验模型的核心。

概念起源:从「凭手感调灯」到「科学布光」

老式摄影棚里,灯光师拍一瓶香水,靠的是几十年的手感:高光太亮就减一盏灯,反光太硬就加一张柔光纸。这套打法在固定场景里没问题,可一旦把香水搬到户外、换到黄昏,之前调好的参数全部作废,还得重新凭感觉来。传统的 Phong 等经验光照模型就是这样——它们是美术师手调的「临时配方」,看着差不多,但物理上经不起推敲:光可能被无中生有地放大,也可能在多个光源下叠出荒谬的亮度。

PBR 的核心理念,是给渲染世界装上一台「物理测光表」。它不再问「这个材质看起来应该多亮」,而是从真实世界的光学规律出发,建立一套自洽的数学描述。其中最重要的法则就是能量守恒:一束光打到表面,要么被反射出去,要么被吸收转化成热量,反射能量加上吸收能量永远等于入射能量,绝不允许光凭空变多。

反射方程(渲染方程)就是这台测光表的核心读数:

有了能量守恒和反射方程这两块基石,灯光师就不必再「盲调」了。只要把材质的 BRDF 描述准确,无论换到烈日还是烛光下,渲染引擎都能算出物理上可信的亮度。测光表已经就位,接下来要把「材质加工说明书」写清楚,这就是微表面理论登场的时候。

Lo(ωo)=∫Ωfr(ωi,ωo) Li(ωi) (ωi⋅n) dωi\displaystyle L_o(\omega_o) = \int_\Omega f_r(\omega_i,\omega_o) \, L_i(\omega_i) \, (\omega_i \cdot n) \, \mathrm{d}\omega_i
这个方程说的是:从某个方向看向材质表面时,最终看到的亮度,等于从四面八方打来的所有光线,先被表面材质「加工」一遍,再按角度加权汇总的结果。
  1. 出射亮度 L_o这就是渲染器最终要计算的像素颜色,即你从 $\omega_o$ 方向看过去,物体表面发出来的光有多亮。
    Lo(ωo)L_o(\omega_o)
  2. 入射光 L_i来自光源或环境的光线,从 $\omega_i$ 方向打到表面上,它是整个反射方程的「能量原料」。
    Li(ωi)L_i(\omega_i)
  3. BRDF 材质响应 f_r双向反射分布函数,形象地说就是材质的「加工说明书」——同一束光打上来,磨砂玻璃和镜子的加工方式完全不同。
    fr(ωi,ωo)f_r(\omega_i,\omega_o)
  4. 余弦加权与半球积分光倾斜照射时能量会被摊薄到更大的面积上,所以每个方向要用 $(\omega_i \cdot n)$ 加权,再在整个半球 $\Omega$ 上求和。
    (ωi⋅n) dωi(\omega_i \cdot n)\,\mathrm{d}\omega_i

微表面理论:把表面放大一万倍看

摄影师想拍出金属拉丝和哑光塑料的区别,靠的是灯光技巧,但本质原因是两种材料表面的微观结构完全不同。请你想象:任何物体表面如果放大一万倍,都不再是光滑的平面,而是布满沟壑与凸起,像一地破碎的镜片——每一块小镜片都是一个「微面元」(微表面元素),它们是完美的微观镜面,各自朝向不同的方向。

微表面理论的核心假设正是如此:宏观表面由无数微小的完美镜面组成。一束平行光打上去,有的微面元朝左反射、有的朝右反射,宏观上我们看到的就是一团模糊的反射。如果所有微面元的朝向都差不多,反射就聚集成一个清晰明亮的高光点;如果朝向七零八落,反射就散成一片柔和的哑光。这里的关键词是「统计」——宏观观感是海量微面元方向分布的统计结果。

这个统计由法线分布函数 D 来描述。D 是一个概率密度,它在整个半球上必须满足归一化条件:

微表面理论让「粗糙度」从一句模糊的口头禅变成有精确数学含义的物理量:粗糙度越大,D 的分布越扁平,光被散射得越开;粗糙度越小,D 的分布越尖锐,高光如同一颗钉子一样锐利。现在,测光表和显微镜都准备好了,是时候请出 PBR 的核心人物——Cook-Torrance 模型。

∫ΩD(h) (n⋅h) dωh=1\displaystyle \int_\Omega D(h) \, (n \cdot h) \, \mathrm{d}\omega_h = 1
这个公式说的是:所有微面元的法线方向加起来,恰好覆盖整个表面的面积,不会多出一块也不会少掉一块——就像打碎的镜子,碎片的面积总和仍等于原来那面整镜的面积。
  1. D(h) 法线分布密度它回答「单位方向空间里有多少微面元的法线恰好指向 h」——h 多的方向,反射就更集中。
    D(h)D(h)
  2. 角度计权 (n·h)微面元相对宏观法线 n 倾斜时,它在宏观平面上的有效投影面积会缩小,所以要乘上余弦因子,保证面积统计没有虚报。
    (n⋅h) dωh(n \cdot h)\,\mathrm{d}\omega_h
  3. 半球积分把所有可能的方向 Ω 全部遍历一遍,相当于把一地碎镜片的方向点全部数清。
    ∫Ω⋯ dωh\int_\Omega \cdots \,\mathrm{d}\omega_h
  4. 归一化等于 1概率密度总面积必须为 1,这是物理正确性的数学保障,也是后续所有 PBR 公式不自相矛盾的前提。
    ∫ΩD(h)(n⋅h) dωh=1\int_\Omega D(h)(n\cdot h)\,\mathrm{d}\omega_h = 1

Cook-Torrance 模型:灯光师的三件法宝

当摄影师布光时,桌上通常摆着三件法宝:柔光箱负责铺出均匀的底光,硬聚光灯负责打出锐利的轮廓,还得有反光板在暗部补一点细节。Cook-Torrance 模型也把材质对光的回应拆成了类似的三个部分,装进同一个框架——BRDF。它优雅地分开了「底光」和「高光」,用一套统一的物理公式描述从塑料到钢铁几乎所有材质。

BRDF 就是前面反射方程里的 f_r,它定量描述「一束光从 ω_i 方向打来,有多少能量被反射到 ω_o 方向」。Cook-Torrance 模型给出的 BRDF 分为两项:漫反射项 f_lambert 加上镜面反射项。后者是真正的重头戏,由 D、G、F 三个因子相乘,再除以一个几何校正分母:

这三件法宝各司其职,但又紧密咬合。缺少任何一件,高光要么亮得不真实,要么在掠射角产生违和的能量激增。接下来,我们把镜头推向 D、G、F 三位主演的特写,看看它们各自是如何工作的。

fr(ωi,ωo)=fLambert+D(h) G(ωi,ωo) F(ωi,h)4 (n⋅ωi)(n⋅ωo)\displaystyle f_r(\omega_i,\omega_o) = f_{Lambert} + \frac{D(h) \, G(\omega_i,\omega_o) \, F(\omega_i,h)}{4\,(n \cdot \omega_i)(n \cdot \omega_o)}
这个公式是 PBR 世界的地基之一。漫反射项负责「底色」,镜面项负责「光泽」,而 D、G、F 三个因子分别从法线分布、几何遮挡和菲涅尔效应三个角度,共同雕琢出高光的真实模样。
  1. 漫反射项 f_Lambert光进入材质内部,被吸收一部分后从四面八方均匀散射出来,形成物体沉稳的底色,与视角无关。
    fLambert=baseColorπf_{Lambert} = \frac{\text{baseColor}}{\pi}
  2. 半向量 h入射方向与视线方向的中间方向,只有法线恰好朝向 h 的微面元,才能把光从视线方向完美反射进眼睛。
    h=ωi+ωo∥ωi+ωo∥h = \frac{\omega_i + \omega_o}{\|\omega_i + \omega_o\|}
  3. D·G·F 三项乘积法线分布决定「有多少微面元能参与反射」,几何遮蔽决定「这些微面元有没有被邻居挡住」,菲涅尔项决定「不同角度下反射强度如何变化」。
    D(h) G(ωi,ωo) F(ωi,h)D(h)\,G(\omega_i,\omega_o)\,F(\omega_i,h)
  4. 分母 4(n·ωᵢ)(n·ωₒ)这是投影面积校正项,把微观尺度上微面元的面积换算回宏观表面面积,避免能量被重复计算或凭空放大。
    4 (n⋅ωi)(n⋅ωo)4\,(n\cdot\omega_i)(n\cdot\omega_o)

三项核心因子:GGX、Smith、Schlick 三兄弟

假如给 D、G、F 三兄弟分别贴一个标签,D 是「调度员」、G 是「保安」、F 是「变色龙」。调度员 D(法线分布函数)负责统计有多少微面元恰好朝向半向量 h;保安 G(几何遮蔽函数)负责检查这些微面元有没有被邻近凸起挡住,挡住的部分要把光扣下;变色龙 F(菲涅尔项)则随视角变化改变颜色和强度——你斜着看水面时,反光刺眼得睁不开眼,正是它在作怪。

D 的常见实现有 Beckmann 和 GGX 两种,其中 GGX(Trowbridge-Reitz)因为高光带有漂亮的「长尾」——从中心到边缘柔和衰减,而非生硬截断——成为游戏和影视业界的事实标准。GGX 的数学形式如下:

G 三弟的常见实现是 Smith 模型,它把遮蔽和阴影分成两个方向分别计算:视线方向的遮蔽 $G_1(\omega_o)$ 和光线方向的阴影 $G_1(\omega_i)$,两者相乘得到总的几何衰减。F 三弟则常用 Schlick 近似——一个成本极低却相当准确的公式:$F_{Schlick} = F_0 + (1-F_0)(1-n\cdot\omega_i)^5$,其中 F0 是垂直入射时的反射率,非金属约 0.04,金属则由 baseColor 直接决定。三兄弟协作,任何材质在不同光线、不同视角下,都能给出物理可信的高光表现。

DGGX(h)=α2π((n⋅h)2(α2−1)+1)2\displaystyle D_{GGX}(h) = \frac{\alpha^2}{\pi \left( (n \cdot h)^2 (\alpha^2 - 1) + 1 \right)^2}
其中 α 就是粗糙度的平方映射(α = roughness²)。α 越小,D 在 n·h=1 附近越尖锐,高光越集中;α 越大,D 的峰越矮越宽,高光就铺开成一片柔和的光晕。
  1. α 粗糙度参数它直接控制分布的宽窄,α 从 0.01 到 1.0,对应从镜面到磨砂的连续过渡。
    α=roughness2\alpha = \text{roughness}^2
  2. 点积 n·h衡量微面元法线与半向量的贴合程度,贴合度越高,该方向的微面元对高光的贡献越大。
    (n⋅h)2(n\cdot h)^2
  3. 分母平方结构正是这个平方项塑造出 GGX 特有的「尖峰 + 长尾」形态,让它比高斯型分布更接近真实材质的反射衰减。
    ((n⋅h)2(α2−1)+1)2\left((n\cdot h)^2(\alpha^2-1)+1\right)^2
  4. 系数 α²/π完成归一化,确保 D 在整个半球上的积分严格等于 1,守住能量守恒的底线。
    α2π\frac{\alpha^2}{\pi}

Disney原则化:把物理公式变成「傻瓜式旋钮」

物理学家给出的 Cook-Torrance 公式虽然精确,但对美术师来说就像一本天书:D 用什么分布?G 用哪个模型?F0 取多少?每个参数背后都是一大串数学。Disney 公司在 2012 年提出了「原则化 BRDF」(Principled BRDF),目标是把物理公式封装成调音台上的旋钮——美术师不需要理解 GGX 和 Smith,只需要扭动几个直觉化的参数,就能得到物理正确的材质。

Disney 模型的精妙之处,在于用少量语义明确的参数驱动底层复杂的物理计算:baseColor 决定材质的基础色,metallic 在「非金属/金属」两个通道间平滑过渡,roughness 控制微表面粗糙度,其余还有 IOR(折射率)、clearcoat(清漆层)等附加旋钮。每个旋钮的物理意义明确,互不干扰。它的漫反射项长这样:

Disney 模型的推广,让「物理正确」不再是研究员的专利。美术师调整材质时,凭借直觉拧旋钮即可获得可信结果,团队协作效率大幅提升——这正是它成为行业标准的原因。旋钮已经就位,下一节我们去片场看看这套流程如何真正运转。

fd=baseColorπ (1−Fd)(1−Fs)\displaystyle f_d = \frac{baseColor}{\pi} \, (1 - F_d)(1 - F_s)
这个式子的意思是:想把 baseColor 变成真正的漫反射颜色,先要除以 π 完成半球归一化,再乘上两个「透射补偿」因子——因为光在进出微表面的过程中,有一部分能量已经被镜面反射项「截胡」了,漫反射要把这部分能量让出去,才能保证总能量不超支。
  1. baseColor 基础色美术师从贴图里取到的颜色,是材质在平视、柔和光照下给人的第一印象色。
    baseColorπ\frac{baseColor}{\pi}
  2. 除以 π 归一化漫反射向半球所有方向均匀辐射,除以 π 保证所有方向的出射能量之和恰等于 baseColor。
    1π\frac{1}{\pi}
  3. F_d 漫反射菲涅尔根据粗糙度修正「光进入表面后被反射掉的比例」,粗糙度不同,漫反射的角向分布也不同。
    (1−Fd)(1 - F_d)
  4. F_s 镜面透射损失镜面反射项已经拿走了一部分能量,漫反射必须扣除这部分,两个因子相乘确保漫反射与高光之和不违反能量守恒。
    (1−Fd)(1−Fs)(1 - F_d)(1 - F_s)

PBR实践流程:从摄影棚到工业流水线

还记得那位拿着测光表的灯光师吗?他一个人的专业能力,如今被做成了标准化的工业流程:剧组里每个美术师都用同一套旋钮、同一套贴图规范,拍出来的画面自然风格统一。在 PBR 工作流中,材质不再是一堆意义不明的数值,而是几张语义明确的贴图:Albedo(基础色)、Normal(法线)、Metallic(金属度)、Roughness(粗糙度),四图合一就能驱动任意 PBR 渲染器。

整个流程中,最容易出错的是工作空间。渲染必须在「线性空间」中计算——因为物理光照是线性叠加的,而显示器需要 sRGB 非线性输出。PBR 管线因此包含一个关键公式:金属度工作流中,材质的基础反射率 F0 由 baseColor 和 metallic 线性插值得到:

生产流程最后一步是光照环节:PBR 场景需要配合 HDR(高动态范围)环境贴图,提供远超 0~1 范围的真实光照能量,再经过曝光和色调映射输出到屏幕。至此,从贴图生产、线性空间计算到 HDR 光照,一条完整的 PBR 流水线就搭建完毕了——灯光师已经退居幕后,规则替他完成了所有辛苦的推断。

F0=lerp(0.04, baseColor, metallic)=(1−metallic)×0.04+metallic×baseColor\displaystyle F_0 = \mathrm{lerp}(0.04, \, baseColor, \, metallic) = (1 - metallic) \times 0.04 + metallic \times baseColor
非金属材料对垂直入射光的反射率非常低,约 4%,对应那个神秘的 0.04;而金属的反射光直接带有金属本身的颜色,所以 F0 就是 baseColor。metallic 参数就像一个推杆,在「非金属」和「金属」两条通道之间平滑切换。
  1. 0.04 非金属基线绝大多数电介质(塑料、木头、皮肤)的垂直反射率都在 4% 左右,对应折射率约 1.5 的常见材质。
    0.040.04
  2. baseColor 金属本色金属的反射不经过漫反射染色,直接反射周围环境,因此反射颜色就是金属本身的颜色。
    baseColor\text{baseColor}
  3. metallic 插值系数metallic=0 时取非金属基线,metallic=1 时取金属本色,中间数值用于过渡混合,模拟金属漆等半金属表面。
    metallic\text{metallic}
  4. 线性插值 lerp这是一个取中间值的运算,结果始终落在两个端点之间,保证 F0 不会出现物理上不可能的取值。
    lerp(a,b,t)=(1−t) a+t b\mathrm{lerp}(a, b, t) = (1-t)\,a + t\,b

AI 应用场景

游戏引擎中的程序化材质生成

阶段:资产生产与材质生成

解决的问题:传统游戏项目中,美术师要手工为每个物体绘制 Albedo、Metallic、Roughness 四张贴图,再逐个调整参数反复渲染预览,几十个材质球要耗费数天。借助 PBR 规则,AI 模型可以分析一张真实照片,自动估计材质的反照率、粗糙度和法线信息,一键生成符合物理规律的贴图。

具体案例:在 Unity/虚幻引擎中,素材库团队接入 AI 材质估计工具:上传一张木地板的照片,工具自动输出 baseColor 贴图、roughness 贴图和法线贴图,并生成一个可直接拖入场景的 PBR 材质球。引擎在 HDR 环境下实时渲染,地板在不同时间的光照下都呈现真实木纹质感。

影视离线渲染中的 Look Development

阶段:光影开发与资产调试

解决的问题:影视渲染中,角色皮肤、汽车车漆、名贵首饰等材质对物理正确性要求极高,传统经验模型在复杂环境光下容易出现「失去质感」的塑料感。基于 Disney 原则化 BRDF 的离线渲染器,配合艺术家逐项雕琢 metallic、roughness、clearcoat 等参数,可以精确复现真实材质在环境中的光学表现。

具体案例:在一支汽车广告的制作中,LookDev 艺术家在 Arnold 渲染器里搭建 PBR 材质球,用 HDRI 摄影棚环境光点亮车身。清漆层参数让车漆拥有通透的「湿感」,金属度与粗糙度联动调出拉丝质感,最终渲染画面几乎无法与实拍区分。

Python 演示

python72 行
import math W, H = 200, 100CX, CY, R = 100, 50, 46  def normalize(x, y, z):    length = math.sqrt(x * x + y * y + z * z)    return x / length, y / length, z / length  def schlick_fresnel(f0, ndv):    return f0 + (1.0 - f0) * math.pow(1.0 - ndv, 5.0)  def ggx_ndf(ndh, roughness):    alpha = roughness * roughness    a2 = alpha * alpha    denom = ndh * ndh * (a2 - 1.0) + 1.0    return a2 / (math.pi * denom * denom)  def smith_g(ndl, ndv, roughness):    alpha = roughness * roughness    k = alpha * 0.5    g1v = ndv / (ndv * (1.0 - k) + k)    g1l = ndl / (ndl * (1.0 - k) + k)    return g1v * g1l  def cook_torrance(nx, ny, nz, vx, vy, vz, lx, ly, lz, base_color, roughness):    ndl = max(nx * lx + ny * ly + nz * lz, 0.0)    if ndl <= 0.0:        return 0.0, 0.0, 0.0    ndv = max(nx * vx + ny * vy + nz * vz, 0.0)    hx, hy, hz = normalize(lx + vx, ly + vy, lz + vz)    ndh = max(nx * hx + ny * hy + nz * hz, 0.0)    d = ggx_ndf(ndh, roughness)    g_smith = smith_g(ndl, ndv, roughness)    f = schlick_fresnel(0.04, ndv)    spec = d * g_smith * f / (4.0 * ndv * ndl + 1e-4)    diff = (1.0 - f) * ndl / math.pi    red = base_color[0] * diff + spec    grn = base_color[1] * diff + spec    blu = base_color[2] * diff + spec    return red, grn, blu  def main():    lx, ly, lz = normalize(0.7, -0.4, 0.9)    vx, vy, vz = 0.0, 0.0, 1.0    base = (0.62, 0.34, 0.72)    rough = 0.28    pixels = bytearray()    for y in range(H):        for x in range(W):            nx = (x - CX) / R            ny = (y - CY) / R            m2 = nx * nx + ny * ny            if m2 > 1.0:                pixels += bytes((28, 30, 44))                continue            nz = math.sqrt(1.0 - m2)            r, g, b = cook_torrance(nx, ny, nz, vx, vy, vz, lx, ly, lz, base, rough)            pixels += bytes((int(min(r, 1.0) * 255), int(min(g, 1.0) * 255), int(min(b, 1.0) * 255)))    with open("pbr_ball.ppm", "wb") as f:        f.write(b"P6\n%d %d\n255\n" % (W, H))        f.write(bytes(pixels))  if __name__ == "__main__":    main()
目的:用纯标准库实现一个迷你 PBR 球体渲染器,逐像素计算 Cook-Torrance BRDF(GGX + Smith + Schlick),并输出一张二进制的 PPM 格式图片。
  1. d = ggx_ndf(ndh, roughness)计算有多少微面元的法线恰好对齐半向量,这是高光形成的核心。
  2. g_smith = smith_g(ndl, ndv, roughness)用 Smith 模型计算微表面凹凸互相遮光的衰减。
  3. f = schlick_fresnel(0.04, ndv)用 Schlick 近似算出菲涅尔反射率,0.04 是非金属的垂直反射基线。
  4. spec = d * g_smith * f / (4.0 * ndv * ndl + 1e-4)三项因子相乘再除以分母,得到物理可信的镜面高光。
  5. diff = (1.0 - f) * ndl / math.pi漫反射要扣除被菲涅尔反射「截胡」的能量,保证总能量守恒。
  6. nx = (x - CX) / R把每个像素坐标换算成球面局部坐标,用来推出球面法线方向。
  7. nz = math.sqrt(1.0 - m2)球面方程解出法线的 z 分量,m2 大于 1 说明像素在球外。
  8. normalize(0.7, -0.4, 0.9)把光源方向缩放到单位长度,后续点积计算才成立。
  9. f.write(b"P6\n%d %d\n255\n" % (W, H))写出 PPM 二进制格式的文件头,声明图片尺寸和颜色深度。

常见误区

误区很多初学者以为 PBR 只是把 Blinn-Phong 换成 GGX,材质球看着亮晶晶就完事了,其他环节照旧。

正解PBR 是一整套物理工作流:能量守恒的反射方程、微表面理论、线性空间计算、HDR 光照、贴图规范,缺一不可。就像换了高级镜头但摄影棚还是漏光的,照片一样不真实。只改高光公式,换光源后材质依旧会穿帮。

为何常见:从视觉上看,PBR 和非 PBR 都能渲染出「光泽」,表面效果相似,让人误以为只是公式升级;而背后的物理管线是隐形的。

误区有人把 metallic 参数当成「亮度旋钮」,调到 1 觉得反光变强了,就说这就是金属。

正解metallic 的真实作用是切换材质通道:非金属时 F0 是 0.04,金属时 F0 等于 baseColor。金属确实反射更强,但漫反射几乎消失,表面看起来反而更「吃光」。乱调 metallic 只会得到油漆感的假金属。

为何常见:metallic 的中文名「金属度」听起来像个剂量旋钮,加上有些演示中金属确实更亮,容易造成直觉误导。

误区很多图形新手以为只要用上 PBR,任何灯光下画面都会自动好看,于是不再花心思设计光照。

正解物理正确等于「符合现实规律」,不等于「符合审美」。真实世界里也需要打光师。没有 HDR 环境贴图和合理的曝光、色调映射,PBR 材质照样会灰暗、过曝或死黑。

为何常见:PBR 的宣传语是「任何光照下都真实」,新手把「真实」误读成「好看」,忽略了光影设计始终是艺术创作的一部分。

误区有人把 roughness 贴图当作后期模糊工具,觉得它只是让高光边缘变柔。

正解roughness 是微表面法线分布的物理参数,它直接影响 NDF、几何遮蔽和菲涅尔计算,决定光能在宏观上如何重新分配。它不是 PS 里的高斯模糊,而是从微观几何层面改写反射行为。

为何常见:粗糙度高的表面看起来确实像「高光被模糊了」,这种视觉相似性让人把它类比成图像处理滤镜。

误区因为名字里带着 Disney,很多人以为这是一个商业闭源软件,只能在特定工具链使用。

正解Disney 原则化 BRDF 来自迪士尼动画工作室发表的公开论文,是开源可复现的数学模型,被 Arnold、VRay、虚幻引擎、Unity 等主流渲染器广泛集成,是行业共享的标准。

为何常见:品牌名称带来的直觉联想,加上迪士尼从未大力推广这篇论文的代码,导致外界误以为它是专有技术。

面试题

Q1. PBR 中 BRDF 描述的是什么?

单选题 · easy

  • A.光照强度的衰变规律
  • B.材质对光的散射与反射← 正确答案
  • C.相机成像的精度指标
  • D.阴影贴图的采样算法

答案:B。BRDF(双向反射分布函数)回答的是「一束光打来,材质往各个方向反射多少」,本质是材质的「光加工说明书」。A 描述的是光的衰减,C 属于成像环节,D 属于阴影算法,都与 BRDF 无关。

Q2. 微表面理论的核心假设是什么?

单选题 · easy

  • A.表面由无数完美镜面微元组成← 正确答案
  • B.表面是粗糙不透光的黑体
  • C.光线只在完全光滑时反射
  • D.表面完全吸收所有入射光

答案:A。微表面理论把表面想象成一地碎镜片,每个微面元都是完美镜面,宏观反射是海量微面元方向的统计结果。黑体假设、完全吸收假设与 PBR 的反射模型相悖,C 忽略了粗糙表面的漫反射。

Q3. Cook-Torrance 模型中菲涅尔项 F 主要描述什么现象?

单选题 · mid

  • A.表面法线的统计分布
  • B.微表面间遮挡造成的衰减
  • C.反射强度随视角的变化← 正确答案
  • D.漫反射颜色的浓淡程度

答案:C。菲涅尔效应指光线以掠射角入射时反射率显著上升,例如斜看水面反光刺眼。A 对应法线分布函数 D,B 对应几何遮蔽函数 G,D 与漫反射项相关,三者都不是 F 的职责。

Q4. 下列哪些项属于 Cook-Torrance BRDF 高光项的组成?

多选题 · mid

  • A.法线分布函数 D← 正确答案
  • B.几何遮蔽函数 G← 正确答案
  • C.菲涅尔项 F← 正确答案
  • D.环境光遮蔽贴图

答案:ABC。Cook-Torrance 高光项是 D×G×F 三因子乘积除以几何分母。环境光遮蔽贴图是预计算的低频阴影信息,属于光照烘焙资产,不属于 BRDF 公式的组成部分。

Q5. 在 GGX 法线分布中,参数 α(粗糙度)增大时,高光会怎样变化?

单选题 · mid

  • A.更窄更亮
  • B.更宽更暗← 正确答案
  • C.位置发生偏移
  • D.颜色整体变白

答案:B。α 增大意味着微面元方向分布更分散,能量被摊到更宽的角度范围,高光面积变大、峰值亮度降低。高光位置由光源与视线决定,与 α 无关,颜色由材质 baseColor 决定。

Q6. Disney 原则化 BRDF 中,metallic=1 时以下说法正确的是?

多选题 · hard

  • A.漫反射项几乎消失← 正确答案
  • B.F0 直接由 baseColor 决定← 正确答案
  • C.表面一定非常光滑
  • D.高光颜色接近 baseColor← 正确答案

答案:ABD。metallic=1 时,材质走金属通道:漫反射趋近于零,F0 等于 baseColor,金属的反射直接呈现本色。金属度与粗糙度是两个独立维度,金属也可以很粗糙,因此 C 错误。

Q7. PBR 反射方程中的余弦因子 (ωᵢ·n) 描述的是什么?

单选题 · mid

  • A.光源色温的余弦调整
  • B.掠射角入射时辐射量衰减← 正确答案
  • C.阴影贴图的采样偏移
  • D.相机聚焦平面的倾斜角

答案:B。这个余弦因子来自朗伯余弦定律:光倾斜照射时,同等光束能量被分摊到更大面积,单位表面接收的能量按 cosθ 衰减。它是几何投影效应,与色温、阴影采样、相机聚焦无关。

Q8. 非金属材质在垂直入射时的基础反射率 F0 通常近似为多少?

单选题 · easy

  • A.1.0,表示完全镜面反射
  • B.0.04,约 4% 的基础反射← 正确答案
  • C.0.5,一半反射一半吸收
  • D.1.33,水的折射率

答案:B。绝大多数电介质(塑料、木材、皮肤)折射率约 1.5,对应的垂直反射率约 4%,即 F0≈0.04。1.0 是全反射镜面,0.5 无物理依据,1.33 是水的折射率而非反射率。

Q9. 下列哪些做法符合 PBR 工作流规范?

多选题 · hard

  • A.光照在 sRGB 空间直接计算
  • B.使用 HDR 环境贴图提供光照← 正确答案
  • C.金属度贴图兼当亮度调节
  • D.光照计算保持在线性空间← 正确答案

答案:BD。物理光照是线性叠加的,必须在线性空间计算,最后再转换到 sRGB 输出;HDR 环境贴图提供超出 0~1 的真实能量。在 sRGB 空间计算会产生错误的光照混合,金属度贴图只负责材质分类,不能兼任亮度调节。

Q10. PBR 中漫反射与高光项的总能量不超过入射能量的保障,主要来自什么设计?

单选题 · hard

  • A.漫反射乘以 (1-F) 的透射补偿← 正确答案
  • B.高光强度乘以粗糙度系数
  • C.直接除以统一的常数 4π
  • D.乘以 AO 环境光遮蔽贴图

答案:A。菲涅尔项已经把一部分能量分配给了镜面反射,漫反射必须乘以 (1-F) 把这份能量让出去,两项相加才不会超过入射光。乘以粗糙度或常数只能改变亮度分布,AO 贴图描述的是环境遮挡,都不是能量守恒的根本保障。