5.3 PBR物理渲染:BRDF与工作流


5.3 PBR物理渲染:BRDF与工作流

本节摘要:PBR(基于物理的渲染)用能量守恒、微表面理论、菲涅尔反射三条物理原则替代冯氏模型的经验参数,让材质在任意光照环境下行为可信。本节解剖 Cook-Torrance 反射方程的工程化拆解(直接光与 IBL 环境光两路),讲清金属度-粗糙度工作流的参数语义,给出与冯氏逐项对照的升级账单。PBR 是现代渲染管线的材质标准件,也是理解引擎材质编辑器的钥匙。

从「调出来像」到「算出来对」

冯氏模型的调参是门玄学艺术:shininess 调到 64 像塑料、调到 8 像橡胶,但为什么、边界在哪,没人说得清。PBR 的野心是让参数对应物理可测量的材质属性:这块金属有多粗糙、那个塑料反不反光,量出来填进去,任何光照环境下都表现可信。三个物理原则是整个体系的宪法:

能量守恒——反射的总能量不超过接收的:漫反射和镜面反射是分蛋糕而不是各自领取(冯氏两者相加可以凭空超支,过曝的塑料感即来源于此)。微表面理论——没有完美光滑的表面,粗糙度是一堆微观小镜面朝向混乱程度的统计:粗糙度高,反射光被散射成模糊一片;粗糙度低,反射清晰锐利——shininess 那个玄学参数,物理化身就是它。菲涅尔效应——掠射角(视线与表面几乎平行)下反射率飙升:抬头看远处的湖面,近处看得到水下的石头、远处全是天空的反光,就是它在起作用。

Cook-Torrance:公式只拆成四块

反射方程的教科书形式令人生畏,工程视角只需要四块拼图:出射光 = 环境贡献 + 直接光的「漫反射项 + 镜面项」,镜面项由三个函数相乘——法线分布 D(微表面里有多少面正对着半角方向,粗糙度是它的输入)、菲涅尔 F(这个角度下反射率多大,用近似公式一行搞定)、几何遮蔽 G(粗糙表面上微镜面互相挡光的损耗)。三个函数都是几行 GLSL,物理含义各自独立,调参互不纠缠——这正是 PBR「参数物理化」的兑现处。

图 5-3 PBR 材质工作流:两张贴图接管全部表面属性

图 5-3 PBR 材质工作流:两张贴图接管全部表面属性

工作流的参数语义

金属度-粗糙度工作流把材质压缩成四个通道,每个都有明确语义。金属度是二值倾向:现实里很少中间值,贴图上的过渡区只用于锈蚀、氧化这类「正在变成金属或正在坏掉」的表面——把金属度当平滑渐变乱调,是「金属感发闷」的高发原因。反照率纪律:贴图里不能烘焙任何光照信息(高光、阴影、明暗全是非法内容),因为光照由着色器实时算,贴图里再存一份就是双重计光。非金属的反照率有物理区间:电介质材料的基础色普遍偏暗(反射率低),把非金属的反照率调到刺眼的高亮度,能量守恒会诚实地告诉你它不对。

GLSL 骨架:直接光的分蛋糕

省略三个函数的实现(标准公式,任何 PBR 教程都有),看结构骨架:

vec3 N = normalize(Normal); vec3 V = normalize(viewPos - FragPos); vec3 albedo = texture(albedoMap, uv).rgb; float metallic = texture(metallicMap, uv).r; float roughness = texture(roughnessMap, uv).r; // 能量守恒的分蛋糕:金属的镜面占比天生高(菲涅尔用基础色) vec3 F0 = mix(vec3(0.04), albedo, metallic); // 非金属镜面率约4% · 金属用本色 vec3 result = vec3(0.0); for (int i = 0; i < LIGHT_COUNT; ++i) { // 光源数编译期写死(2.3 节变体结论) vec3 L = normalize(lightPos[i] - FragPos); vec3 H = normalize(V + L); vec3 radiance = lightColor[i] * attenuation(i, FragPos); // Cook-Torrance 三函数(D F G 各几行,略) vec3 specular = DG_F_combination(N, H, V, L, roughness, F0); vec3 kS = fresnel(H, V, F0); // 镜面分走的比例 vec3 kD = (vec3(1.0) - kS) * (1.0 - metallic);// 金属没有漫反射 vec3 diffuse = kD * albedo / PI; // 漫反射按能量归一 result += (diffuse + specular) * radiance * max(dot(N, L), 0.0); } result += ambientIBL(N, V, albedo, metallic, roughness); // IBL 环境项 FragColor = vec4(result, 1.0);

骨架里三个判断点。F0 的 mix 是金属度分岔的核心:非金属的镜面率被物理锁定在百分之四附近,金属直接用反照率当镜面色——「金色高光是金色、塑料高光是白色」的物理依据在这行。kD 乘 (1-金属度):金属内部不散射光,漫反射归零,金属材质「黑得发亮」的来源。漫反射除以圆周率是能量归一化的归一常数,别当可调参数动它。

💡 关键直觉:PBR 的调试哲学是「查参数语义,不调玄学系数」。金属发闷查金属度是不是被调成了中间值、高光发白查非金属 F0 是否被破坏、整体过曝查贴图是否烘焙了光照。物理体系的回报就是:症状与参数一一对应。

从直接光到 IBL:环境的高攀

只算几盏灯的 PBR 是半个 PBR——真实环境里物体被四面八方的反射光照着。IBL(基于图像的光照)把环境拍成(或程序生成)一张立方体贴图,当「无限远的光源集合」用:漫反射部分预卷积成一张模糊版环境图(运行时按法线采一次即可),镜面部分按粗糙度预卷积一组 mip(运行时按粗糙度选层加菲涅尔近似)。预处理都是离屏渲染(3.3 节闭环的又一次复用),运行时开销近似两次纹理采样——5.1 节那个「常数环境光」就此升级成有方向、有色彩、随材质变化的环境贡献,画面档次的最大单笔提升。

本节要点回顾

  • 三条宪法:能量守恒(漫反射镜面分蛋糕)、微表面(粗糙度=玄学参数的物理化)、菲涅尔(掠射角反射飙升)
  • 金属度是分岔不是渐变:金属彩色镜面无漫反射、非金属白镜面低反射率
  • 反照率纪律:禁烘焙光照,非金属基础色偏暗,违反必双重计光
  • F0 的 mix 是工作流心脏:4% 与本色的一刀切
  • IBL 是环境的高攀:预卷积换运行时采样,常数环境光升级为方向性环境
  • 调试哲学:症状对应参数语义,物理体系里没有玄学系数的容身之处

材质物理化了,最后一层效果栈是「整帧的化装间」——后处理:把渲染结果当素材再加工,bloom、色调映射、抗锯齿,电影感的最后一道工序。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U