本章实测环境Babylon.js9.30.0、Vite 8.3.4、TypeScript 5.9.3、Windows 11 ChromeWebGL2 后端。本章代码src/chapters/ch14-pbr-channels.ts运行后打开http://localhost:18000/?ch14。图中所有源码出处都指node_modules/babylonjs/core里的真实文件与行号你可以自己打开核对。§14.1 本章要做成什么样最终效果一个PBR 通道拆解实验室展示一个金属球体读者可以逐个开启/关闭 PBR 的各个通道albedo、metallic、roughness、ambient、environment实时观察每个通道对最终画面的贡献。右侧面板显示当前激活的通道列表和对应的纹理采样次数。场景中包含一个可切换的 HDRI 环境贴图读者可以看到同一材质在不同环境下的表现差异。直达链接http://localhost:18000/?ch14为什么这章很重要第 13 章介绍了 PBR 的概念但没有深入讲解每个通道的具体作用。实际项目中你需要理解 albedo、metallic、roughness、ambient 等贴图的用途知道如何从 Substance Painter、Quixel Mixer 等工具导出正确的贴图以及为什么环境贴图对金属材质至关重要。本章逐一拆解这些通道让你能独立调试 PBR 材质问题。§14.2 原理PBR 材质的数据流14.2.1 PBR 的输入与输出PBR 材质的渲染流程可以简化为输入 - 几何数据顶点位置、法线、UV - 材质参数albedo、metallic、roughness、normal 等标量或纹理 - 光照数据直接光方向光、点光源等、间接光环境贴图 - 相机数据视图矩阵、投影矩阵 计算 - 顶点着色器MVP 变换 - 片元着色器 1. 采样 albedo 纹理 → 基础颜色 2. 采样 metallic/roughness 纹理 → 表面属性 3. 采样 normal 纹理 → 微表面法线 4. 采样 ambient occlusion 纹理 → 阴影遮蔽 5. 计算直接光照漫反射 镜面反射 6. 采样环境贴图 → 间接光照IBL 7. 混合所有贡献 → 最终颜色 输出 - 像素颜色RGBA - 深度值用于深度测试关键理解PBR 不是单一公式而是一套数据驱动的系统。每个通道纹理提供一部分信息片元着色器把它们组合起来。如果某个通道缺失如没有 metallic 纹理系统会用默认值通常是 0替代。14.2.2 通道之间的依赖关系PBR 的各个通道不是独立的它们之间存在复杂的交互metallic 决定反照率的用途metallic 0非金属albedo 控制漫反射颜色镜面反射颜色由菲涅尔效应自动计算通常是灰色。metallic 1金属albedo 控制镜面反射颜色漫反射几乎为零。roughness 影响环境采样的 LODroughness 0光滑采样环境贴图的高清 mip level得到清晰的反射。roughness 1粗糙采样低清 mip level得到模糊的反射。ambient occlusion 调制间接光AO 值低的地方缝隙、角落会减少间接光照增强立体感。AO 不影响直接光照方向光、点光源。理解这些依赖关系后你才能正确调整材质参数避免出现金属看起来像塑料或反射太模糊的问题。§14.3 Albedo 通道基础颜色14.3.1 什么是 AlbedoAlbedo反照率是物体表面的基础颜色不含任何光照信息。它表示物体在均匀白光照射下呈现的颜色。重要区分Albedo ≠ DiffuseDiffuse 可能包含阴影和高光信息来自烘焙Albedo 必须是平坦的颜色。Albedo 应该是线性空间的颜色大多数贴图是 sRGB 格式的Babylon.js 会自动转换到线性空间进行计算。确保你的贴图标记为sRGB默认就是。源码位置Materials/PBR/pbrMaterial.pure.d.ts:63-65/** * AKA Diffuse Texture in standard nomenclature. */accessor albedoTexture:NullableBaseTexture;/** * Gets or sets the albedo color of the material. */accessor albedoColor:Color3;14.3.2 Albedo 贴图的规范从 Substance Painter 或 Quixel 导出 Albedo 贴图时遵循以下规范无阴影、无高光只保留物体的固有色。如果有烘焙的阴影用 Photoshop 去掉。中性灰度平衡对于金属Albedo 应该是金属的真实颜色金 黄色铜 橙红色。对于非金属Albedo 通常是灰色或彩色。分辨率适中512×512 或 1024×1024 足够大多数场景。过高的分辨率浪费显存过低会导致模糊。文件格式PNG无损或 JPEG有损但体积小。对于压缩纹理使用 KTX2/DDS见第 15 章。常见错误Albedo 太暗导致整体画面发黑。PBR 的能量守恒会进一步降低亮度。修复在 Photoshop 里提高亮度或在 Babylon.js 里乘以系数material.albedoColor.scaleInPlace(1.5)。Albedo 包含高光导致金属反射颜色错误。修复去掉高光只保留固有色。14.3.3 动手实验观察 Albedo 的影响import{PBRMaterial,Color3,Texture}frombabylonjs/coreconstpbrMatnewPBRMaterial(pbrMat,scene)// 方法 1纯色pbrMat.albedoColornewColor3(0.8,0.2,0.2)// 红色// 方法 2纹理pbrMat.albedoTexturenewTexture(./assets/albedo.png,scene)pbrMat.albedoTexture.hasAlphafalse// Albedo 通常不包含透明度// 关闭其他通道只看 Albedo 的效果pbrMat.metallic0pbrMat.roughness1pbrMat.environmentIntensity0pbrMat.directIntensity1.0运行后你应该看到一个纯红色的球体如果用纯色或带有纹理图案的球体如果用纹理。因为没有金属度和粗糙度的变化也没有环境光画面看起来比较平。§14.4 Metallic 与 Roughness 通道表面属性14.4.1 Metallic金属还是非金属Metallic金属度是一个 0-1 的标量决定物体是金属还是非金属metallic 0非金属绝缘体如塑料、木材、陶瓷。漫反射强镜面反射弱且颜色为灰色。metallic 1纯金属导体如金、银、铝。漫反射几乎为零镜面反射强且颜色为金属的固有色。0 metallic 1混合状态通常用于模拟生锈的金属锈迹部分是非金属未锈部分是金属。物理依据金属的自由电子会吸收大部分入射光只有表面反射的光能逃逸所以金属几乎没有漫反射。非金属的电子束缚较强光线能进入内部散射后再出来形成漫反射。源码位置Materials/PBR/pbrMaterial.pure.d.ts:108-115/** * Specifies the metallic scalar of the metallic/roughness workflow. * Can also be used to scale the metalness values of the metallic texture. */accessor metallic:Nullablenumber;/** * Stores the metallic values in a texture. * Typically stored in the B channel of a packed texture. */accessor metallicTexture:NullableBaseTexture;14.4.2 Roughness光滑还是粗糙Roughness粗糙度是一个 0-1 的标量决定表面的微观粗糙程度roughness 0完全光滑镜面反射清晰如镜子。roughness 1完全粗糙镜面反射扩散成均匀的漫反射。0 roughness 1中间状态镜面反射模糊但仍有方向性。物理依据粗糙表面由朝向各异的微表面组成。入射光被这些微表面反射到不同方向形成模糊的高光。光滑表面的微表面朝向一致反射光集中在一个方向形成清晰的高光。Roughness 与环境采样的关系Babylon.js 的环境贴图是多 mip level 的。渲染时根据 roughness 值选择对应的 mip levelroughness 0→ mip level 0最高清roughness 1→ mip level N最模糊这样做的目的是模拟粗糙表面的模糊反射而不需要昂贵的实时光线追踪。源码位置Materials/PBR/pbrMaterial.pure.d.ts:116-120/** * Specifies the roughness scalar of the metallic/roughness workflow. * Can also be used to scale the roughness values of the metallic texture. */accessor roughness:Nullablenumber;14.4.3 Metallic-Roughness 工作流 vs Specular-Glossiness 工作流PBR 有两种主流工作流特性Metallic-RoughnessSpecular-Glossiness参数metallic (0-1), roughness (0-1)specular (RGB), glossiness (0-1)优点参数少直观glTF 标准更灵活可以模拟非物理的材质缺点无法模拟某些特殊材质如导电塑料参数多不易调整Babylon.js 支持✅ PBRMaterial 唯一的工作流⚠️ 材质上没有开关靠 glTF 加载器换算推荐除非有特殊需求否则使用 Metallic-Roughness 工作流。它是 glTF 2.0 的标准兼容性最好。补一句实测口径useSpecularGlossinessInput这个属性在 v9.30.0 的PBRMaterial/PBRBaseMaterial上不存在材质层没有「切成 specular-glossiness」的开关——microSurface光泽度只是同一套着色器的反着写法。真正的 Specular-Glossiness 支持在导入环节babylonjs/loaders里有 KHR_materials_pbrSpecularGlossiness 这个归档扩展的实现Materials/PBR/pbrMetallicRoughnessMaterial.d.ts:11附了规范链接加载 .glb 时替你换算成 metallic/roughness。所以「手上只有 specular-glossiness 贴图」的正确解法是走 glTF而不是找那个不存在的开关。14.4.4 打包纹理Metallic Roughness AO为了节省纹理采样次数和显存通常把 metallic、roughness、ambient occlusion 打包到一张纹理的不同通道R 通道Ambient OcclusionG 通道RoughnessB 通道MetallicA 通道未使用或存储其他数据这种纹理叫ORM 纹理Occlusion-Roughness-Metallic。但 Babylon.js不会自动认 ORMmetallicTexture挂上去之后引擎默认只把Alpha 通道当 roughnessR、G、B 一概不采。要它按 ORM 的约定取值得把四个通道开关逐个打开// 加载 ORM 纹理constormTexturenewTexture(./assets/orm.png,scene)pbrMaterial.metallicTextureormTexture// 默认 true / false / false / false —— 只认 A 通道的 roughnesspbrMaterial.useRoughnessFromMetallicTextureAlphafalse// 必须先关掉 AG 的开关才生效pbrMaterial.useRoughnessFromMetallicTextureGreentrue// G RoughnesspbrMaterial.useMetallnessFromMetallicTextureBluetrue// B MetallicpbrMaterial.useAmbientOcclusionFromMetallicTextureRedtrue// R Ambient Occlusion源码位置Materials/PBR/pbrMaterial.pure.d.ts:254Alpha、:259Green注释写着 “Needs useRoughnessFromMetallicTextureAlpha to be false”、:263Blue、:267Red默认值在Materials/PBR/pbrBaseMaterial.pure.js:510-525四个开关翻成 shader define 在:1299-1302。两个名字坑。第一拼写是useMetallness...metallness三个 l跟标量属性metallic不同源你按useMetallic去 grep 是搜不到它的useMetallicFromMetallicTexture、useRoughnessFromMetallicTexture不带通道名、useAmbientOcclusionFromMetallicTexture这三个在包里都不存在。第二「RAO / GRoughness / BMetallic」是 glTF 的约定不是引擎的默认值——正因为默认约定不一致才有下面这个坑§14.8 坑 14-02。优势减少纹理采样次数从 3 次降到 1 次。减少显存占用一张纹理代替三张。提高缓存命中率GPU 纹理缓存更高效。劣势每个通道只有 8 位精度如果使用 PNG/JPEG可能导致带状伪影。解决方法使用 16 位纹理格式如 KTX2 with BC7 compression。无法独立调整各个通道的 uScale/uOffset见第 15 章。§14.5 Ambient Occlusion 通道接触阴影14.5.1 什么是 Ambient OcclusionAmbient Occlusion环境光遮蔽AO是一种近似全局光照的技术。它模拟物体表面因周围几何体遮挡而接收较少间接光的现象。直观理解想象一个房间角落里有两个箱子靠在一起。箱子接触的缝隙处会比箱子的正面更暗因为缝隙处接收的天空光更少。AO 贴图就是预先计算好的这种暗度信息。AO 的特点静态AO 通常在建模软件Blender、Maya或烘焙工具Substance Painter中预计算运行时不变。只影响间接光AO 不遮挡直接光照方向光、点光源只减弱环境光和 IBL。灰度图AO 贴图是单通道的灰度图白色 无遮蔽黑色 完全遮蔽。源码位置Materials/PBR/pbrMaterial.pure.d.ts:75-80/** * AKA Occlusion Texture in other nomenclature. */accessor ambientTexture:NullableBaseTexture;/** * AKA Occlusion Texture Intensity in other nomenclature. */accessor ambientTextureStrength:number;14.5.2 AO 贴图的生成从 Blender 导出 AO 贴图的步骤在 Blender 中选中模型进入 Shader Editor。添加 “Ambient Occlusion” 节点连接到 “Principled BSDF” 的 “AO” 输入。烘焙 AO 到纹理Render → Bake → Bake Type Ambient Occlusion。导出为 PNG 或嵌入到 ORM 纹理的 R 通道。注意事项AO 贴图的分辨率可以与 Albedo 不同通常更低如 512×512因为 AO 是低频信息。AO 贴图应该无缝拼接如果模型需要平铺。避免过度烘焙AO 值不应该低于 0.3否则缝隙会太黑。14.5.3 AO 强度的调节ambientTextureStrength控制 AO 的影响程度strength 0AO 完全无效。strength 1AO 完全生效默认值。strength 1AO 效果增强可能导致缝隙过黑。建议保持strength 1在烘焙阶段调整 AO 的对比度而不是在运行时调节强度。§14.6 环境贴图与 IBL让金属活起来14.6.1 为什么金属需要环境贴图回顾第 13 章的知识金属的漫反射几乎为零所有可见的颜色都来自镜面反射。如果没有环境贴图金属无法反射任何东西看起来就是黑色的。IBLImage-Based Lighting的原理用一张 HDRI高动态范围图像包裹整个场景作为无限远的环境光源。预过滤这张 HDRI生成多个 mip level对应不同的 roughness 值。渲染时根据片元的 roughness 值采样对应 mip level 的环境贴图得到间接光照。这样金属就能反射环境中的内容天空、建筑物、其他物体看起来活起来。14.6.2 加载环境贴图Babylon.js 支持多种格式的环境贴图方法 1从预过滤的 .env 文件加载// 只吃 .env里面是别人IBL Baker、Lys、Babylon Sandbox预先过滤好的 mip 链 球谐系数constenvTextureCubeTexture.CreateFromPrefilteredData(./assets/environment.env,scene)pbrMaterial.environmentTextureenvTexture pbrMaterial.environmentIntensity1.0.env是 Babylon.js 专有的预过滤格式首帧不用再做一遍预过滤省的是这一步的功夫本书没有做过 .env 与 .hdr 的加载耗时对比别把「快 10 倍」这类数字抄进项目文档。关键是扩展名必须真的是 .env把 .hdr 改名成 .env 不会得到预过滤数据只得到一次加载失败。方法 2从 HDRI 文件加载运行时预过滤// .hdr / .exr 走 HDRCubeTexture第三个参数 size立方图边长必填constenvTexturenewHDRCubeTexture(./assets/hdri/studio_small_03_1k.hdr,scene,1024)注意这两个入口不能混用CreateFromPrefilteredData是CubeTexture上按 .env 解析的静态工厂拿它加载 .hdr 是不对的写法反过来说把 .env 传给HDRCubeTexture也一样错。本书public/assets/hdri/下是 Poly Haven 的三个 .hdr仓库里没有任何 .env所以正文和分步示例统一走HDRCubeTexture。方法 3使用默认环境scene.createDefaultEnvironment({createSkybox:true,createGround:true,environmentIntensity:1.0,groundColor:newColor3(0.3,0.3,0.3)})这会创建一个简单的渐变天空盒和地面适合快速原型。源码位置Materials/Textures/cubeTexture.pure.d.ts:182-190、cubeTexture.pure.js:469把这个自由函数挂成CubeTexture.CreateFromPrefilteredData/** * Creates and return a texture created from prefilterd data by tools like IBL Baker or Lys. * param url defines the url of the prefiltered texture * param scene defines the scene the texture is attached to * param forcedExtension defines the extension of the file if different from the url * param createPolynomials defines whether or not to create polynomial harmonics from the texture data if necessary * returns the prefiltered texture */exportdeclarefunctionCubeTextureCreateFromPrefilteredData(url:string,scene:Scene,forcedExtension?:any,createPolynomials?:boolean):CubeTexture;引擎注释里的原文是 “prefilterd”就这个拼写而参数说明只提 “the url of the prefiltered texture”没有说它能吃 HDR 文件——所以「.env 或 .hdr 都行」这种写法不要信。14.6.3 环境贴图的来源推荐的免费 HDRI 资源网站许可证特点Poly HavenCC0高质量专为 PBR 优化HDRI HavenCC0大量室内/室外场景ambientCGCC0同时提供 HDRI 和 PBR 材质下载建议选择 2K-4K 分辨率的 HDRI更高分辨率收益递减。优先选择.hdr或.exr格式高动态范围。如果网站提供.env格式直接下载使用已预过滤。14.6.4 环境强度的调节environmentIntensity控制环境光照的整体亮度intensity 0环境光完全关闭金属变黑。intensity 1正常亮度默认值。intensity 1环境光增强适合夜间场景或需要强调反射的情况。技巧如果金属反射太强降低environmentIntensity如果反射太弱提高 intensity 或更换更亮的 HDRI。§14.7 预期输出与自查清单✅成功标志金属球体有清晰的反射能看到环境贴图的内容天空、建筑物等。拖动 roughness 滑块时反射从清晰逐渐变模糊。拖动 metallic 滑块时球体从塑料感变成金属感。开启/关闭 AO 通道时缝隙处的明暗变化明显。Inspector 显示环境贴图已加载mip levels 数量 ≥ 8。❌失败标志及修复金属球体是黑色的缺少环境贴图。调用scene.createDefaultEnvironment()或手动设置environmentTexture。反射太模糊环境贴图的 mip levels 不足或 roughness 值太高。检查 HDRI 分辨率或使用更高清的环境贴图。AO 效果不明显ambientTextureStrength太低或 AO 贴图对比度不足。提高 strength 或重新烘焙 AO。Albedo 颜色发灰贴图可能在 sRGB 和线性空间之间转换错误。确保texture.isSRGB true默认就是。§14.8 常见坑与出处14-01环境贴图加载异步导致首帧黑屏现象页面加载后金属球体先是黑色几秒后才出现反射。原因环境贴图是异步加载的构造函数或静态工厂返回的瞬间对象就有了但纹素还在网络上飞——赋值成功不等于数据到位。修复constenvTexturenewHDRCubeTexture(./assets/hdri/studio_small_03_1k.hdr,scene,1024)envTexture.onLoadObservable.add((){console.log(Environment texture loaded)// 可选在这里触发重新渲染或显示加载完成提示})pbrMaterial.environmentTextureenvTexture或者使用scene.createDefaultEnvironment()它会自动处理异步加载并显示进度条。源码位置Materials/Textures/baseTexture.pure.d.ts:298isReadyOrNotBlocking()方法14-02ORM 纹理通道混淆现象设置了 ORM 纹理后金属度或粗糙度效果异常如应该光滑的地方很粗糙。原因多半不是工具导出错了顺序而是 Babylon.js 的默认约定跟 ORM 的约定不一样。useRoughnessFromMetallicTextureAlpha默认true另外三个通道开关默认全falsepbrBaseMaterial.pure.js:510-525——也就是说引擎只读 A 通道的 roughnessR 的 AO、G 的 roughness、B 的 metallic 一个都没被采样。于是症状是「金属度永远是 0、AO 毫无作用、roughness 跟着贴图的透明通道跑」看着像贴图坏了其实是开关没开。修复按通道打开对应开关四个名字以.d.ts为准pbrMaterial.pure.d.ts:251-267pbrMaterial.metallicTextureormTexture pbrMaterial.useRoughnessFromMetallicTextureAlphafalse// 关掉默认的 A 通道否则 G 的开关无效pbrMaterial.useRoughnessFromMetallicTextureGreentrue// G RoughnesspbrMaterial.useMetallnessFromMetallicTextureBluetrue// B Metallicmetallness 三个 lpbrMaterial.useAmbientOcclusionFromMetallicTextureRedtrue// R Ambient OcclusionuseMetallicFromMetallicTextureGreenChannel/useMetallicFromMetallicTextureBlueChannel这两个名字不存在写上去 TypeScript 编译就过不去。更省事的方法直接用 glTF 资产第 32 章加载器替你把这些开关配好——babylonjs/loaders在glTF/2.0/pbrMaterialLoadingAdapter.js:210-219里就是先useRoughnessFromMetallicTextureGreen true、再useRoughnessFromMetallicTextureAlpha !value、最后开 Blue或者在 Substance Painter / Photoshop 里把 roughness 挪进 A 通道保持引擎的默认约定不动。14-03Albedo 贴图包含 Alpha 通道导致透明伪影现象金属表面出现奇怪的透明区域或边缘锯齿。原因Albedo 贴图的 Alpha 通道不是完全不透明255导致材质误认为某些区域是透明的。修复pbrMaterial.albedoTexture.hasAlphafalse// 明确告诉引擎忽略 Alpha 通道或者在图像处理软件里删除 Alpha 通道保存为 RGB 格式。14-04环境贴图与天空盒不一致现象金属反射的环境内容与背景天空盒不匹配。原因使用了不同的 HDRI 作为环境贴图和天空盒或者天空盒的旋转角度与环境贴图不一致。修复// 使用同一张环境贴图作为环境贴图和天空盒constenvTexturenewHDRCubeTexture(./assets/hdri/studio_small_03_1k.hdr,scene,1024)pbrMaterial.environmentTextureenvTexture// 创建天空盒按 §5.3.2 的约定网格加 mesh- 前缀、材质加 mat- 前缀constskyboxMeshBuilder.CreateBox(mesh-skybox,{size:1000},scene)constskyboxMatnewStandardMaterial(mat-skybox,scene)skyboxMat.backFaceCullingfalseskyboxMat.reflectionTextureenvTexture.clone()// 克隆以避免共享状态CubeTexture.clone() 在 cubeTexture.pure.d.ts:172skyboxMat.reflectionTexture.coordinatesModeTexture.SKYBOX_MODEskyboxMat.disableLightingtrueskybox.materialskyboxMat确保reflectionTexture.coordinatesMode Texture.SKYBOX_MODE这样天空盒的旋转会与环境贴图同步。§14.9 章节挑战挑战任务创建一个材质展示台包含四个球体分别模拟以下材质并为每个材质配置完整的 PBR 通道生锈的铁板Albedo铁锈的红褐色 未锈部分的灰色使用遮罩混合Metallic生锈部分 0未锈部分 1使用纹理Roughness生锈部分 0.8未锈部分 0.3AO缝隙和凹陷处较暗Environment工业风格的 HDRI仓库或工厂抛光的大理石Albedo白色带灰色纹路Metallic0非金属Roughness0.1非常光滑Normal细微的表面凹凸可选见第 17 章Environment明亮的室内 HDRI阳极氧化铝Albedo蓝色或紫色阳极氧化着色Metallic1Roughness0.2Clear Coat启用模拟表面透明氧化层见第 17 章Environment工作室 HDRI旧皮革Albedo深棕色带有磨损痕迹Metallic0Roughness0.7AO褶皱处较暗Sheen启用模拟布料的柔和高光见第 17 章Environment温馨的室内 HDRI验收标准四个球体排列整齐每个球体下方有标签说明材质名称。生锈铁板的金属和非金属区域过渡自然。大理石球体有清晰的反射能看到环境贴图的倒影。阳极氧化铝有两层高光底层的金属反射和表层的清漆反射。旧皮革有柔和的表面质感没有过于尖锐的高光。提示对于生锈铁板可以使用遮罩纹理混合两种 metallic/roughness 值。Babylon.js 的 PBRMaterial 支持纹理混合但需要自定义着色器或使用 Node Material Editor见第 18 章。简单做法是在 Substance Painter 里直接绘制 metallic/roughness 纹理。§14.10 本章小结本章深入讲解了 PBR 材质的各个通道Albedo基础颜色不含光照信息。应该是平坦的固有色。Metallic决定物体是金属还是非金属。金属几乎没有漫反射所有颜色来自镜面反射。Roughness决定表面的微观粗糙程度。影响环境采样的 mip level控制反射的模糊程度。Ambient Occlusion模拟接触阴影只影响间接光。通常与 metallic/roughness 打包成 ORM 纹理。Environment / IBL基于图像的光照从 HDRI 采样间接光。对金属材质至关重要让金属活起来。理解这些通道的作用和相互关系后你就能独立调试 PBR 材质问题知道从哪里入手调整参数。下一章我们将讲解贴图与 UV 映射包括 mipmap、各向异性过滤、压缩纹理等高级主题。§14.11 术语卡中文English一句话解释反照率Albedo物体表面的基础颜色不含光照信息金属度Metallic0 非金属1 纯金属粗糙度Roughness0 完全光滑1 完全粗糙环境光遮蔽Ambient Occlusion (AO)模拟缝隙和角落因遮挡而变暗的效果IBLImage-Based Lighting基于图像的光照从环境贴图采样间接光HDRIHigh Dynamic Range Image高动态范围图像包含超出 0-1 范围的亮度信息ORM 纹理Occlusion-Roughness-Metallic Texture将 AO、Roughness、Metallic 打包到一张纹理的三个通道Mip LevelMipmap Level纹理的多级细节版本用于加速采样和减少别名预过滤Prefiltering预先计算环境贴图的多个粗糙度版本加速运行时采样能量守恒Energy Conservation反射光能 ≤ 入射光能PBR 的核心原则