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

不同的物体表面有着不同的材质,而不同的材质意味着它们与光线的作用不同。那么我们之前在介绍辐射度量学和渲染方程提到过其中一个函数,叫做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官网 跳转到界面: 录入并搜索 下载之前,看一下自…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
