接上文:PBR理论基础1:辐射度与BRDF

五、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 兼有漫反射和镜面反射两个部分,也就是 

到此,就可以得到一个反射方程的最终版:

这里的  就是入射光线中被折射部分的能量所占的比率,而  就是被反射部分的比率

一张很出名的图,其中红色光线(次表面散射)作为漫反射,黄色光线作为镜面反射,
kd 即是红色光线所在比例,这一般由菲涅尔项决定

六、微面元理论

对于 BRDF 高光反射项,不得不提到微面元理论,几乎所有的 BRDF 高光反射项都是建立在其之上的

对于微面元理论的说法是这样的:我们看到的表面上的一点,其实是由很多朝向各异且光学平的微小表面组成,尽管物体表面不会是完全平滑的,但是这些“微面”确是完全平滑的。也就是说它们具有绝对的高光反射,当光与物体表面一点相交时,实际上是和一系列微面元交互。当然微面元理论也仅仅是真实世界散射的一种近似理论,仍有一些材质无法用微面元理论来描述

对于高光反射,我们只需要关心的是光与微面元相交时光线的反射方向:假设光线从  方向照射到微面元,而我们在  方向观察,由于光学平面只会将光线  反射到关于法线对称的方向,而  和  已经确定,因此只有法线朝向正好是上面  方向的微表面才会将光线发射到 方向,从而被我们看见

除此之外,也并非所有满足  的微表面都能被我们所看到,它们可能会被遮蔽:尽管它们中的一些可能通过多次反射仍会被我们看到,但是这部分不在微面元理论考虑的范畴内

最后再考虑上菲涅尔反射:也就是光线一部分被反射,一部分被折射

到此为止,重新理解上一节的  三个函数,就很明白了

  • :菲涅尔反射(Fresnel Equation),既然已经是完全光滑的平面了,当然可以直接上
  • :法线分布函数(Normal Distribution Function),它用于计算有多少比例的微面元满足  从而可以被我们看到
  • G:阴影遮蔽函数(Geometry Function),它用于进一步筛查,满足  的微面元中有多少会被遮蔽,从而给出不被遮蔽的活跃微面元所占比例

而对于分母部分 ,则是用于矫正从微面元的局部空间到整体宏观表现数量差异的校正因子(Correctionfactor)

在 Cook-Torrance 的论文中,分母中的 4 被改成了 ,不过现在大家公认的还是用 4

关于 Cook-Torrance BRDF:  的推导还是略显复杂和困难的,需要一定的数学基础,由于是应用类 blog,这里就不详解了,就放一个链接和一张图吧:

  • https://zhuanlan.zhihu.com/p/21376124
  • 来源:知乎用于 Maple

七、金属与镜面

以 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

PBR理论基础2:光照、材质与微面元理论相关推荐

  1. PBR理论基础3:基于图像的光照(上)

    一.基于图像的光照(Image based lighting, IBL) 只要了解了下面这些,就很容易理解基于图像的光照了: 直接光与间接光的区别(UnityShader9:光照基础回顾) PBR理论 ...

  2. PBR理论基础3.1:基于图像的光照(下)

    接上文:PBR理论基础3:基于图像的光照(上) 四.蒙特卡洛积分 蒙特卡洛积分在前篇计算漫反射项时就已经应用过了 对于定积分    ,如果无法简单求得原函数,一个尝试去求得其近似解的方法就是蒙特卡洛积 ...

  3. 【PBR系列四】PBR核心原理及材质属性查询

    本文核心知识主要参照知乎毛星云浅墨的游戏编程文章总结归并,并根据个人学习方向进行了筛选摘抄,如有错误或不完整之处,可参照原文阅读. 本部分将主要关注基于物理的渲染的核心理论与渲染的光学原理,以在整个系 ...

  4. Opengl-光照-基本光照-材质(有了材质一个物体才算是完整了)

    在现实世界里,每个物体会对光产生不同的反应.比如说,钢看起来通常会比陶瓷花瓶更闪闪发光,木头箱子也不会像钢制箱子那样对光产生很强的反射.每个物体对镜面高光也有不同的反应.有些物体反射光的时候不会有太多 ...

  5. 工具网站推荐 - 最好的8个免费下载Pbr贴图和材质的网站

    1 8个免费下载Pbr贴图和材质的网站 在学习OpenGL绘制Pbr材质模型的时候,经常到处找Pbr材质和整组贴图,奈何国内这方面的资源真的少的可怜.这篇文章主要总结一下我平常经常去下载Pbr材质和贴 ...

  6. OpenGL学习笔记(四)-光照-材质-光照贴图

    参考网址:LearnOpenGL 中文版 哔哩哔哩教程 第二章 光照 2.1 颜色 现实生活中人眼看到某一物体的颜色,是它所反射的颜色.如将白光照在红色的玩具上,玩具会吸收白光中除了红色以外的所有子颜 ...

  7. LearnOpenGL 光照—材质

    文章目录 写在前面 材质 设置材质 光的属性 不同的光源颜色 总结 练习 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录一些知识点和自己遇到的问题. 材质 在现实世界里,每个 ...

  8. PBR理论基础1:辐射度与BRDF

    前置:UnityShader9:光照基础回顾 一.反射等式(Reflection Equation) 定义: :观察视角 :入射方向 :表面法向量 有基于物理的反射等式:,其为渲染方程的一个实例:其中 ...

  9. UnityShader32:PBR(一)

    一.整装待发 1.1:万事俱备 UnityShader相关: UnityShader1:渲染流水线 ~ UnityShader24:最简单的屏幕后处理例子 最好还是了解一个图形接口:OpenGL 或者 ...

最新文章

  1. mysql substr 中文乱码_刚碰到的MySql乱码的问题
  2. 排序算法Java代码实现(二)—— 冒泡排序
  3. 【LeetCode】分类刷题 之 栈和队列
  4. Mybatis代码生成适配Oracle和Mysql数据库_01
  5. alpine linux图形界面_跟光磊学Linux运维-Linux入门与基本使用
  6. android 进度条 代码,Android 进度条使用详解及示例代码
  7. 信息学奥赛一本通(1123:图像相似度)
  8. 触手直播停服,游戏主播们涌入快手
  9. keytool 错误 java.io.IOException: incorrect AVA format
  10. Python数据结构与算法(2.3)——链表
  11. cassandra 学习笔记(2)
  12. 深度学习入门学习路线及好课推荐
  13. 关于安控RTU和宏电DTU的通讯设置
  14. (python)bing搜索引擎API接入测试
  15. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学研究生计算机科学排名关键消息重点总结...
  16. python中heapq的库是什么_Python中heapq模块的用法
  17. 国网站直接SHOPPING经验之总结, 和美国代购说拜拜~~新加 如何注册PAYPAL~~~~
  18. 用PHP+MYSQL写一个完整的登录界面
  19. Swing + MySQL实现汽车租赁系统4.0
  20. “求同”不是最终目标,英特尔致力打造有“差异”的精彩

热门文章

  1. python零基础好学吗-如何从零开始学习Python,零基础学python难吗
  2. 编程软件python-零基础学Python编程需要安装什么软件?
  3. python要学多久可以找到工作-学习Python多久能找到工作?老男孩Python开发培训
  4. 科学网—语音识别技术发展史
  5. 如何查找涉密文件_企业如何处理涉密信息文件?这四点必知
  6. qq 实现连接内网_如何穿透内网稳定进行远程桌面?花生壳盒子来搞定
  7. python处理数据快吗_python (七、Numpy高效数据处理)
  8. 【计算机网络笔记】编码与调制
  9. 【动态规划】完全背包问题:构成m的最少个数
  10. matlab中 mcc/mbuild/mex 区别