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

news2024/11/23 17:00:58

一、图形学中的材质

不同的物体表面有着不同的材质,而不同的材质意味着它们与光线的作用不同。那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数,叫做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)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript经典教程(七)-- JavaScript基础 -- 函数、argument、匿名函数、函数深入、选项卡

188&#xff1a;JavaScript基础 - 函数、argument、匿名函数、函数深入、选项卡 1、函数 &#xff08;1&#xff09;特性 1、每个函数都有自己的作用域。 2、如果执行该变量名&#xff0c;会返回自己&#xff0c;即返回函数本身。 3、正常调用&#xff0c;返回函数中的执…

软件STM32cubeIDE下STM32F1xx使用定时器(TIM8)+DMA+PWM点亮灯带WS2812-基础样例

软件STM32cubeIDE下STM32F1xx使用定时器&#xff08;TIM8&#xff09;DMAPWM点亮灯带WS2812-基础样例 &#xff08;1&#xff09;前言&#xff08;2&#xff09;环境说明&#xff08;3&#xff09;先行了解本次调到坑里的两个点问题点&#xff08;1&#xff09;TIM3_ch2,在STM3…

真题详解(极限编程)-软件设计(六十一)

真题详解&#xff08;二分查找平均值&#xff09;-软件设计&#xff08;六十)https://blog.csdn.net/ke1ying/article/details/130417464 VLANtag属于 数据链路层实现。 数据链路层&#xff1a;网桥交换机。 网络层&#xff1a;路由器。 物理层&#xff1a;中继器。 Telent…

1694_week1_MIT使用Python编程学习手记1

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 首先说明一下&#xff0c;这部分信息的整理只是我个人的理解。由于自己的知识功底以及英语水准&#xff0c;很可能会有大量的疏漏。再此&#xff0c;我只想把自己学习时候的一…

Linux进程通信:信号 信号集 信号集函数

1. 信号的概念 Linux进程间通信的方式之一。信号也称为“软件中断”。 信号特点&#xff1a; 简单&#xff1b;携带信息有限&#xff1b;满足特定条件才发送信号&#xff1b;可进行用户空间和内核空间进程的交互&#xff1b; 信号4要素&#xff1a; &#xff08;1&#xf…

抓马,互联网惊现AI鬼城:上万个AI发帖聊天,互相嗨聊,人类被禁言

近日又有一个社区迷惑走红 上万个AI发帖聊天&#xff0c;人类不得入内&#xff1f; 据红星新闻报道 近日&#xff0c;一个名为Chirper的AI网络社区突然爆火 上万个AI聊天机器人在其中 激烈地聊天、互动、分享 社区主页右上角明确写着&#xff1a; “这是一个人工智能的社交…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 1 Data Mining

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 1 Data Mining Now, statisticians view data mining as the construction of a statistical model, that is, an underlying distribution from which the visible data is drawn. However, ma…

docker上部署程序后无法连接数据库的问题

咱就是说&#xff0c;这个问题差点给我劝退docker。下面说下环境情况。 装了个javaweb程序容器&#xff0c;装了个数据库容器&#xff0c;javaweb容器就是链接不上数据库。 咱也是跟着菜鸟教程的容器互联步骤简历网络链接&#xff1a; 并且启动时增加--networkxxx 都加入到了…

socket通信之select

多线程版本的的socket的server端 #include "socket.hpp" #include <iostream> #include <string> #include <memory>DWORD WINAPI threadProc(LPVOID lp) {SOCKET sClient *(SOCKET*)(lp);while (true) {char buff[1024] { 0 };int result rec…

数据结构初阶 —— 树(堆)

目录 一&#xff0c;堆 堆的概念 向下调整法&#xff08;数组&#xff09; 向上调整法&#xff08;数组&#xff09; 堆的创建&#xff08;建堆&#xff09; 堆的实现 一&#xff0c;堆 堆的概念 如有个关键码的集合K{&#xff0c;&#xff0c;&#xff0c;...&#xf…

Anaconda你不得不知道的若干知识点

Anaconda你不得不知道的若干知识点 1. 查看所有的环境变量2. 加载tensorflow在jupyter中会挂掉怎么办&#xff1f;3. Excel xlsx file&#xff1b; not supported两种解决办法4. (unicode error)5. 统计pandas二维表中的某列的重复值法一&#xff1a;df.loc[:,col_name].value_…

Fabric测试与基础

Fabric官网:Introduction — hyperledger-fabricdocs main documentation 1.测试网络 ./network.sh up #启动./network.sh down #关闭 2.Fabric核心模块 peer:主节点模块&#xff0c;负责存储区块链数据&#xff0c;运行维护链码 orderer:交易打包、排序模块 cryptogen:组织…

【机器学习分支】重要性采样(Importance sampling)学习笔记

重要性采样&#xff08;importance sampling&#xff09;是一种用于估计概率密度函数期望值的常用蒙特卡罗积分方法。其基本思想是利用一个已知的概率密度函数来生成样本&#xff0c;从而近似计算另一个概率密度函数的期望值。 想从复杂概率分布中采样的一个主要原因是能够使用…

uniapp 抖音授权登录、发布、分享 Ba-Aweme

简介&#xff08;下载地址&#xff09; Ba-Aweme 是一个集成抖音的uniapp插件&#xff0c;支持抖音授权登录&#xff0c;发布图片、视频&#xff0c;分享到联系人群组&#xff0c;直接拍摄等。自带选择图片和选择视频方法。 注意&#xff1a; 使用前&#xff0c;先到抖音开放…

LabVIEW CompactRIO 开发指南 3 选择CompactRIO编程模式

第二章 选择CompactRIO编程模式 第一章中介绍的CompactRIO架构为我们提供了通过LabVIEW FPGA定制FPGA硬件或使用NI CompactRIO扫描模式来实现I/O的选项。如果计算机上有LabVIEW Real-Time和LabVIEW FPGA&#xff0c;那么当向LabVIEW项目添加CompactRIO目标时&#xff0c;将提…

BM48-数据流中的中位数

题目 如何得到一个数据流中的中位数&#xff1f;如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流&…

【软考网络管理员】2023年软考网管初级常见知识考点(3)- 网络体系结构

【写在前面】也是趁着五一假期前再写几篇分享类的文章给大家&#xff0c;希望看到我文章能给软考网络管理员备考的您带来一些帮助&#xff0c;5月27号也是全国计算机软件考试统一时间&#xff0c;也就不用去各个地方找资料和代码了。紧接着我就把我整理的一些资料分享给大家哈&…

【Python】selenium工具

目录 1. 安装 2. 测试 3. 无头浏览器 4. 元素定位 5. 页面滑动 6. 按键、填写登录表单 7. 页面切换 Selenium是Web的自动化测试工具&#xff0c;为网站自动化测试而开发&#xff0c;Selenium可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&#xff0c;可以接…

【Linux - Shell常用命令】- 判断文件是否存在、去掉文件后缀

目录 一、判断文件是否存在1.1 判断目录是否存在1.2 判断文件是否存在1.3 其他文件类型判断 二、字符串截取&#xff08;去掉文件后缀&#xff09;2.1 获取文件后缀2.2 获取文件前缀 一、判断文件是否存在 1.1 判断目录是否存在 将下面代码保存为dirExist.sh &#xff0c;运行…

隐私权限是什么

导读&#xff1a; 隐私权在现代社会对于人们而言是重要的人格权&#xff0c;而随着互联网技术的发展&#xff0c;实践中侵犯隐私权的行为很常见。那么隐私权限是什么&#xff1f;侵犯隐私权的行为有哪些&#xff1f;侵犯他人隐私权要负什么法律责任&#xff1f;接下来将由找法…