[引擎开发] PBR材质的原理

本文深入探讨了迪士尼的物理渲染技术,包括BRDF、BSDF和次表面散射(SSS)的概念。BRDF描述了漫反射和镜面反射,BSDF则引入了透射和次表面散射,而SSS模拟了光线在物体内部的散射。迪士尼BRDF通过法线分布、几何遮蔽和菲涅尔方程来计算反射率,同时引入了光泽度和各向异性参数。文章还讨论了环境光照和全局光照的计算,以及在Unreal Engine 4中实现PBR的各种技术,如次表面散射、双面透明材质、预积分皮肤和眼睛材质的渲染。

[本文大纲]

基础概念篇

    引入

    光线与介质的作用

        光线的传播路径

        体积散射和表面光照

        光线和介质外观

    微平面理论

        概念介绍

        中间向量

        能量守恒定律

        微平面理论的不足

    光照计算

        半球积分

        单位光照

        反射率方程

        BRDF与BxDF

        各向同性和各向异性

    材质观测

        漫反射观测

        镜面反射观测

    Disney BRDF

        概念引入

        BRDF的参数化

        Specular BRDF

        Diffuse BRDF

        Sheen

        Clearcoat

    Disney BSDF

        概念引入

        BSDF的参数化

        Diffuse BRDF

        Specular BSDF

        Thin BSDF

        BSSRDF

    环境光照

        IBL

        全局光照

        完整光照环境

    ue4中的PBR渲染

        默认BRDF

        次表面散射

        双面透明材质

        预积分皮肤

        次表面轮廓

        透明涂层

        布料材质

        头发材质

        眼睛材质

        环境光照

基础概念篇

引入

        我们之所以可以看见这个缤纷多彩的世界,是因为光线从物体上的某个点进入到了我们的眼睛。而我们之所以能够分辨出一个表面是金属、布料或是陶瓷,是因为我们肉眼看到了它独特的外观。

        那么,究竟什么是外观(Appearance)呢?更准确来说,我们能够感受到不同的外观,是因为我们感受到了光在介质表面的不同分布情况。也就是说,光进入物体后,由于物体独特的表面属性,光线发生了特定的作用。我们认为这种光在介质上作用形式就是物体的材质(Material)。

光线与介质的作用

        我们提到了光和介质的不同作用导致了物体的不同的外观。那么,这种作用具体来说,又是什么呢?

        光线的传播路径

        当光线照射到物体表面时,我们认为有一部分光线反射(Reflection)出去,也就是改变了传播方向,回到原来的介质中:

光线从介质表面直接反射回原介质

        这种反射分为不同的情况。一个是镜面反射(Specular Reflection),它描述的是单次反射现象,光线入射后直接反射出去,遵循反射定律(反射角等于入射角)。这更多地发生在金属这样的材质上。

        另一个是漫反射(Diffuse Reflection),入射光线反射后会发散到各个方向,这是对多次反射的近似模拟,这里的多次反射指光在物体表面或内部经过多次反弹后,又重新从物体表面出射的现象。因此,严格意义上,只有镜面反射属于直接反射,漫反射本质上来自于折射光。

       最后一个特例是逆反射(Refro Reflection),光线会从入射的方向原路直接反弹。逆向反射的发生主要取决于特殊的材质表面形态。

       剩余光线折射(Refraction)进入介质内部:

光线折射进入介质

        比如光线折射进入水面,这使得我们可以看见水底的东西。   

        通常情况下,入射光线的单次反射会反射到以法线为轴的对称位置上;而折射方向则取决于介质的折射率(IOR)。

        当光线进入介质中时,由于介质本身有微观粒子,光线与微观粒子作用,可能被吸收(Absorption)了,此时光的强度变弱或颜色发生变化,光能转换为其它类型的能量。如果折射率发生突变(小于光波的距离),光会改变传播方向,也就是发生了散射(Scattering)。如果介质内部有其它形式的能量能够转换为光能(与吸收相反),那么就是一种自发光(Emission)现象。

Reference:《Physics and Math of Shading》2013
光与物质作用的三种形式:吸收、散射、自发光

        其中,从当前位置向其它方向散射,称为外散射;从其他方向向当前位置散射,称为内散射。

外散射和内散射

        另一方面,散射光的分布也有偏向性。如果更多的光沿着前向传播,称为前向散射;如果更多的光沿着与原来相反的方向传播,称为逆向散射。除此之外,还有更多更加复杂的方向分布形态。 在一些比较浑浊的介质(cloudy media)中,散射的光线方向呈现随机性。

        除了受内部微观分子性质的影响,散射现象还和观察的尺度有关。我们所处的大气因为较远的距离也能呈现出散射的效应。

        当光线进入介质中时,对于金属而言,折射光会被立即吸收,而对于非金属(电介质/绝缘体)而言,光线会在内部继续行进。这种情况在胶体上比较具有代表性,比如大气、水体等。介质内部吸收和散射的不同比例形成了介质的不同外观:

Reference:《Physics and Math of Shading》2013
可以观察到,在几乎无散射也无吸收的时候,介质是清澈的;由于介质中特定颗粒与光线发生了作用,随着散射的强度变大,介质变得浑浊;随着吸收强度的增加,光线中特定分量被吸收,光线变弱,颜色发生改变。

        在均质介质中,光线的行进方向基本不会发生变化,但它可能具有高吸收性,吸收量会随着光的传播距离增加;而在异质介质中,折射率会发生变化。如果折射率缓慢且连续地变化,则光线会弯曲成曲线。但是,如果折射率发生突变,则光会发生散射,它会分裂成多个方向。

        均质介质中,如果光线没有太多的被吸收或散射,光线直接从介质另一侧出射:

光线在介质内部行进一定距离后从介质另一侧出射

        从介质不同侧出射的光线我们通常称为透射(Transmittance),表现在材质上为透光性

        比如光线进入玻璃后,大部分又从玻璃另一侧出射,这使得我们可以看见玻璃后面的物体,我们认为玻璃是半透明的。此外,当我们逆光观察像树叶、耳朵这样的薄表面时,会发现表面部分位置透光,这也是一种透射现象。

        异质介质中,光线可能经过了内部的多次散射,又重新从表面出射,这种出射可以是介质同侧的也可以是异侧的:

光线在介质内部经过多次散射重新从介质表面出射

        这种情况通常出现在牛奶、皮肤、蜡烛等半透明物体上,我们称为次表面散射(Subsurface Scattering,3S)。光线在介质内部的散射,由于和微小颗粒发生了作用,可能会产生特定的次表面颜色。

        表现在材质上为泛光性,比如晶莹剔透的玉石。

        次表面散射和我们前面提到的漫反射实际上是同一种物理现象。只不过我们通常认为漫反射的入射和出射点在同一位置,而次表面散射的入射和出射点可以在不同位置。此外,入射和出射点是否在同一位置也取决于我们的观测尺度。也就是说,如果一个次表面散射的材质距离较远,那么它将会呈现漫反射的外观;如果近距离观测一个漫反射的材质,那么它也可以表现出次表面散射的外观。

Reference:《Physics and Math of Shading》2013
我们认为绿色圆圈内是一个足够小的距离,假如光线进入和离开的间距分布在这个范围内,我们就近似认为入射点等于出射点 ,我们把上图绿色区域的距离称为散射距离。

        体积散射和表面光照

        另外,在这里需要澄清的是,当我们在讨论胶体的时候,我们想要强调的是光线与介质微观颗粒的相互作用。当我们讨论次表面散射的时候,想强调的是光线在介质内部经过散射后出射这一过程。

        这也就意味着,在某些情况下,我们会关注在光线在介质内部的行进路线,包括它在某个位置散射或是吸收的状态,这通常用于体积散射(Volumetric Scattering)的计算,比如大气颜色的计算,会使用光线步进(Ray-Marching)来模拟真实的光照计算;

        而在另外一些情况下,我们会忽略光线在介质内部的传播路径,比如皮肤,我们更关心反射的光线以怎样的贡献比例分布到表面,比如鼻翼、眼角的散射强度是否存在差异。这一部分我们可以将其视为表面光照。

        光线与介质外观

        我们已经了解到了光线在介质中的传播路径,包括了从介质表面反射和折射进入介质内部。接下来我们来考虑这样的一个问题,光线的不同传播形式造成了怎样不同的外观。

        首先再次明确一点,我们之所以能够看见物体,是因为有光线进入了我们的眼睛。只有那些最终被反射(或者透射)出来的光线,才是我们需要关心的。

        因此,我们能够观察到不同材质呈现不同的颜色,是因为其它部分的波长都被吸收了,只有特定颜色的波长被反射出去,如下图红色的苹果就是因为把红光反射出去,我们才能观测到苹果是红色的。

Reference: 《The PBR Guide》by Adobe

        此外,我们还能解释天空为什么是蓝色的。太阳光经过大气层时,其中的部分蓝光发生了明显的瑞利散射而布满了整个天空,使得天空看起来是蓝色的;而其余部分的光线直射穿过大气,仍然呈现为白光。

        从光学性质来看,我们通常把物质分为金属、电介质和半导体。在PBR中我们通常只考虑金属和电介质。

        金属表面是具有光泽的,这是因为金属晶体内含有自由电子,而自由电子可以把所有频率的可见光快速反射出去,F0(垂直入射的反射比例)可达50%到100%,因此我们能看到大部分金属表面呈现银白色或刚灰色的光泽。对部分金属而言,由于还吸收了不同波长的光线,可能会呈现特殊的金属色,比如黄色的金子,赤红色的铜。

Reference:《Real Time Rendering》
金属所有可见的颜色都来自于镜面反射,折射进入金属的光会被立即吸收,因而不会发生漫反射或是次表面散射现象。如图,特殊的金属可能会呈现特别的颜色

        我们在金属表面除了能够观察到金属本身的色泽,还能观察到来自外部场景的反射颜色,这来自于环境光照。反射的图像由于金属的平整程度可能会清晰或模糊,表面越不平整,光的反射方向越不规则,这就导致反射图像的模糊。同理,表面的不平整也会导致反射高光的模糊。

        电介质是一种绝缘体,由于内部没有具有强反射性的自由电子,只有较少光线反射出去,F0(垂直入射的反射比例)约在2%~7%之间,绝大多数不会超过4%。其余光线得以折射进入介质内部,折射的光线被吸收或散射出去,形成了漫反射或次表面散射的外观。

Reference:《Real Time Rendering》
如图,大部分电介质的反射率都处在一个非常低的范围内

         像这种观察到的直接光入射到表面产生的颜色,我们通常称为反照率颜色(Albedo Color),即反射能量和入射能量的比例。对于金属来说,它是镜面反射产生的颜色;而对于非金属而言,它是漫反射产生的颜色。

微平面理论

        概念介绍

        当我们在讨论介质表面“光滑”或是“粗糙”的时候,我们实际上描述的是物体的微观属性,即介质在微观尺度的光学平坦程度。

        我们认为完全光滑的表面是不存在的,像这种理想中完全平坦的表面,我们称为光学平坦表面(Optically flat surface)。光学平坦表面具有一个特性,它可以准确的把光照分为反射和折射两部分。

        虽然不存在理想光学平面,但是,我们可以将表面视为由大量微小的光学平面组成,那么表面的外观是具有不同表面方向的多个点的聚合结果,每个点将入射光反射到稍微不同的方向,这就是微平面理论。

        微平面理论所定义的微观的存在尺度小于我们的观察尺度,但明显大于可见波长的尺度,因此每个表面点可被视为光学平面。微平面仅适用于单次反射的推导。

我们将表面视为由大量微小的光学平面构成,我们观测到的表面外观是微平面的聚合结果

        我们可以使用法线来描述微平面的方向,因此,微平面的形态就等价于微平面法线的形态。

        这种表面的不规则性小于像素(pixel)的层级,因此我们难以直接为其建模,因此我们选择从统计学的角度来模拟它的聚合结构,也就是用法线分布(Normal Distribution)来描述微平面的外观形态。微观法线分布有着紧密或是松散的形态,可能在某些方向上表现出偏向性,不同的表面法线分布对物体外观有着很大的影响。

Reference:《Real Time Rendering》
对于宏观上光滑的介质,不同法线分布对介质的外观有着很大的影响

         上图体现了微平面法线分布对介质外观的影响。一方面,反射光线较为集中的地方会形成高光,不同的集中程度导致了不同的高光外观;另一方面,表面越粗糙,反射就越模糊,因为表面方向与整体宏观表面方向的分歧更大(上图中下一排)。

        中间向量

        我们描述微平面的统计属性的时候,往往会借助中间向量,或者说半向量(half vector)来描述,我们有时候也将其称为微平面法线。

中间向量

        中间向量即光线和视线向量的中间向量。中间向量有一个特殊的特性,即当微平面法线和中间向量一致时,反射方向刚好和视线方向重合。 

        能量守恒定律

        微平面理论准遵循能量守恒定律,出射光线的能量不会超过入射光线的能量。

        这种的能量守恒体现在:

        ① 反射的光线和折射的光线能量总和近似小于等于入射光线的能量;

        ② 镜面反射的区域越集中,强度也就越高;反之,镜面反射的区域越大,也就越昏暗;

        逆向反射和微平面

        一些特殊的微平面结构会导致逆向反射的发生,也就是入射光直接从原路径反射回去:

Reference:《Real Time Rendering》
如图,是高散射具有逆向反射性质的微平面。对于具有逆向反射特性的材质,我们从特定方向能观察到明亮的外观,而其余方向则比较暗淡。如左图,视线和灯光方向接近时,观察到明亮的外观,视线和灯光方向有较大差异时,观察到暗淡的外观。

        如果微观几何不规则性大于次表面散射距离,则微平面表面不规则的遮挡部分会引起逆行反射效应。这主要发生在粗糙度较高的电介质上。

        微平面理论的不足

        微平面理论在模拟中存在一些缺陷,主要体现在以下几个方面:

        一是微平面理论没有考虑波动光学,我们将光视为光线而不是在波中传播。这使得我们无法为与光的波性相关的光学现象建模,比如衍射和薄膜干涉。

        二是微平面理论仅模拟了统计分布的结果,它认为随着视线变化微观几何的法线可见分布是不会发生变化的,这会导致部分微平面拟合的不准确性,如下图。

Reference:《Real Time Rendering》
图中微平面凸起部分是光滑的,凹陷部分是粗糙的。随着观察方向的变化,看到的表面属性会发生变化。上图第一排观察角度较高时,看到的是粗糙的表面,而第二排观察角度较平时,看到的是光滑的表面。

光照计算

        在光照计算中,有多种辐射量用来衡量光照属性。

        我们把一个光源输出的所有能量称为辐射通量(Radiant flux),光源投射到每单位立体角的能量称为辐射强度(Radient Intensity),光源投射到每单位立体角和单位表面的能量称为辐射率(Radiance)。

Reference:维基百科

        计算投射到介质表面某一点的光照,实际上就是计算该点接收到的所有光照的总和。我们称之为辐照度(Irradiance)。

        半球积分

        接下来我们来考虑对于某一点所有可能的光源分布情况。
        我们认为如果光照方向和当前点的法线角度超过90度,那么该光线是不可见的。因此,对于特定点p,我们可以认为入射光线分布在以点p为球心,点p的法线为中心轴的半球上。

入射光可能方向分布在法线的半球区域

        因此,如果我们要计算某一点的光照结果,我们需要累加所有反射到该点的入射光产生的影响。由于所有可能反射到该点的入射光分布在反射点的半球区域,因此该过程等价于在半球区域对所有入射光方向进行积分。

        我们不总是需要积分,一般来说,有以下一些情况:

       ① 对于直接入射光,直接计算它对当前点的贡献即可;

       ② 对于环境光,由于它没有特定的方向,而是来自四周,需要我们对所有可能的入射光方向进行积分;

        单位光照

        让我们来考虑漫反射的一种理想情况,光线均匀地反射到半球的各个方向。假设光线的辐射通量为L,投射到每个位置的辐射率为l,点的法线为n,法线所在的半球空间为Ω,法线与视线方向的夹角为θ,那么我们沿着半球dw积分,可得:

         

         这里的半球积分可以转化为极坐标的双重积分来计算。求解后可得:

<think>好的,用户现在想了解Blender中的PBR材质。首先,我需要回顾之前的对话,用户之前询问过PBR与NPR的混合,现在转向具体的Blender应用,说明他们可能对实际制作流程感兴趣。用户可能是3D艺术家、游戏开发者或者刚接触Blender的学生,需要明确且实用的信息。 接下来,我得确定PBR在Blender中的关键点。Blender作为开源3D软件,其PBR流程可能与其他软件如Maya或Substance有所不同。用户可能想知道如何设置材质节点、使用哪些贴图,以及如何与渲染引擎配合。需要分步骤讲解,确保结构清晰。 还要考虑用户可能的误区,比如PBR原理与实际操作的区别,或者如何正确使用贴图。可能需要解释基础概念,如金属度、粗糙度,以及它们在Blender中的具体应用。同时,用户可能对Cycles和Eevee的不同支持感兴趣,需要比较两者的差异。 另外,用户可能希望了解资源获取,比如哪里可以下载PBR材质,或者如何自己制作。可以推荐一些常用网站,或者Blender的内置工具如Shader Editor。此外,常见问题如贴图导入错误、渲染结果不符合预期也需要解答。 最后,要确保回答符合之前的格式要求,使用中文,正确应用LaTeX公式,分点说明,结构清晰。需要避免过于技术化的术语,但也要保持专业性,满足不同层次用户的需求。同时,检查是否有遗漏,比如节点设置的具体步骤,或者实际案例的应用,确保用户能一步步跟随操作。</think>在Blender中实现PBR(基于物理的渲染)材质是创建真实感3D内容的核心技术,其核心原理是通过精确模拟光线与材质的物理交互来实现视觉准确性。以下从基础原理到实践操作进行系统解析: --- ### 一、PBR核心原理 #### 1. 能量守恒定律 遵循$\int_{\Omega} f_r \cdot \cos\theta \, d\omega_i \leq 1$约束,确保反射光总量不超过入射光 #### 2. BRDF模型 - **漫反射项**:Lambertian模型 $f_{diffuse} = \frac{albedo}{\pi}$ - **镜面反射项**:采用GGX分布 $D(h)=\frac{\alpha^2}{\pi((h\cdot n)^2(\alpha^2-1)+1)^2}$ #### 3. 关键材质参数 | 参数 | 物理意义 | 典型值域 | 对应贴图通道 | |-------------|--------------------------|-------------|-------------| | 基础色 | 表面吸收光谱 | sRGB 0-1 | BaseColor | | 金属度 | 导体/绝缘体属性 | 0(非金属)-1 | Metallic | | 粗糙度 | 微观表面不规则度 | 0(镜面)-1 | Roughness | | 法线 | 微观几何细节 | 切线空间向量 | Normal | | 环境光遮蔽 | 缝隙处光线衰减 | 0(全暗)-1 | AO | --- ### 二、Blender实现流程 #### 1. 材质节点配置(以Cycles渲染器为例) ```python # 节点树结构示例 ShaderNodeTexImage → [BaseColor] → Principled BSDF → [Metallic] → → [Roughness] → ShaderNodeNormalMap → [Normal] → ShaderNodeAmbientOcclusion → [AO] → Mix Shader ``` #### 2. 贴图规范 - **分辨率匹配**:建议基础色/金属度/粗糙度使用相同分辨率(如2K=2048×2048) - **色彩空间**: - 基础色:sRGB - 金属度/粗糙度:Non-Color - **文件格式**:推荐EXR(32位浮点)或PNG(8位) #### 3. 渲染引擎对比 | 特性 | Cycles(路径追踪) | Eevee(实时渲染) | |--------------------|--------------------------|------------------------| | 光线精度 | 完全物理准确 | 近似模拟 | | 反射效果 | 自动计算多次反弹 | 依赖屏幕空间反射 | | 硬件需求 | GPU/CPU高负载 | 低配设备友好 | | 典型应用场景 | 影视级输出 | 实时预览/游戏开发 | --- ### 三、进阶技巧 #### 1. 材质混合 - **分层材质**:使用Shader Mix节点混合不同粗糙度的材质层 ```glsl float blend_factor = texture(blend_mask).r; BSDF mix_bsdf = mix(metal_bsdf, plastic_bsdf, blend_factor); ``` - **程序化纹理**:通过Voronoi纹理生成金属划痕效果 #### 2. 优化策略 - **纹理压缩**:使用BC7压缩格式(在Blender中启用GPU压缩) - **LOD系统**:根据摄像机距离动态切换贴图分辨率 - **烘焙技术**:将复杂节点网络烘焙为简化贴图 --- ### 四、常见问题解决方案 #### 1. 金属边缘过亮 **成因**:未正确分离金属/非金属的F0反射值 **修正**:非金属F0设为4%($F_0 = \frac{(n-1)^2}{(n+1)^2}$),金属使用基础色作为F0 #### 2. 粗糙度映射失真 **检测**:在着色器编辑器中添加$-\log(1-roughness)$节点验证线性关系 **修正**:确保粗糙度贴图为线性空间 #### 3. 法线贴图方向错误 **诊断**:在Blender中切换法线贴图的Color Space为Non-Color **修正**:使用Vector Rotate节点调整切线空间方向 --- ### 五、资源推荐 1. **材质库**: - Poliigon(商业级PBR材质) - ambientCG(CC0免费资源) 2. **插件工具**: - Node Wrangler(快速节点连接) - PBR-Shaderpack(一键PBR材质生成) 3. **学习路径**: - Blender Guru的"PBR材质大师课" - 官方文档《Physically Based Rendering in Blender》 --- 通过这种基于物理的材质构建方式,Blender用户可以实现从生锈金属到湿润皮肤的高度真实材质表现。最新发展包括:支持OpenPBR标准材质规范(2023年Blender 3.5+),以及通过AI工具(如Materialize AI)自动生成PBR纹理链。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值