想象你站在一个黑色剧场里,一束追光打向舞台中央的“神奇墙面”——那面墙可能是锃亮的金属门,可能是粗糙的乳胶漆,也可能是贴了壁纸的石膏板。观众的每一次注视,都像一群提着灯笼的访客跑到墙面前:墙面决定谁能被接待、又该让多少“光”作为回礼弹进你的眼睛。传统渲染靠美术一个个“手绘”灯光效果,费时且容易失真;而 PBR(基于物理的渲染)给墙面装了一套标准接待手册——光怎么量化、微表面怎么散射、金属和涂料怎么区分、环境光怎么预计算。从渲染方程到引擎落地,这套手册让画面无论在 Unity 还是 UE5 里都保持一致的真实感。

岗位关联

理解 PBR 物理渲染管线,是进入实时渲染与 AI 数字内容生成领域的“光照基本功”,也是技术美术、渲染工程师做引擎选型与材质调优的决策核心。

目录
  1. 可视化演示
  2. 光照基础:光从哪来
  3. 微表面理论:墙面上的镜片拼图
  4. BRDF模型:材质的回礼手册
  5. 金属度工作流:金属还是涂料
  6. 粗糙度与法线:打磨与浮雕
  7. IBL环境光照:环幕天光
  8. 引擎实现对比:两套施工队
  9. 材质调优实践:灯光师验收
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

交互展示PBR渲染的BRDF微表面光照模型、金属度粗糙度材质工作流及IBL环境光照预计算过程。

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

BRDF:微表面光照模型 入射光经微表面法线散射后按BRDF分布反射 半程向量H决定镜面反射峰值强度 f_r = D(h)·G(l,v)·F(h) / (4·|n·l|·|n·v|) Cook-Torrance BRDF通过D(GGX)分布函数模拟微表面散射实现物理真实渲染

光照基础:光从哪来

想象舞台上那束追光:灯光师先要回答“每盏灯到底送来了多少光”。他拿着一台辐照度计,把镜头对准四面八方——记录的读数,就是光的“数量”。辐射度量学做的就是这件事:它把光按方向、面积、立体角量化,让“这束光有多亮”不再是感觉,而是数字。光源也因此分成几种来客方式:远得几乎平行的方向光(太阳)、能算衰减的点光、还有带锥角的聚光,就像访客有的排着齐整方队,有的从四面八方蜂拥而至。

但光来了还不够,墙面得回答“这些光最后能留下什么”。把所有方向进来的光、墙面逐一的回应全部加起来,就是渲染方程——它是整个 PBR 大厦的地基,后面的 BRDF、微表面理论,都是在替这个方程填细节。

渲染方程就是接待手册的总纲:先数清每个方向的来客,再按规则回礼。后面的所有 PBR 知识,都在逐页填写这本手册的细节——微表面怎么接待、金属怎么区别对待、环境光怎么偷懒。

Lo(v)=Le(v)+∫Ωf(l,v) Li(l) (n⋅l) dl\displaystyle L_o(v) = L_e(v) + \int_{\Omega} f(l, v)\, L_i(l)\, (n \cdot l)\, dl
这个方程说:你看到的光 = 表面自己发的光 + 半球方向所有入射光经材质反射后的总和。
  1. 输出项 \( L_o(v) \)观众沿 \( v \) 方向看过去,最终收到的那份“光回礼”。
    Lo(v)L_o(v)
  2. 自发光项 \( L_e(v) \)表面自己点亮的光,比如屏幕像素本身在发光。
    Le(v)L_e(v)
  3. 半球积分 \( \int_{\Omega} \)把表面上方的整个半球方向都扫一遍,把所有来客逐个登记。
    ∫Ω⋯ dl\int_{\Omega} \cdots \, dl
  4. 入射光照 \( L_i(l) \)从方向 \( l \) 到达表面的光能量。
    Li(l)L_i(l)
  5. 材质响应 \( f(l, v) \)墙面“接待规则”,即 BRDF——从 \( l \) 进、往 \( v \) 出。
    f(l,v)f(l, v)
  6. 余弦衰减 \( n \cdot l \)光斜射时能量摊到更大面积,看起来更暗。
    (n⋅l)(n \cdot l)

微表面理论:墙面上的镜片拼图

把神奇墙面放大一万倍,你会发现它根本不是平的,而是无数凹凸不平的小镜片挤在一起——像一张砂纸,又像揉皱的锡纸。每片小镜片都朝自己的方向,这就是微表面。光打在墙面上,实际是在和这片“镜片拼图”打交道:有的镜片恰好把光反弹进观众的眼睛,于是形成亮斑;有的镜片朝向另一边,光就跑到别处去了。

所以研究反射,本质是研究“镜片朝向的统计学”。法线分布函数(NDF)回答:在所有微法线里,有多大比例正好朝向中间向量 \( h \)?GGX(Trowbridge-Reitz)是目前最流行的 NDF——它用一个参数 \( \alpha \) 控制分布峰的宽窄,峰越尖,高光越锐利。另外还有两个配角:几何遮蔽 \( G \) 描述凹凸互相遮挡导致边缘变暗,菲涅尔 \( F \) 描述掠射角时反射变强。它们三兄弟共同撑起微表面故事。

打磨墙面,就是让千万个小镜片方向趋于一致,反射自然锐利如镜;喷砂则让它们杂乱无章,光被均匀丢向四面八方。GGX 正是描述这两种状态之间的平滑过渡的数学工具。

D(h)=α2π((n⋅h)2(α2−1)+1)2\displaystyle D(h) = \frac{\alpha^2}{\pi\left((n \cdot h)^2(\alpha^2 - 1) + 1\right)^2}
这是 GGX 法线分布:当粗糙度很小,\( D(h) \) 在正对方向出现又尖又高的峰;粗糙度增大,峰变矮变胖。
  1. 中间向量 \( h \)入射方向与出射方向折半后的方向,只有微法线朝向它才能产生镜面反射。
    h=l+v∥l+v∥h = \frac{l + v}{\|l + v\|}
  2. 粗糙度参数 \( \alpha \)美术给的 roughness 先平方,让高光边缘过渡更自然。
    α=roughness2\alpha = \mathrm{roughness}^2
  3. 法线夹角 \( (n \cdot h) \)微法线与墙面平均法线的点积,衡量镜片偏离平均朝向的程度。
    (n⋅h)(n \cdot h)
  4. 分母平方项用平方把分布塑造成“中间高、两边快速衰减”的高斯式峰形。
    π((n⋅h)2(α2−1)+1)2\pi\left((n \cdot h)^2(\alpha^2 - 1) + 1\right)^2

BRDF模型:材质的回礼手册

接待手册终于翻到正文:BRDF(双向反射分布函数),全名很长,但职责很单纯——规定“从 \( l \) 方向来的光,经过墙面,会以多大比例飞向 \( v \) 方向”。好比访客从哪个门进、要求从哪个窗出去,接待处只给一张“转换票据”。

PBR 最常用的 BRDF 是 Cook-Torrance 模型,它把回礼分成两大袋:一袋是漫反射项,像乳胶漆墙面把光照均匀嚼碎吐向所有方向,因此无论从哪个角度看颜色都一样;另一袋是镜面反射项,像金属门板只朝特定方向抛回光线,成为高光。两袋能量占比由金属度和菲涅尔共同决定。

漫反射是涂料墙的“慷慨”——无论从哪看都一样;镜面反射是金属板的“挑剔”——只朝特定方向抛出耀眼光束。Cook-Torrance 让这两种性格在同一面墙上按物理比例和平共处。

f(l,v)=kd cπ+F D G4 (n⋅l) (n⋅v)\displaystyle f(l, v) = k_d\, \frac{c}{\pi} + \frac{F\, D\, G}{4\,(n \cdot l)\,(n \cdot v)}
左边是完整 BRDF,右边第一项是漫反射,第二项是镜面反射:菲涅尔 F、法线分布 D、几何遮蔽 G 的乘积除以角度归一化分母。
  1. 漫反射系数 \( k_d \)总能量中走漫反射通道的比例,非金属较大,金属几乎为零。
    kdk_d
  2. Lambert 漫反射项 \( c/\pi \)把表面固有颜色 \( c \) 均匀洒向半球,\( \pi \) 是归一化常数。
    cπ\frac{c}{\pi}
  3. 镜面项分子 \( F\,D\,G \)菲涅尔决定反射强度,法线分布决定方向集中度,几何遮蔽修正凹凸遮挡。
    F⋅D⋅GF \cdot D \cdot G
  4. 归一化分母 \( 4(n\cdot l)(n\cdot v) \)用入射角与出射角的余弦乘积校准能量,避免光照溢出过亮。
    4 (n⋅l) (n⋅v)4\,(n \cdot l)\,(n \cdot v)

金属度工作流:金属还是涂料

装修现场最需要分清两样东西:金属门板和乳胶漆墙。金属门板会把周围环境颜色整块映出来,几乎没有自己的固有色;乳胶漆墙则把光“嚼碎”,混进自己的颜色再吐出来。用 PBR 的话说:金属的导电性让光只能反射,不能渗入表面形成漫反射;非金属的绝缘特性则允许光进入内部散射。

金属度工作流正是从这个直觉出发:metalness = 1 时,漫反射通道被彻底关闭,镜面反射的 F0 直接取 baseColor(于是金属的固有色其实就是环境反射的颜色);metalness = 0 时,反射强度固定在约 4%,剩下 96% 走漫反射。美术只需画一张灰度金属度贴图,就能让铁锈、油漆、镀铬在同一物体上无缝过渡。

判断墙面是金属还是涂料,接待手册的写法完全不同:金属直接映出环境,涂料先染色再吐出。金属度贴图就是挂在墙上的“门牌号”,PBR 靠它一键切换两套接待逻辑。

F(θ)=F0+(1−F0)(1−cos⁡θ)5\displaystyle F(\theta) = F_0 + (1 - F_0)\left(1 - \cos\theta\right)^5
菲涅尔-施利克近似:垂直看表面时反射率是 F0,越贴近掠射角,反射率越趋近 1——所有材质在斜视时都像镜子。
  1. 基础反射率 \( F_0 \)垂直入射时的反射比例,金属取 baseColor 着色,非金属恒定为 0.04。
    F0F_0
  2. 掠射修正 \( (1-\cos\theta)^5 \)随着视线与法线夹角增大,反射率以五次方速度飙升。
    (1−cos⁡θ)5(1 - \cos\theta)^5
  3. 金属与非金属的 \( F_0 \)金属的 F0 是有颜色的向量,非金属是均匀的 0.04 标量——这就是金属自带“环境镜面”的原因。
    F0,metal=baseColor,F0,dielectric=0.04F_{0,\text{metal}} = \mathrm{baseColor}, \quad F_{0,\text{dielectric}} = 0.04

粗糙度与法线:打磨与浮雕

灯光师手里有两把刷子。第一把是“打磨程度”——粗糙度,它决定反射光收回来的形状:墙面打磨得像镜面,高光一点;墙面喷砂成磨砂玻璃,高光晕成一大片。第二把是“贴壁纸”——法线贴图,它用 RGB 编码微表面的朝向,让一块平面假装有砖缝、铆钉和划痕,却不增加任何真实几何。

两者分工明确:粗糙度控制光的“散开程度”,法线贴图控制光的“朝向细节”。在 GGX 里,粗糙度会先被平方成 \( \alpha \),再代入法线分布函数——这一步看似简单,却决定了高光边缘是从“锐利”到“柔滑”的视觉过渡,而法线贴图则通过改变每像素的 \( n \) 值,让 GGX 的峰整体倾斜,模拟凹凸带来的明暗变化。

打磨和贴壁纸双管齐下:墙面既能反射出窗外轮廓,又能浮现砖缝的立体感。两者配合时,先定粗糙度再叠法线,才能避免“高光在浮雕上乱跳”的违和感。

α=roughness2,D(h)=α2π((n⋅h)2(α2−1)+1)2\displaystyle \alpha = \mathrm{roughness}^2, \qquad D(h) = \frac{\alpha^2}{\pi\left((n \cdot h)^2(\alpha^2 - 1) + 1\right)^2}
粗糙度影响 \( \alpha \),进而重塑法线分布的形状;法线贴图则通过修改像素的法线 \( n \) 来倾斜这个分布。
  1. 美术参数 roughness取值范围 0 到 1,0 是镜面,1 是全哑光。
    roughness\mathrm{roughness}
  2. 平方映射 \( \alpha \)把粗糙度平方,让高光在“几乎光滑”区间有更细腻的过渡。
    α=roughness2\alpha = \mathrm{roughness}^2
  3. 代入 GGX 分子分母\( \alpha \) 越小,D 的峰越高越尖;\( \alpha \) 越大,峰越矮越宽。
    D(h)=α2π((n⋅h)2(α2−1)+1)2D(h) = \frac{\alpha^2}{\pi\left((n \cdot h)^2(\alpha^2 - 1) + 1\right)^2}

IBL环境光照:环幕天光

舞台不只靠一束追光。真正让观众身临其境的,是四周环幕投影播放的全景照片——墙面被四面八方微弱的环境光包围。这就像晴天站在广场,头顶的天空、脚下的地面、周围的建筑都在向你发射光线。实时渲染不可能逐束计算,于是聪明的灯光师采用“预布光”:提前把环境贴图卷积成一张张模糊等级不同的图,存进 mipmap——模糊程度恰好对应不同粗糙度。

这就是基于图像的光照(IBL)。漫反射部分用球谐函数压缩成几个系数,运行时三五个浮点运算即可还原低频环境光;镜面部分则根据粗糙度选择对应 mip 层做一次纹理采样。原本要循环几千次的积分,被压成了“查一次表”。

环幕影片提前拍好、提前柔化,演出时一键开灯,墙面立刻被环境包围。IBL 的精髓就是“把复杂留给人少的时候”——预计算的每一分努力,都在为运行时省下百倍开销。

Lprefilter(v,r)≈∫ΩLi(l) f(l,v,r) (n⋅l) dl\displaystyle L_{\text{prefilter}}(v, r) \approx \int_{\Omega} L_i(l)\, f(l, v, r)\, (n \cdot l)\, dl
预滤波公式:每种粗糙度都对应一张把原有 BRDF 卷积好的环境图,运行时按粗糙度取对应层级。
  1. 预滤波结果 \( L_{\text{prefilter}} \)把环境光与 BRDF 的卷积提前算好,存成一系列模糊贴图。
    Lprefilter(v,r)L_{\text{prefilter}}(v, r)
  2. 环境入射光 \( L_i(l) \)来自环幕四面八方每个方向的光强度。
    Li(l)L_i(l)
  3. 粗糙度相关 BRDF \( f(l, v, r) \)不同粗糙度对应不同的卷积核,粗糙度越大模糊越狠。
    f(l,v,r)f(l, v, r)
  4. 运行时查表roughness 映射到 mip 层:
    mip_level≈roughness×(maxMip−1)\mathrm{mip\_level} \approx \mathrm{roughness} \times (\mathrm{maxMip} - 1)

引擎实现对比:两套施工队

同一份设计图纸,交给两个施工队会得到不同的施工方案。Unity HDRP 队偏爱“探针阵 + 反射探针”的经典打法:在场景里埋一圈探针记录光照快照,再用屏幕空间反射(SSR)补细节。UE5 的 Lumen 队则像全场铺满雷达:用软件光线追踪把光的弹跳实时重算出来,连间接光照都是动态的。两队读的是同一本渲染方程手册,工程取舍却截然不同。

HDRP 的优势是可控:反射探针数量、SSR 步数、探针更新频率都能按项目性能预算精确调节。Lumen 的优势是省心:门窗一改,光照立刻跟着变,适合开放世界。但 Lumen 的逐像素开销更高,在低端机上需要降低分辨率或依赖硬件光追;HDRP 则在移动端有更成熟的 LOD 与烘焙流程。

两个施工队的目标一致:把渲染方程变成每像素几行指令。差别只在预算:HDRP 精打细算、步步为营;Lumen 大动干戈、实时重算。选谁,取决于舞台规模和票价(硬件成本)。

Lo(v)≈1N∑k=1Nf(lk,v) Li(lk) (n⋅lk)\displaystyle L_o(v) \approx \frac{1}{N} \sum_{k=1}^{N} f(l_k, v)\, L_i(l_k)\, (n \cdot l_k)
实时引擎把连续积分化成有限个方向的离散求和:N 越大越准,但 GPU 越吃力——两队都在 N 与画质之间找平衡。
  1. 连续积分变求和 \( \frac{1}{N}\sum_{k=1}^{N} \)用有限个采样方向近似半球积分。
    1N∑k=1N\frac{1}{N} \sum_{k=1}^{N}
  2. 逐项求值 \( f(l_k, v) L_i(l_k)(n\cdot l_k) \)对每个采样方向做一次完整 BRDF 计算。
    f(lk,v) Li(lk) (n⋅lk)f(l_k, v)\, L_i(l_k)\, (n \cdot l_k)
  3. 实时引擎的策略N 小就靠预计算和降噪补救——HDRP 用探针预烘焙,Lumen 用时空降噪。
    N路径追踪≫N实时引擎N_{\text{路径追踪}} \gg N_{\text{实时引擎}}

材质调优实践:灯光师验收

验收环节,灯光师拿着测光表绕墙三圈:高光是否死白?金属是否发闷?暗部是否一片死黑?PBR 调优同样是围着参数转:第一步先定金属度——把墙面归成金属或非金属两类;第二步调粗糙度——控制高光的锐利程度;第三步用 HDR 环境和定向光验证,看反射是否自然。

调优背后有一条不可逾越的底线:能量守恒。反射出去的能量不能超过进来的能量。用金属度分配漫反射与镜面反射的占比,本质上就是在守住这条物理红线。违反它,材质会“越调越亮”,最后整体过曝。

物理正确是底线,“演出效果”才是目标。灯光师最终要让一块普通墙面在镜头前既真实又好看:在能量守恒的约束内,把金属度、粗糙度、环境光三颗旋钮拧到恰到好处。

kd=(1−F0) (1−metalness),ks=1−kd\displaystyle k_d = (1 - F_0)\,(1 - \mathrm{metalness}), \qquad k_s = 1 - k_d
能量守恒:金属度越高,漫反射占比 k_d 越小;剩下的能量全部进入镜面反射通道。
  1. 漫反射比例 \( k_d \)非金属(metalness=0)时 k_d 约 0.96,金属(metalness=1)时归零。
    kd=(1−F0) (1−metalness)k_d = (1 - F_0)\,(1 - \mathrm{metalness})
  2. 镜面比例 \( k_s \)与 k_d 互补,金属越高镜面越占主导。
    ks=1−kdk_s = 1 - k_d
  3. 守恒约束两通道加起来必须等于 1,防止能量凭空增加。
    ks+kd=1k_s + k_d = 1

AI 应用场景

AI 生成 PBR 材质贴图

阶段:内容生产与资产生成

解决的问题:传统美术手绘 baseColor、metallic、roughness 贴图往往要数小时,且不同画师对“金属度 0.8”的理解不一致,导致同一场景风格割裂。AI 可以直接从单张照片或文本描述生成整套 PBR 贴图,物理参数天然对齐 PBR 工作流。

具体案例:项目组用扩散模型从一张旧沙发照片生成整套贴图——反照率贴图保留了布纹,金属度贴图近乎纯黑(因为布料是非金属),粗糙度贴图在 0.7~0.9 之间波动。导入 Unity HDRP 后,沙发在 IBL 环境下的高光表现几乎与实拍一致。

AI 材质质检与自动调优

阶段:测试与质量保障

解决的问题:人工逐材质检查渲染输出枯燥且易漏。AI 用回归模型比较渲染小样与参考照片的差异,自动定位“高光过曝”“金属发闷”“反射断档”等 PBR 参数问题。

具体案例:在 UE5 中批量渲染 200 个材质的球体测试图,AI 判定其中 17 个材质的 roughness 通道疑似反相——高光分布与贴图明暗完全矛盾。工具自动输出修正建议,渲染工程师一键复核修复。

AI 辅助 PBR 资产跨引擎迁移

阶段:数据转换与部署

解决的问题:Unity HDRP 与 UE5 的贴图命名、通道顺序、法线 Y 轴方向都有差异,手动转换容易出错。AI 识别贴图语义后自动重映射通道与色彩空间,迁移效率提升数倍。

具体案例:某团队把 Substance Painter 导出的 metallic/roughness 贴图批量迁移到 UE5,AI 自动将 Unity 的 smoothness 反相为 roughness,修正法线贴图 Y 轴,并确保 sRGB 与线性空间标记正确,避免了“金属发黑”事故。

Python 演示

python44 行
import numpy as np  def ggx_ndf(n_dot_h, alpha):    a2 = alpha * alpha    denom = np.pi * (n_dot_h * n_dot_h * (a2 - 1.0) + 1.0) ** 2    return a2 / np.maximum(denom, 1e-6)  def schlick_fresnel(c_dot_v, f0):    return f0 + (1.0 - f0) * np.power(np.clip(1.0 - c_dot_v, 0.0, 1.0), 5.0)  def smith_geometry(n_dot_v, n_dot_l, k):    g_v = n_dot_v / np.maximum(n_dot_v * (1.0 - k) + k, 1e-6)    g_l = n_dot_l / np.maximum(n_dot_l * (1.0 - k) + k, 1e-6)    return g_v * g_l  def cook_torrance(n_dot_v, n_dot_l, n_dot_h, roughness, f0, base_color):    alpha = roughness * roughness    k = alpha * 0.5    d = ggx_ndf(n_dot_h, alpha)    g = smith_geometry(n_dot_v, n_dot_l, k)    f = schlick_fresnel(n_dot_h, f0)    spec = d * g * f / np.maximum(4.0 * n_dot_v * n_dot_l, 1e-6)    diff = base_color / np.pi * (1.0 - f0)    return diff + spec  if __name__ == "__main__":    f0 = 0.04    base_color = np.array([0.6, 0.6, 0.6])    print("roughness | peak BRDF | mean BRDF")    for roughness in [0.05, 0.2, 0.5, 1.0]:        values = []        theta = np.linspace(0.01, np.pi / 2 - 0.01, 90)        for angle in theta:            n_dot_v = np.cos(angle)            n_dot_l = n_dot_v            n_dot_h = np.cos(angle / 2.0)            brdf = cook_torrance(n_dot_v, n_dot_l, n_dot_h, roughness, f0, base_color)            values.append(float(brdf.sum()))        print("  %.2f    | %.3f     | %.3f" % (roughness, np.max(values), np.mean(values)))
目的:用 numpy 实现 GGX 法线分布、Schlick 菲涅尔、Smith 几何遮蔽,组合成 Cook-Torrance BRDF,并扫描不同粗糙度下的高光峰值变化,直观验证“越光滑高光越强”这一 PBR 核心直觉。
  1. def ggx_ndf(n_dot_h, alpha):GGX 法线分布函数,对应正文里的微表面镜片朝向统计。
  2. a2 = alpha * alpha把 roughness 平方成 \( \alpha \),这一步决定了高光过渡的柔和度。
  3. denom = np.pi * (n_dot_h * n_dot_h * (a2 - 1.0) + 1.0) ** 2GGX 分母,塑造“中间高两边低”的峰形。
  4. f = schlick_fresnel(n_dot_h, f0)菲涅尔项,模拟掠射角反射增强。
  5. spec = d * g * f / np.maximum(4.0 * n_dot_v * n_dot_l, 1e-6)Cook-Torrance 镜面项,分母做能量归一化。
  6. diff = base_color / np.pi * (1.0 - f0)Lambert 漫反射项,非金属的“嚼碎吐匀”通道。

常见误区

误区我觉得墙面不够亮,就把金属度从 0 拉到 1。结果表面变成一面彩色镜子,原本的木纹颜色全没了,看起来反而更暗更奇怪。

正解闪亮与否由 roughness 决定,金属度只决定“反射的是无色白光是带颜色的环境光”。金属 = 1 时漫反射关闭,如果 roughness 很大,金属表面一样暗淡;反过来,非金属把 roughness 调到极小也能像抛光的宝石一样亮。调亮应该先降 roughness,再考虑环境光强度。

为何常见:直觉上“金属 = 亮”,忽略了金属度升高会让固有色消失,把反射完全交给环境——环境一暗,金属就跟着暗。

误区在 Substance 里导出一套 baseColor、metallic、roughness,Unity HDRP 和 UE5 都能直接用,反正都是 PBR 标准。

正解两套引擎的贴图细节不同:UE5 用 Metallic/Roughness 工作流,Unity HDRP 兼容 Metallic 但历史项目常见 Glossiness(与 Roughness 反相);法线贴图的 Y 轴朝向也不同,直接拖会导致高光方向反转、材质发黑。

为何常见:PBR 标准看似统一,但引擎各有派生约定。小白容易把“标准”当成“同一套文件”,忽略了通道与色彩空间的适配层。

误区sRGB 和线性空间差别不大,输出前随手一关,画面还不是照样渲染?

正解光照计算必须在线性空间完成,最后再转回 sRGB 显示。如果贴图不转线性,暗部会被过度拉亮,明暗过渡失真;PBR 能量守恒也会被破坏,金属反射偏灰。HDRP 和 UE5 默认都在线性空间中运算,动这个开关等于打乱整套物理光照。

为何常见:屏幕天然显示 sRGB,人眼已经习惯非线性,初学者很难察觉“计算用的颜色”和“显示的颜色”是两套编码。

误区我觉得 IBL 环境光照是引擎现场把环境图卷积出来,每帧都实时更新,所以画面才那么自然。

正解环境图的卷积、预滤波、球谐编码都发生在离线烘焙或加载阶段,运行时只是做几次纹理采样。若每帧重新卷积环境贴图,GPU 会瞬间被拖垮。动态 IBL 也只是按帧率低频更新探针,并非逐帧全量重算。

为何常见:实时引擎的“实时”二字误导了小白,让人以为一切效果都是即时计算,忽略了预计算这种以空间换时间的关键工程手段。

误区贴了一张高精度法线贴图,墙面立刻有了砖缝和铆钉,那还要建模师加高模做什么?

正解法线贴图只改变光照计算的“假朝向”,轮廓、投影、自遮蔽仍然暴露平面本质。微表面理论中的几何遮蔽项 G 也需要真实凹凸参与——很斜的角度看法线贴图,砖缝会“摊平”失真。

为何常见:法线贴图在正面视角效果惊艳,容易让人忽略侧面和轮廓处的物理破绽,直到镜头一转才发现墙面其实是“一张纸”。

面试题

Q1. PBR 中文全称最准确的表述是?

单选题 · easy

  • A.基于物理的渲染系统← 正确答案
  • B.基于像素的渲染管线
  • C.基于几何的着色模型
  • D.基于光栅的快速绘图

答案:A。PBR 全称 Physically Based Rendering,即“基于物理的渲染”,强调用真实光学规律模拟光照。其他选项混淆了“像素”“几何”“光栅”等相邻概念,它们都不属于 PBR 的定义核心。

Q2. 当材质的 metalness = 1 时,以下哪种说法正确?

单选题 · mid

  • A.材质必然呈现高亮炫光
  • B.材质的漫反射通道被禁用← 正确答案
  • C.材质的粗糙度必须调小
  • D.材质只能反射环境贴图

答案:B。金属没有漫反射,光无法渗入内部散射,所以 baseColor 全部进入镜面反射。A 错在亮度由 roughness 决定;C 错在金属也可以粗糙;D 错在金属同样接收直接光,只是以镜面方式反射。

Q3. 粗糙度数值越小,高光表现通常是?

单选题 · mid

  • A.高光斑越大越模糊
  • B.反射图像越锐利清晰← 正确答案
  • C.漫反射占比会提高
  • D.表面颜色会变暗

答案:B。粗糙度小意味着微表面朝向一致,GGX 分布峰又尖又高,反射光集中在镜面方向,因此高光锐利、环境反射清晰。粗糙度不影响漫反射占比,那是金属度的职责。

Q4. GGX 法线分布函数中,alpha = roughness² 的主要作用是?

单选题 · hard

  • A.控制微法线的分布锥宽度← 正确答案
  • B.控制菲涅尔反射的强度
  • C.决定环境贴图的采样层
  • D.调整光源的衰减速度

答案:A。GGX 的 D(h) 用 alpha 塑造分布峰:alpha 小峰高而窄,angle 大峰矮而宽,即“分布锥宽度”。菲涅尔由 F0 控制,环境贴图采样层由 mip_level 控制,都与 alpha 的分布职能无关。

Q5. 非金属材质在垂直入射时的反射率 F0 约为?

单选题 · easy

  • A.反射率约为 1.0
  • B.反射率约为 0.5
  • C.反射率约为 0.04← 正确答案
  • D.反射率约为 0.82

答案:C。Fresnel-Schlick 中非金属的 F0 固定约 0.04,即只有 4% 的光被直接反射,其余进入漫反射通道。金属的 F0 才取 baseColor 的有色值,所以 A、D 是金属量级,B 是常见错觉值。

Q6. IBL 镜面反射的预计算结果通常存储在哪里?

单选题 · mid

  • A.保存在环境贴图分级 mipmap← 正确答案
  • B.存储在颜色查找表纹理中
  • C.放在顶点缓冲区的布局里
  • D.记录进深度模板缓冲区内

答案:A。IBL 把不同粗糙度对应的 BRDF 卷积结果存成环境贴图的 mipmap 各级,运行时按 roughness 采样对应层级。查找表用于 BRDF LUT,深度缓冲管遮挡,顶点缓冲区存几何,都与环境卷积无关。

Q7. UE5 中负责实时全局光照的主要方案是?

单选题 · mid

  • A.屏幕空间反射 SSR
  • B.Lumen 实时全局光照← 正确答案
  • C.屏幕空间环境光遮蔽
  • D.多重采样抗锯齿技术

答案:B。Lumen 是 UE5 主推的实时全局光照方案,用软件光追和屏幕空间信息实现动态间接光照。SSR 只做屏幕内反射,SSAO 只做环境光遮蔽,MSAA 是抗锯齿,功不同。

Q8. Cook-Torrance BRDF 的镜面反射项包含哪些部分?

多选题 · mid

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

答案:ABC。镜面项公式为 FDG 除以归一化分母,D 描述微法线朝向分布,G 描述凹凸互相遮挡,F 描述掠射角反射增强。AO 属于环境光的低频遮蔽,不在 Cook-Torrance 镜面项内。

Q9. 下列哪些属于 PBR 材质工作流中的常见贴图?

多选题 · easy

  • A.反照率与基础颜色贴图← 正确答案
  • B.金属度灰度权重贴图← 正确答案
  • C.粗糙度灰度权重贴图← 正确答案
  • D.帧率采样测试目标贴图

答案:ABC。金属度/粗糙度工作流三件套就是 baseColor、metallic、roughness,分别负责固有色、金属/非金属分类、高光散开程度。帧率测试贴图属于性能分析工具,不是材质贴图。

Q10. 关于 PBR 材质调优,下列说法正确的有?

多选题 · hard

  • A.先调粗糙度再调金属度顺序无所谓
  • B.非金属材质的金属度应设接近 0← 正确答案
  • C.线性空间影响光照计算的正确性← 正确答案
  • D.粗糙度会直接改变漫反射颜色

答案:BC。调优应先定金属度再调粗糙度,因为金属度决定漫反射是否开启;非金属 F0 约 0.04,漫反射主导,所以金属度应接近 0;光照计算必须在线性空间进行。粗糙度只影响镜面高光的散开程度,不改变漫反射颜色。