一、图形学中的材质

不同的物体表面有着不同的材质,而不同的材质意味着它们与光线的作用不同。那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数,叫做BRDF,而在实际上,也就是BRDF定义了不同的材质。BRDF决定了光如何被反射。

1.漫反射材质

之前我们在布林冯着色模型中根据经验定义漫反射系数,在我们学习了辐射度量学BRDF之后可以将它精确的定义出来。我们以上图为例,定义一个漫反射材质,它不吸收光,也就是说来了多少光就要反射出去多少,我们人为做一个场景,假设四面八方来的Radiance是均匀的,而因为它是漫反射材质,反射出去的Radiance也应该是均匀的,同时因为能量守恒进出的能量是一样的,那么入射的Radiance和反射出去的Radiance也应该相等。由此我们可以把渲染方程化简得到此时的BRDF=1/π,而这就是完全不吸收能量的BRDF。我们再定义一个反射率(albedo),这个反射率ρ可以是一个数R,G,B三个通道或者是光谱,但是ρ∈[0,1],这样我们就可以定义不同颜色的BRDF,这样我们就知道一个漫反射的BRDF应该是在01/π之间

2.Glossy材质

Glossy材质我们之前提到过,它并不是完美的镜面反射,例如打磨的金属。它们的反射接近镜面但又不是绝对的镜面,如上图右上角的反射示意图。

3.理想反射/折射材质

这种材质不仅在表面会发生反射还会发射折射,如玻璃,水面等。右边这幅图有颜色,说明光折射进入球壳之后被部分吸收了。

二、反射和折射

1.反射

关于反射,我们知道反射角等于入射角,这也是反射定律。而关于反射定律我们有两种理解方式。

第一中如上图左,给定入射方向和反射方向还有法线方向我们可以知道它们的关系,入射方向向量+反射方向向量根据平行四边形法则应该是法线方向,且长度为平行四边形的对角线,这里也就是菱形,那也就是对反射方向/入射方向向量做一个法线上的投影再乘以2就是最终的结果,最终把除了反射方向的项都移到右边,就得到了公式ωo = -ωi + 2(ωi·n)n,这样给定任意入射方向ωi和法线方向n我们就可以求出它的反射方向

另一种理解方式如上图右,我们在左图垂直上方观测会得到右面这张图,我们之前讲到立体角,讲到过球坐标,那么这里的Φo,Φi就相当于球坐标中的水平方位角决定水平反向,而入射角和反射角则决定了竖直方向的角度。在水平方位角上,我们可以很容易的发现Φo=(Φi+π)mod2,也就是反射方向的水平方位角始终等于入射方向的水平方位角+π再对2π取模即可。(关于取余和取模运算不了解的朋友可以自行搜索了解,这里不做赘述)

2.折射

折射定律:不同的材质有不同的折射率,如上图的ηiηt,入射角反射角的正弦,上图的sinθisinθt,那么则有ηi·sinθi=ηt·sinθt。与此同时我们仍然像可以反射一样得到方位角φ之间的关系。

而根据折射定律,我们很容易得到折射角的余弦,它一定是一个实数,也就是上面根号内的值一定要≥0,而不能<0,如果<0,那么说明ηi/ηt>1,也就是光从光密介质射向光疏介质,并且入射角大于等于临界角时全反射现象才会发生。

而全反射会导致一种现象,如上图,人在水底向上看的视野只有一小片区域。这提示了我们之前在接受Path Tracing的时候没有提到,而实际上在做Path Tracing的时候是要把这么个问题考虑进去的。我么们之前说过BRDF可以来描述反射,那么折射用什么来描述呢?这里叫做BTDF,而BRDFBTDF可以统称为BSDF

3.菲涅尔项

如上图,一本书靠着墙在桌子上放着,我们分别俯视,半俯视,平视地看这本书,发现在桌子上反射出的书的“倒影”逐渐变明显,也就是说反射的明显程度是和我们视线和反射平面的角度相关的,这就是菲涅尔现象

这也说明了,有多少能量被反射其实是与入射光的方向和和法线方向的夹角有关系的。且通过菲涅尔项,我们可以知道到底有多少能量被反射,又有多少能量被折射。

如上图(某种折射率=1.5的绝缘体的菲涅尔项)中的红色线表示,当法线方向和光的方向为90°的时候,也就是垂直的时候,所有的能量都会反射出去,而法线方向和光在一条线上的时候,反射为0,光会直接从表面穿过发生折射。(P和S两条线表示光的极化性质,与光的波动性有关,但在这里我们不考虑,截止目前还没有渲染器把光的极化性质考虑在内)

如上图,显示为某种导体的菲涅尔项,显然我们发现导体和非导体的菲涅尔项存在着很大的不同,如非常光滑的金属,即使我们垂直这表面去看,仍然能看到比较强的反射。包括在上图中我们还看到当光线与法线接近90°的时候反射的能量还有一个先降后增的效果。

上图是菲涅尔项的计算公式,其中Rs和Rp是我们上面提到的极化,它们由折射率和夹角确定,最终我们想得到无极化的曲线把它们两个平均起来即可,但是这个公式过于复杂,人们通常用一种简化的近似形式如下图。

Schlick's approximation—Schlick近似法

Schlick近似法,思想是我们认为每个菲涅尔项都有一个初始值为R0,然后逐渐增长,到90°的时候为1。基准反射率为R0,也就是垂直时候的反射率,对于非导体我们可以将R0设置的低一些比如0.1以下,而对于导体我们可以把R0设置的高一些比如0.9,最终我们拟合出一条近似的曲线来近似它的菲涅尔项。

三、微表面模型

什么是微表面模型呢?看上图中从太空中拍摄的地球照片,我们可以看到一大片的高光,但是实际上地球的表面并不是完全光滑的,有各种各样的地形起伏,高楼等等,那我们为什么能看到高光呢?因为我们离的足够远,而足够远意味着我们看不到所谓地形,高低起伏等细节,只能看到一个总体的光线反射分布。而微表面模型正是根据这一特点提出来的。

微表面模型认为,表面是有起伏凹凸不平的,但是如果我们从远处(宏观)l来看,我们可以把它当作是平面,并且它是粗糙的。从近处看(微观),它是凹凸起伏的,但是表面的每个微元都是光滑的,也就是发生完美的镜面反射。这也说明了,我们从远处看看到的是外观,而近处看看到的是几何。

而通过微表面模型,我们可以用法线的分布来描述物体的粗糙程度,如上图的glossy材质,在微观上表面的法线朝向接近垂直向上,也就是完美的平面那它的反射就相对集中一些会形成一定范围的高光,而diffuse材质,表面法线分布非常分散,所以反射出的光也很分散,那么高光效果就会弱。

而由此我们可以定义出微表面的BRDF,其中F为菲涅尔项;D为法线分布,h是我们之前布林冯着色模型中提到过的半角向量,我们知道只有当半角向量h和法线n一致的时候,才能把光从入射方向反射到出射方向上去,因为我们规定了微表面上发生的都是完美的镜面反射,而D项就是在求有多少微表面的法线n和半角向量h方向一致进行一个查询。G又叫几何项,它用来表示有多少能量因为自遮挡失效了,因为微表面是有起伏的,如果从上图微表面左几乎平行地面打过来一束光,那么右边许多地方是接受不到光照的,也就是说微表面会产生自遮挡现象。而G项就是用来表示这个问题的。光线几乎平行于表面的入射角度我们称之为Grazing angle,也就是无论是入射方向还是观察方向,只要接近Grazing angle,那么G项就会起作用。

各向同性/各向异性材质

对于微表面模型,我们可以分为两种,各项同性和各项异性。各向同性表示它的法线虽然分布朝四面八方,但是各个方向的发现分布相对均匀,如上图中的第一幅图。而各向异性,如打磨过的金属,它的微表面的法线分布有明显的方向性,如上图第二幅图,水平和竖直方向的发现分布存在着明显的差异。

而反映在BRDF上也可以看到,各项异性的BRDF和各向同性的BRDF也不同。我们之前说过的BRDF是各个方向分布均匀的,而各向异性则不同,各项异性的入射角和出射脚不仅和相对方位角有关,还和绝对方位角有关。

四、BRDF性质的小结

非负性:BRDF描述的是能量分布,所以一定≥0

线性:我们之前是把漫反射,高光的BRDF项分别加在一起求出最终的结果。

可逆性:在同一点颠倒出射方向和入射方向得到的BRDF是一样的。

能量守恒:BRDF的存在不会让能量变多,如果全都反射那么最终结果就=1,部分被吸收则<1。

各项同性和各项异性:如果是各向同性的BRDF,那么就只于相对方位角有关,那么本来是四维的BRDF我们可以把最后两项合并变为方位角之差,又因为BRDF具有可逆性,所以方位角之差可以不考虑正负,变为绝对值即可,得到最终的各向同性BRDF:fr=(θi,θr,|Φr-Φi|)

五、BRDF的测量

为什么要做BRDF的测量呢?我们之前所说的模型基本都是基于许多假设和简化的,所以实际上并不准确,甚至有时候相差非常大,其次,如果我们通过测量得出了BRDF的数值,那就不需要进行计算,而是拿来直接使用就可以了。

BRDF怎么测量呢,我们知道它实际上就是两个方向的函数,一个入射方向一个出射方向。假如我们现在就对一个着色点观测,我们用一个光源从四面八方去照亮它,再用一个摄像机从四面八方去拍,这样我们就覆盖了所有可能的方向。

从上面的思路中我们得到了一个非常简单粗暴的算法,也就是枚举所有相机的拍摄方向和枚举所有的光源照射的方向,而2x2我们得到了一个四维的数据,而要想全部枚举完,四维是一个非常庞大的数据量,那怎么办呢?我们之前提到过如果我们策测量一个各项同性的材质,它的BRDF其实是一个三维的数据,而又因为BRDF的可逆性,我们可以把数据量再次减少一半。再者我们不一定要测出所有方向,我们可以只测量若干个方向,而其它方向的BRDF我们可以估计出来。

而不仅是BRDF的测量,BRDF的存储,压缩也有很多问题需要研究,这里就不介绍了,感兴趣的朋友自行了解。

参考:

Lecture 17 Materials and Appearances_哔哩哔哩_bilibili

GAMES101_Lecture_17 (ucsb.edu)

[计算机图形学]材质与外观(前瞻预习/复习回顾)相关推荐

  1. [计算机图形学]重心坐标应用纹理(前瞻预习/复习回顾)

    一.重心坐标,插值 上篇的最后我们提到了,当顶点在纹理上的对应uv坐标成功找到之后,三角形三个顶点中间的值需要用三角形的重心坐标插值计算得到,那么这个运算是怎么进行的,本篇我们将介绍.插值的运算不仅仅 ...

  2. [计算机图形学]光线追踪的基本原理(前瞻预习/复习回顾)

    一.光栅化的弊端 我们为什么要用光线追踪呢,在之前的篇章中,我们提到了,光栅化的方式很难表示一些全局的效果,如(1)软阴影,(2)Glossy的反射(类似镜子但又不像镜子那么光滑的材质,如打磨的铜镜和 ...

  3. [计算机图形学]反走样(前瞻预习/复习回顾)

    一.前言:走样的产生 上一篇我们谈到了光栅化,在讲述光栅化时我们得到了光栅化之后的这样一张图,如下图 显然,这和我们原本的三角形严重不符,原因是像素是方块,而无法完美的拟合三角形. 也就是说我们得到的 ...

  4. [计算机图形学]动画与模拟:欧拉方法、刚体与流体(前瞻预习/复习回顾)

    一.前言 这是本专栏的倒数第二篇文章了,为什么不是最后一篇?因为我要单独写一篇总结哈哈,不管怎么说,从今年的3.13的MVP变换开始写,写到现在,也是一个很大的工程了,我很高兴能在大二下学期的期中这个 ...

  5. [计算机图形学]辐射度量学、渲染方程与全局光照(前瞻预习/复习回顾)

    一.前言 我们前面讲到的Blinn-Phong着色,Whitted-Style光线追踪都有一定问题,那就是它们并没有严格的按照物理规则定义各个变量.比如,Blinn-Phong中的光的强度,并没有一个 ...

  6. [计算机图形学]纹理的高级应用(前瞻预习/复习回顾)

    一.前言 上节课我们讲了纹理的放大缩小产生问题后,我们的解决方法,那么纹理是什么呢?在现代GPU中,我们可以理解为是内存+范围查询(滤波),也就是对一块区域做点查询/范围查询,并且做的非常快,也就是说 ...

  7. [计算机图形学]几何:曲线和曲面(前瞻预习/复习回顾)

    一.曲线 1.Bézier Curves-贝塞尔曲线 贝塞尔曲线也是一种显式的几何表示方法.贝塞尔曲线定义了一系列的控制点,致使确定满足这些控制点关系的唯一一条曲线:如上图定义的贝塞尔曲线满足 起始点 ...

  8. [计算机图形学]动画与模拟:关键帧动画、质点弹簧系统、运动学与绑定(前瞻预习/复习回顾)

    一.动画的简要概念 动画和语言一样,一开始都是作为传达信息的工具.什么是动画呢?简单的理解就是让画面变成"活的",也就是让它们能够动起来,其次需要一定的美观.在图形学上,我们可以把 ...

  9. 【个人笔记】《计算机图形学》部分课堂笔记与复习

    考完试有点伤之心,遂发笔记于csdn:考前看了一套11年左右的卷子,以为差不多的内容,最多改一下几道题就行了:结果自己还是图样图森破,十年前的卷子参考价值有但不能只全依赖试卷的题目,还是要好好上课听讲 ...

最新文章

  1. linux c 内存泄漏调试工具 《valgrind用户手册》 2. 使用和理解Valgrind核心
  2. sqlserver中判断表或临时表是否存在
  3. jQuery操作css样式、属性、动画、节点
  4. Jmeter脚本录制(APP)
  5. 这个冬天,头秃了,口袋也空了......
  6. Oracle的安装、配置与工具使用 实验笔记一
  7. Deep Learning Literature 常用词中英文总结(一)
  8. readline,readlines,read函数
  9. iOS最新验证电话号码与手机号码的正则方法
  10. 【安全测试】AppScan:下载与安装
  11. 图片|视频|音频文件扩展名(后缀)
  12. android 开发 耳机接口 自拍,首次用KXD手机就为之倾倒,这就是KXD K30手机带来了魅力...
  13. 植物大战僵尸_修改存档和金钱
  14. 2021 AI年度报告-stateof.ai出品【1】
  15. 微型计算机主板最新发展,三镇学子齐瞩目——精英主板 Intel915P平台新技术体验营首选武汉...
  16. P2564 [SCOI2009]生日礼物(尺取法/双指针)
  17. 论文学习-NOVA:A log-structured File System for Hybrid Volatile/Non-volatile Main
  18. Linux文件操作及管理
  19. 【游戏介绍】aiwi体感balance
  20. UltraISO 创建的虚拟光驱盘符 G 更改为 H

热门文章

  1. 【附源码】计算机毕业设计java中药城药材销售管理系统设计与实现
  2. 文件描述符与文件句柄
  3. AI+教育的未来,数字化、智能化的教育发展不可逆
  4. Springboot毕设项目春华纺织厂的仓储管理系统7s177(java+VUE+Mybatis+Maven+Mysql)
  5. 用python实现实时监控网卡流量(类似 top 动态刷新)
  6. Leetcode刷题笔记:栈与队列篇
  7. 怎么用matlab编写quad8算法,quad8 是 matlab 中调用( )公式的命令
  8. scala-模式匹配(字符串、数组、元组、集合、类、偏函数)
  9. 支付宝签名php,PHP实现RSA签名生成订单功能【支付宝示例】
  10. Unity Shader GrabPass 抓屏幕 截屏