五、BRDF 漫反射项与镜面反射项
5.1 漫反射项
兰伯特(Lambert) BRDF:,为一定值,之所以要除以 ,是为了保证反射半球积分值为 1,这正好是球表面积的
由此可得:给定光源入射方向 ,表面漫反射出射辐射率就为
除此之外,还有一个十分著名的漫反射 BRDF 为 Disney BRDF:
,其中 , 为表面颜色, 为表面粗糙度
5.2 高光反射项
基于微面元理论,BRDF 高光反射项 Cook-Torrance 的形式为:
,其中 ,即光照与视线夹角半角向量,而对于 、、 三个函数:
- :菲涅尔反射(Fresnel Equation),经典的 Schlick 菲涅尔近似等式:
- :法线分布函数(Normal Distribution Function),最经典的莫过于之前的 Blinn-Phong 经验模型:,除此之外还有著名的 GGX 和 Beckmann 模型
- G:阴影遮蔽函数,一个例子为 GGX 衍生模型 Smith-Schlick:,其中 ,还有更加复杂的高度相关遮蔽阴影型(Height-Correlated Masking and Shadowing)等
这里面随便的一个物理例子 or 模型,想要完全讲解几乎都要数篇文章的体量,有兴趣的话可以之间参考论文或书籍
5.3 Cook-Torrance BRDF 模型
完整的 Cook-Torrance BRDF 兼有漫反射和镜面反射两个部分,也就是
到此,就可以得到一个反射方程的最终版:
这里的 就是入射光线中被折射部分的能量所占的比率,而 就是被反射部分的比率
六、微面元理论
对于 BRDF 高光反射项,不得不提到微面元理论,几乎所有的 BRDF 高光反射项都是建立在其之上的
对于微面元理论的说法是这样的:我们看到的表面上的一点,其实是由很多朝向各异且光学平的微小表面组成,尽管物体表面不会是完全平滑的,但是这些“微面”确是完全平滑的。也就是说它们具有绝对的高光反射,当光与物体表面一点相交时,实际上是和一系列微面元交互。当然微面元理论也仅仅是真实世界散射的一种近似理论,仍有一些材质无法用微面元理论来描述
对于高光反射,我们只需要关心的是光与微面元相交时光线的反射方向:假设光线从 方向照射到微面元,而我们在 方向观察,由于光学平面只会将光线 反射到关于法线对称的方向,而 和 已经确定,因此只有法线朝向正好是上面 方向的微表面才会将光线发射到 方向,从而被我们看见
除此之外,也并非所有满足 的微表面都能被我们所看到,它们可能会被遮蔽:尽管它们中的一些可能通过多次反射仍会被我们看到,但是这部分不在微面元理论考虑的范畴内
最后再考虑上菲涅尔反射:也就是光线一部分被反射,一部分被折射
到此为止,重新理解上一节的 、、 三个函数,就很明白了
- :菲涅尔反射(Fresnel Equation),既然已经是完全光滑的平面了,当然可以直接上
- :法线分布函数(Normal Distribution Function),它用于计算有多少比例的微面元满足 从而可以被我们看到
- G:阴影遮蔽函数(Geometry Function),它用于进一步筛查,满足 的微面元中有多少会被遮蔽,从而给出不被遮蔽的活跃微面元所占比例
而对于分母部分 ,则是用于矫正从微面元的局部空间到整体宏观表现数量差异的校正因子(Correctionfactor)
在 Cook-Torrance 的论文中,分母中的 4 被改成了 ,不过现在大家公认的还是用 4
关于 Cook-Torrance BRDF: 的推导还是略显复杂和困难的,需要一定的数学基础,由于是应用类 blog,这里就不详解了,就放一个链接和一张图吧:
七、金属与镜面
以 Unity3D 为例,UnityStandard Shader 有两种不同的风格:Standard 和 Standard(Specular setup),分别为金属和镜面,无论选择哪一种处理方式,都能够很好的实现大多数常见的材质类型展现的效果,它们只是工作流上有许不同而已
金属材质特性:
- 几乎没有漫反射,因为所有被吸收的光都会被自由电子立刻转化为其他形式的能量
- 有非常强烈的高光反射,并且高光反射通常是有颜色的,例如金子的反光颜色为黄色
非金属材质特性:
- 大多数角度高光反射的强度比较弱,但在掠射角时高光反射强度反而会增强
- 高光反射的颜色比较单一
- 漫反射的颜色多种多样
理论上来说,一个物体要么是金属,要么就不是金属,不会两者皆是,但是大多数的渲染管线都允许在 0.0 至 1.0 之间线性调整金属度(Metallic),以得到一个更柔和的效果
7.1 金属工作流
StandardShader 中的重要属性:
- 反照率(Albedo):除了漫反射,金属工作流下的 Albedo 属性还将决定镜面反射的颜色
- 金属度(Metallic):用于决定镜面反射的颜色和漫反射颜色所占比,如果指定的金属度(Metallic)是一张纹理,那么光滑度(Smoothness)可由纹理的 Alpha 通道提供
7.2 高光工作流
StandardShader 中的重要属性:
- 反照率(Albedo):只用于漫反射
- 镜面颜色(Specular):用于决定材质上镜面反射的颜色和强度,输入的纹理使得拥有一个不同颜色的镜面反射成为可能,在金属工作流中,这个值是需要计算的,如果指定的镜面颜色(Specular)是一张纹理,那么光滑度(Smoothness)可由纹理的 Alpha 通道提供
7.3 再提菲涅尔现象
菲涅尔方程可谓是非常出名,不仅在微表面理论中有一席之地,还被用于计算 BRDF 中漫反射项和高光反射项所占比例,其主要描述的是被反射的光线对比光线被折射的部分所占的比率,这个比率会随着我们观察的角度不同而不同。例如在垂直观察时,任何物体或者材质表面都会有一个基础反射率(Base Reflectivity),但如果以一定的倾斜角往平面上看的时候,你就会看到很明显的反光,几乎感受不到物体本身的颜色
一个非常著名的菲涅尔方程就是 Fresnel-Schlick 近似,它几乎是你会遇到的唯一的经验方程:
- ,其中 就是基础反射率,它利用折射指数(Indices of Refraction, IOR)计算得出
理论上 Fresnel-Schlick 近似仅仅对电介质或者说非金属表面有定义,对于金属或导体(Conductor)表面,使用它们的折射指数计算基础折射率并不能得出正确的结果,不过好在这可以反过来推:先预计算出平面对于法向入射时 的估值,然后基于相应观察角的 Fresnel-Schlick 近似对这个值进行插值。用这种方法来进行进一步的估算就能对金属和非金属材质使用同一个公式了
平面对于法向入射的响应或者说基础反射率可以在一些大型数据库中找到,这可以参考:http://refractiveindex.info/
从这张表中可以看出:
- 对于金属表面而言基础反射率一般带有色彩,并且均值要远高于非金属(电介质)表面
- 金属度(Metalness)对菲涅尔现象有较大的影响
因此,对于金属工作流菲涅尔项是需要重点考虑的,通过预先计算电介质与导体的基础反射率 ,我们可以对两种类型的表面使用相同的 Fresnel-Schlick 近似,但是如果是金属表面的话就需要对基础反射率添加色彩,代码非常简单:
vec3 F0 = vec3(0.04);
F0 = mix(F0, surfaceColor.rgb, metalness);
其中 取的 0.04 为所有非金属基础反射率的平均值
参考文章:
- https://zhuanlan.zhihu.com/p/96975561
- https://blogs.unity3d.com/cn/2016/01/25/ggx-in-unity-5-3/
- https://zhuanlan.zhihu.com/p/21376124
- https://qianmo.blog.csdn.net/article/details/85239398
- 《UnityShader》入门精要
- https://isux.tencent.com/articles/THE-PBR-GUIDE-1.html