[计算机图形学]材质与外观(前瞻预习/复习回顾)
一、图形学中的材质
不同的物体表面有着不同的材质,而不同的材质意味着它们与光线的作用不同。那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数,叫做BRDF,而在实际上,也就是BRDF定义了不同的材质。BRDF决定了光如何被反射。
1.漫反射材质
之前我们在布林冯着色模型中根据经验定义的漫反射系数,在我们学习了辐射度量学和BRDF之后可以将它精确的定义出来。我们以上图为例,定义一个漫反射材质,它不吸收光,也就是说来了多少光就要反射出去多少,我们人为做一个场景,假设四面八方来的Radiance是均匀的,而因为它是漫反射材质,反射出去的Radiance也应该是均匀的,同时因为能量守恒进出的能量是一样的,那么入射的Radiance和反射出去的Radiance也应该相等。由此我们可以把渲染方程化简得到此时的BRDF=1/π,而这就是完全不吸收能量的BRDF。我们再定义一个反射率(albedo),这个反射率ρ可以是一个数或R,G,B三个通道或者是光谱,但是ρ∈[0,1],这样我们就可以定义不同颜色的BRDF,这样我们就知道一个漫反射的BRDF应该是在0到1/π之间。
2.Glossy材质
Glossy材质我们之前提到过,它并不是完美的镜面反射,例如打磨的金属。它们的反射接近镜面但又不是绝对的镜面,如上图右上角的反射示意图。
3.理想反射/折射材质
这种材质不仅在表面会发生反射还会发射折射,如玻璃,水面等。右边这幅图有颜色,说明光折射进入球壳之后被部分吸收了。
二、反射和折射
1.反射
关于反射,我们知道反射角等于入射角,这也是反射定律。而关于反射定律我们有两种理解方式。
第一中如上图左,给定入射方向和反射方向还有法线方向我们可以知道它们的关系,入射方向向量+反射方向向量根据平行四边形法则应该是法线方向,且长度为平行四边形的对角线,这里也就是菱形,那也就是对反射方向/入射方向向量做一个法线上的投影再乘以2就是最终的结果,最终把除了反射方向的项都移到右边,就得到了公式ωo = -ωi + 2(ωi·n)n,这样给定任意入射方向ωi和法线方向n我们就可以求出它的反射方向。
另一种理解方式如上图右,我们在左图垂直上方观测会得到右面这张图,我们之前讲到立体角,讲到过球坐标,那么这里的Φo,Φi就相当于球坐标中的水平方位角决定水平反向,而入射角和反射角则决定了竖直方向的角度。在水平方位角上,我们可以很容易的发现Φo=(Φi+π)mod2,也就是反射方向的水平方位角始终等于入射方向的水平方位角+π再对2π取模即可。(关于取余和取模运算不了解的朋友可以自行搜索了解,这里不做赘述)
2.折射
折射定律:不同的材质有不同的折射率,如上图的ηi和ηt,入射角和反射角的正弦,上图的sinθi和sinθt,那么则有ηi·sinθi=ηt·sinθt。与此同时我们仍然像可以反射一样得到方位角φ之间的关系。
而根据折射定律,我们很容易得到折射角的余弦,它一定是一个实数,也就是上面根号内的值一定要≥0,而不能<0,如果<0,那么说明ηi/ηt>1,也就是光从光密介质射向光疏介质,并且入射角大于等于临界角时全反射现象才会发生。
而全反射会导致一种现象,如上图,人在水底向上看的视野只有一小片区域。这提示了我们之前在接受Path Tracing的时候没有提到,而实际上在做Path Tracing的时候是要把这么个问题考虑进去的。我么们之前说过BRDF可以来描述反射,那么折射用什么来描述呢?这里叫做BTDF,而BRDF和BTDF可以统称为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)
相关文章:
[计算机图形学]材质与外观(前瞻预习/复习回顾)
一、图形学中的材质 不同的物体表面有着不同的材质,而不同的材质意味着它们与光线的作用不同。那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数,叫做BRDF,而在实际上,也就是BRDF定义了不同的材质。BRDF决定了光如何被反…...
Java 的简要介绍及开发环境的搭建(超级详细)
图片来源于互联网 目录 | CONTENT Java 简介 一、什么是 Java 二、认识 Java 版本 三、选择哪个版本比较好 搭建 Java 开发环境 一、下载 Java 软件开发工具包 JDK 二、配置环境变量 自动配置 手动配置 三、下载合适的 IDE IntelliJ IDEA Visual Studio Code Eclip…...
每天一道算法练习题--Day15 第一章 --算法专题 --- -----------二叉树的遍历
概述 二叉树作为一个基础的数据结构,遍历算法作为一个基础的算法,两者结合当然是经典的组合了。很多题目都会有 ta 的身影,有直接问二叉树的遍历的,有间接问的。比如要你找到树中满足条件的节点,就是间接考察树的遍历…...
golang - 函数的使用
核心化编程 为什么需要函数? 代码冗余问题不利于代码维护函数可以解决这个问题 函数 函数:为完成某一功能的程序指令(语句)的集合,称为函数 在 Go 中,函数分为:自定义函数(自己写…...
真题详解(极限编程)-软件设计(六十一)
真题详解(二分查找平均值)-软件设计(六十)https://blog.csdn.net/ke1ying/article/details/130417464 VLANtag属于 数据链路层实现。 数据链路层:网桥交换机。 网络层:路由器。 物理层:中继器。 Telent…...
计算机网络笔记:TCP粘包
默认情况下, TCP 连接会启⽤延迟传送算法 (Nagle 算法), 在数据发送之前缓存他们. 如果短时间有多个数据发送, 会缓冲到⼀起作⼀次发送 , 这样可以减少 IO 消耗提⾼性能。 如果是传输⽂件的话, 那么根本不⽤处理粘包的问题, 来⼀个包拼⼀个包就好了。但是如果是多条消息, 或者…...
Vue(标签属性:ref、配置项:props、混入mixin、插件、样式属性:scroped)
一、ref(打标识) 前面提及到了标签属性:keys 这里将了解ref:打标识 正常布置脚手架并创建入口文件main.js,引入组件 1. 可以给元素注册引用信息(获取真实DOM) 给一个按钮获取上方的dom的方法,方…...
数仓建设规划核心问题!
小A进入一家网约车出现服务公司,负责公司数仓建设,试用期主要一项 OKR是制定数据仓库建设规划;因此小 A 本着从问题出发为原点,先对公司数仓现状进行一轮深入了解,理清存在问题,然后在以不忘初心原则提出解…...
容器镜像的导入导出
容器镜像的导入导出 第1关:导入导出容器 任务描述 本关任务是学习导入导出容器,要求学习者参照示例完成将busyboxContainer容器的文件系统保存为一个tar包,通过该tar包导入一个busybox:v1.0镜像。 相关知识 将 "容器的文件系统&…...
Java每日一练(20230502)
目录 1. 二叉搜索树的最近公共祖先 🌟🌟 2. 随机分组问题 🌟 3. K 个一组翻转链表 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练…...
JVM学习(九):堆
一、堆(Heap)的概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。同时,堆内存的大小是可以调节的。《Java虚拟…...
golang - switch
switch 的使用 switch 语句用于基于不同条件执行不同操作,,直每一个 case 分支都是唯一的,从上到下逐一测试到匹配为止匹配项后面也不需要再加 break switch 表达式 {case 表达式1, 表达式2, ... :语句块1case 表达式2, 表达式3, ... :语句块…...
浙大数据结构与算法一些有意思的理论基础题
堆栈 有人给出了堆栈用数组实现的另一种方式,即直接在函数参数中传递数组和top变量(而不是两者组成的结构指针),其中Push操作函数设计如下。这个Push函数正确吗?为什么? #define MaxSize 100 ElementTyp…...
【热门框架】Mybatis-Plus怎样进行映射匹配兼容?Mybatis-Plus的ID有哪些生成策略
Mybatis-Plus提供了两种映射匹配兼容的方式:驼峰转下划线和全局配置。 驼峰转下划线 默认情况下,Mybatis-Plus会将Java类中的驼峰命名方式自动映射到数据库表中的下划线命名方式。例如,Java类中的userName属性会自动映射到表中的user_name字…...
Http1.0 、1.1、2.0、3.0的区别
巨人的肩膀 3.1 HTTP 常见面试题 | 小林coding HTTP1.0与HTTP1.1 HTTP1.1在HTTP1.0上的改进: 使用长连接的方式改善了HTTP1.0中短连接造成的性能开销支持管道网络传输,不必等到上一个的响应,就可以接着发送第二个请求,减少整体响…...
Python——基于YOLOV8的车牌识别(源码+教程)
目录 一、前言 二 、完成效果 三、 项目包 四、运行项目 (教程) 一、前言 YOLOv8LPRNet车牌定位与识别https://www.bilibili.com/video/BV1vk4y1E7MZ/ 最近做了有一个车牌识别的小需求,今天完成了,在此记录和分享 首先&#x…...
c# 数据保存为PDF(一) (spire pdf篇)
文章目录 前言了解 Spire使用Spire.PDF1 创建简单的PDF文档2 创建带有格式的PDF文档(使用Draw)头部信息页眉页脚测试数据完整的代码 3 创建带有格式的PDF文档(使用Gird)小结 先上一个效果图 前言 项目中需要将一些数据转存为PDF …...
Stable Diffusion使用方法
SD的本地安装教程有很多我就不重复了,这里主要是记录我在使用SD Webui的过程中遇到的问题,总结的一些提升出图效率,出好图概率的经验。 先搞几张看看效果 二次元妹妹 高达 ? Ok,以上只是一小部分成品 ,属…...
高性能:负载均衡
目录 什么是负载均衡 负载均衡分类 服务端负载均衡 服务端负载均衡——软硬件分类 服务端负载均衡——OSI模型分类 客户端负载均衡 负载均衡常见算法 七层负载均衡做法 DNS解析 反向代理 什么是负载均衡 将用户请求分摊(分流) 到不同的服务器上…...
Matplotlib 安装介绍
文章目录 安装步骤 Matplotlib 不止是一个数学绘图库,它也是可视化和分析工具中最流行之一。我们可用其制作简单的图表,如折线图和散点图。 安装步骤 先进入:python官网 跳转到界面: 录入并搜索 下载之前,看一下自…...
DNS:关于 DNS 基本概念的一些笔记整理
写在前面 分享一些 DNS 的笔记整理博文内容涉及: DNS 历史介绍DNS 解析顺序DNS 基本概念资源类型介绍DNS 安全 理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺…...
机器人学一些知识
机器人动力学模型是用数学方法描述机器人运动和力学特性的模型。它包含机器人的几何结构、质量、惯性、摩擦等物理特性,以及机器人的控制系统和传感器等。机器人动力学模型可以用于机器人的运动规划、控制算法设计、仿真和优化等应用中。 机器人动力学模型通常采用…...
应用,auto,内联函数
6.引用: //指针 int main() {int a 0;int& b a;int& c b;int& d c;cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;b;d;cout << a <<…...
Flask框架的学习---01
1.工程搭建: (1) 安装flask: pip3 install flask (2)命令行: (1)终端运行:flask run (2)绑定IP地址和端口:Flask run -h 127.0.0.1 -p 8083 修改端口号 (3࿰…...
免费gpt-4-国内使用gpt-4
如何用上gpt-4 GPT-4尚未正式发布和公开,因此我们无法提供对GPT-4的具体使用方法。但是,可以从GPT-4的前一代——GPT-3的使用经验和GPT-4的预期功能来看,建议如下: 了解GPT-4的语言处理能力和适用场景:GPT-4预计将进一…...
《程序员面试金典(第6版)面试题 16.09. 运算
题目描述 请实现整数数字的乘法、减法和除法运算,运算结果均为整数数字,程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算。 你的实现应该支持如下操作: Operations() 构造函数minus…...
asp.net基于web的校园美食派送配送系统
1.系统登录:系统登录是用户访问系统的路口,设计了系统登录界面,包括用户名、密码和验证码,然后对登录进来的用户判断身份信息,判断是管理员用户还是普通用户。 2.系统用户管理:不管是…...
【JAVA】#详细介绍!!! 文件操作之File对象(1)!
本文内容不涉及文件内容操作,主要是对指定文件元信息的获取,以及通过java代码如何创建一个文件或者删除文件 目录 文件操作的File对象 File对象的基本操作方法 得到文件(夹)对象的信息元 1.getParent 2. getName 3.getPath 4…...
Vue基本的内置指令
前言 除了常见的v-bind,v-for,v-if,v-on.v-model等,本次学习一些vue提供的其他内置指令 1 v-text 给标签插入文本,类似于插值语法 它会把全部的字符串当成文本去解析,不会当成标签的,哪怕写的是标签结构 效果和插值语法是一样的 插值语法比v-text更加…...
华为孟晚舟当值首秀:2030年AI算力将增长500倍!
作者 | 范智林 来源 | 华商观察 微信号:HuashangGC 孟晚舟当值首次亮相。 4月19日,华为副董事长、轮值董事长、CFO孟晚舟在华为第20届全球分析师大会上进行演讲,这是她当值华为轮值董事长以来的首次公开亮相。 按照华为内部规定,…...
amazon免费虚拟机做网站/今日热点新闻头条排行榜
简单记录: 公司项目中,新开一个模块,本地编写模拟接口,数据请求,使用模块axios进行ajax请求,直接请求,肯定显示跨域,无法请求。 接口是这样的 报错类似这样: 解决方案 …...
网站设计制作需要多少钱/企业查询平台
文章目录:HashMap的底层原理面试必考题。一:HashMap的节点:二:HashMap的数据结构:三:HashMap存储元素的过程:哈希码的特点是:四:HashMap中的两个重要的参数:HashMap的底层原理面试必…...
望野诗/上海优化网站方法
参考文章https://access.redhat.com/articles/524353 在一个xshell中执行dd命令: time dd if/dev/zero oftest bs100M count256 convfdatasync 在另一个xshell中执行"iotop -tbo -d 1"以获得占用IO比较高的进程信息 [rootabc ~]# iotop -tbo -d 1…...
长春启做网站多少/2020新闻大事件摘抄
C:\Documents and Settings\Administrator>db2startINST : 服务已返回特定的服务错误码。SQL1220N 不能分配数据库管理器共享内存集。C:\Documents and Settings\Administrator>db2samplStarting the DB2 instance...Creating database "SAMPLE"...Attempt to…...
网络运营推广平台/邵阳seo排名
webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便。1、适用系统:Linux2、编译安装:wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gztar…...
专业的网站制作团队/充电宝seo关键词优化
从应用程序的角度来看,线程安全问题的产生是由于多线程应用程序缺乏某种保障——线程同步机制。从广义上来说,Java平台提供的线程同步机制包括锁、volatile关键字、final关键字、static关键字以及一些相关的API,如Object.wait()/Object.nofit…...