上一章的射线撞上了表面,拿到命中记录后第一个要问的就是:这份入射光该按什么规则重新分配?本节给出这条规则的严格形式——双向散射分布函数。它听起来吓人,本质只是一张"从每个来路到每个去路"的汇率表;而把粗糙度、光泽、磨砂这些美术直觉翻译进这张表的钥匙,是微面元理论:你在宏观看到的高光形状,是千万枚微米级小镜面法线取向的统计图景。
先看老模型的病。早期渲染用标量"反射率"说话:这个点吸收三成、漫射七成。它无法区分白纸与磨砂玻璃——两者正入射下都近乎全反射,但白纸把光均匀泼向半球,磨砂玻璃却聚出一片方向性的柔光。病根在缺了方向维度:散射行为从来不只是"有多少",更是"往哪里去"。
把方向补进去,就得到 BSDF 的定义:沿出射方向的微分亮度,除以沿入射方向的微分辐照度,单位是每球面度。翻译成人话:从方向 wi 打进来一份辐照度,材质把它分配到方向 wo 的"亮度汇率"是多少。定义里两个变量(入射方向、出射方向)是独立的——这正是它比"反射率"先进的地方:同一块天鹅绒,侧光下深邃、顶光下柔亮,一张汇率表全部容纳。按入出方向是否分居表面两侧,BSDF 自然切成两片:同侧的 BRDF 管反射,异侧的 BTDF 管透射,合称 BSDF。
两条铁律为这张汇率表把关。能量守恒:把出射半球上所有方向的贡献按余弦加权积起来,不得超过入射能量——表面只能重分配、不能凭空造光;违反它的材质会"发光",画面越调越亮。互易性:交换入射与出射方向,函数值不变——光路可逆是几何光学的本性;违反它的材质在双向方法里会出现能量对不上账的怪病。日后你调任何材质参数,先拿这两条扫一遍,一半的"灵异现象"当场排除。
微面元理论的核心假设:宏观表面实际由无数微米级的小镜面拼成,每个小镜面严格按反射定律和菲涅耳方程行事;宏观的"粗糙",只是这些小镜面法线取向不一致的统计表现。直觉实验:手持一枚小镜对准太阳,远处墙上有一个刺眼光斑;把一百万枚随机取向的小镜撒成一片,墙上不再是光斑而是一片亮度渐变的区域——中心最亮(取向恰好对准的方向多),边缘渐暗(取向偏离的方向渐少)。高光斑的胖瘦,就是法线取向分布的胖瘦:完美镜面是分布收成一根针(所有微镜同向),磨砂表面是分布摊成宽钟形(微镜取向各异)。美术里的"粗糙度"滑块,底下拖动的就是这个分布的宽度参数。
形式化后,Cook-Torrance 微面元模型把镜面反射项拆成三个因子相乘:
f_specular = D(h) · F(v·h) · G(v, l) / (4 · (n·v) · (n·l)) D(h):法线分布函数——微镜法线恰好处在半程向量 h 附近的概率密度 粗糙度 α 越大,D 越宽胖,高光越大越散 F: 菲涅耳项——每个微镜按入射角决定反射比例,掠射角趋近全反射 G: 遮蔽阴影项——微镜之间互相挡光的比例修正,粗糙表面上更明显
三个因子各管一段视觉特征。D 决定高光的尺寸与形状——GGX 分布如今是全行业标准,因为它的高光"尾巴"比旧高斯模型长,恰好匹配真实材质在偏离主高光方向上仍有一点光泽的观感。F 决定高光的强度随视角的变化——正对着看时金属与塑料差别不大,掠射看时两者都被菲涅耳拉向全反射,这就是湿地板与静止水洼在低角度看去特别亮的原因。G 是能量守恒的执行者——凸出的微镜会挡住凹陷微镜的光路,粗糙度越高遮挡越重,没有它高能量会凭空多出来。

把公式跑一遍完整数值。场景设定:一块粗糙度 0.3 的铝板,光源方向与观察方向的半程向量 h 与法线夹角约 20 度。第一步查 D:GGX 分布在 α 等于 0.3、偏离 20 度处的密度值,相对峰值已跌到约四分之一——高光主体收在较窄的锥内。第二步查 F:铝的基色 F0 约为 0.91、0.912、0.913(RGB 近乎等值,这是金属的标志——彩色的是铜与金),20 度入射角下菲涅耳值仍贴近 F0,反射几乎全额。第三步查 G:粗糙度不高,遮蔽修正温和,约打八五折。三项相乘除以分母,得到该方向的镜面贡献。把粗糙度调到 0.6 重跑:D 峰值矮一个量级、尾巴拖长,G 压得更狠——宏观上高光摊成一片柔和的亮区,总能量依然守恒。变式:换成铜板(F0 红黄高、蓝低),同样流程下高光带色,这就是"金属反射自带本色、塑料反射不带色"的物理出处——塑料的镜面项用无色 F0,颜色全由漫反射项承担。
最后给一个工程提醒:微面元模型描述的是统计平均,单个微镜并不存在于几何里。这意味着光线追踪对它的消费方式是"按 D 的形状采样出射方向"——采样 PDF 正比于 D 乘余弦项的归一化,第 6 章的材质采样环节会原样兑现这句话。
材质系统的易错点大多藏在"翻译"环节,滑杆上的数与方程里的数常常隔着一道换算。第一道,粗糙度:界面上拖动的通常是感知值,进方程前要平方成 alpha——不平方的高粗糙度区域高光会瘦得离谱,滑杆中段的手感也不对;GGX 的长尾让平方约定成了各家引擎的事实标准。第二道,F0:介电质的 F0 由折射率按正入射公式换算,水 0.02、玻璃 0.04 上下;美术若直接把镜面强度拉到 0.5,等于发明一种地球上不存在的塑料——正确做法是让滑杆只控制折射率,或直接提供预设档位。第三道,漫反射与镜面的分账:入射能量先按菲涅耳分成反射与折射两股,折射股再被反照率染色、按漫反射分布撒出;常见错误是漫反射不扣掉菲涅耳分成,总能量凭空多出一截,低角度下材质白得发飘。三道翻译都过对,材质库才经得起特写镜头的审问。
一道自查实验收尾:把同一块材质的正入射与掠射渲染图并排摆开,检查三件事——正入射时镜面强度是否落在 F0 附近,掠射边缘是否出现物理要求的亮边而非全图泛白,漫反射在掠射处是否如约退场。三问都过关,说明翻译链路没漏;任何一问含糊,就回到对应的那道翻译关重查。参数不是玄学,是换了单位制物理。
再补一道面试高频题的处理范式:"为什么高光颜色直接乘漫反射基色是错的?"答案在分账结构里。金属的吸收发生在体内,反射自带选择性,所以金属高光就是金属的本色;介电质的界面反射近乎无色,颜色全在折射股的漫反射里。把"高光乘基色"的旧习惯带进物理工作流,等于让所有介电质反射带上脏色、让金属丢了本色,画面立刻塑料感与脏旧感齐飞。口诀一句:金属反射自带颜色,非金属反射近乎无色;颜色出现在哪一股,由导体身份说了算。校验这个理解只需两张图:同一模型分别按金属与介电质渲染并排一摆,看高光颜色之差——看得出差别,说明 F0 的身份逻辑已经内化。
汇率表已经立起。但光不止在同侧半球里周转——跨过界面会发生什么?下一节请出菲涅耳方程与折射的世界。