【GAMES101】Lecture 17 材质

目录

材质

漫反射

镜面反射

折射-Snell’s Law

Fresnel Reflection / Term(菲涅耳项)

微表面模型

各向同性与各向异性

BRDF的性质

测量BRDF


材质

渲染方程中的BRDF描述了物体是如何与光线作用的,而物体的材质决定了它看起来是怎么样的,也就是它的材质决定了光线是如何反射的,即BRDF就表示了物体的材质这个属性

漫反射

Diffuse / Lambertian Material,即漫反射,如果是漫反射,那么物体接收到的光和物体漫反射出去的光应该是一样的,那BRDF和漫反射光就应该是一个常数,假设物体本身不发光,那么渲染方程可以写成下面的式子,并且假设物体不吸收光,那么Lo和Li应该相等,这样就可以算出BRDF,也就是漫反射系数等于1/\pi,那实际上物体是会吸收光的,所以还需要乘上一个系数ρ,这个系数ρ的范围在[0,1]之间

镜面反射

那镜面反射我们怎么确定这个反射的方向呢?

我们说三维中的一个角,叫这个空间角,实际上可以表示为和竖直方向n的一个夹角w和与水平方向的一个夹角\phi,这个w好算,因为镜面反射那入射角等于发射角,也就是wo+wi等于2倍的红色部分,而这个红色部分方向和n一样,大小是这个w在n的投影,所以是w和n做一个点乘的结果,因为方向向量都是单位向量,点乘的结果就等于余弦值,所以这个w可以算出来,而这个与水平方向的夹角\phi就是从上往下俯视看,入射方向和反射方向是相反的,所以这个\phio就等于\phii+\pi再和2\pi取余的结果

折射-Snell’s Law

对于折射的方向(\theta\phi),唉这个折射的水平夹角\phi还是和刚刚镜面反射一样在同一平面方向相反,入射和折射的\phi就差一个\pi,那这个\theta怎么算,有这么一个Snell’s Law,叫斯涅尔定律,就是说\etaisin\thetai=\etatsin\thetat,就是介质的折射率\eta\theta的正弦值的乘积是不变的

由这个等式可以算出这个折射角\thetat的余弦值,这个要求有意义的话那么根号里面的项就得非负,也就是这个乘积部分必须得小于等于1,那后面减法部分不可能大于1,只有\etai比\etat大,那这个式子才会没有意义,此时折射就不会发生了,即入射介质的折射率大于折射介质的折射率

BRDF不是双向发射分布函数吗,这个折射就叫BTDF,T是transmit,折射和反射统称散射scattering,即BSDF=BRDF+BTDF

Fresnel Reflection / Term(菲涅耳项)

菲涅耳项是用来描述光在不同折射率的介质之间的行为的,说的是有多少能量会被反射,有多少能量会被折射,当入射角很小的时候(垂直照射物体),折射很多,反射很少,当入射角很大(平行照射物体)时,反射很多,折射很小

还有就是导体和绝缘体的菲涅耳项不太一样,导体的反射很强,即使入射角很小也会有很多能量反射,这也是为什么镜子用银镜、铜镜

那怎么算呢,有比较复杂的式子计算,这个S和P是两个极化方向,所谓极化就是光线只沿着某个方向震动,那不极化的就把Rs和Rp平均一下

但是呢还有一个简化的计算,那反射强度不都是在垂直的时候最小平行的时候最大么,那我先算出一个最小的R0,这个和两边的折射率有关系,然后我用一个式子去描述这个发射强度随入射角的变大而变大这么一种关系

微表面模型

对于一个物体的表面,我从远处或者是宏观上看到的是这个物体的材质,从微观上看到的是这个物体表面的几何信息

对于物体表面的微小平面可以认为是完全镜面反射的,如果这些微小平面的法线方向比较集中的话,就是glossy材质

如果这些微小平面的法线方向比较分散的话,就是漫反射

所以这个微表面模型可以通过法线方向的集中程度来描述物体表面的粗糙程度,那这个微表面的BRDF怎么算呢,可以看到有这三项F、G和D,这个F就是菲涅耳项,D呢是描述微表面的法线的分布,还记得blinn-phone模型里面计算高光的时候用到的半程向量h,那只有这个法线方向和半程向量方向一致的时候才能反射出来,还有这个G是为了解决这个微表面相互遮挡的问题,就是当光线平行照射微表面的时候,这个入射角叫grazing angle,如果没有G修正那么边界就会很亮

各向同性与各向异性

Isotropic(各向同性)的微表面法线分别比较均匀,而Anisotropic(各向异性)的微表面法线分布具有一定的方向性

反映在BRDF上,就是入射方向和反射方向沿着水平旋转不会改变BRDF的话那就是各向同性的,否则就是各向异性的,即各向同性的BRDF只和相对的水平角有关系

BRDF的性质

非负

线性可加

可逆相同

能量守恒

各向同性的BRDF只和相对的水平角有关系

测量BRDF

BRDF描述的是入射方向和出射方向的关系,那怎么去测量它呢,对于一个特定的物体,先用一个光源去照射它,然后记录每个方向的反射,再改变光源照射的方向,继续记录每个方向的反射

这里是不是有两层循环,但是实际上每个方向是空间角,是用二维向量(\theta\phi)表示的,所以实际上是四层循环,如果是各项同性的,因为入射的\phi和出射的\phi的差值是固定的,所以可以降到三层循环,如果再考虑BRDF的可逆性,就可以减少一半测量

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm+vue的校园一卡通密钥管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的校园一卡通密钥管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系…

Python爬虫urllib详解

前言 学习爬虫,最初的操作便是模拟浏览器向服务器发出请求,那么我们需要从哪个地方做起呢?请求需要我们自己来构造吗?需要关心请求这个数据结构的实现吗?需要了解 HTTP、TCP、IP 层的网络传输通信吗?需要知…

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 目前还没有一个好的皮克斯迪士尼风格的卡通模型,所以我决定自己制作一个。这是将皮克斯风格模型与我自己的Loras合并在一起,创建一个通用的…

进程中线程使用率偏高问题排查

1. top命令查看CPU使用率高的进程 2. top -H -p 15931(进程PID) 查看进程下的线程 3. printf "%x\n" 17503(线程PID) 线程PID 10进制转16进制 0x445f 4. jstack -l 15931(JVM进程PID) 导出java进程栈信息,里面包含线程nid0x445f和所在的类&#xff0…

Redisson看门狗机制

一、背景 网上redis分布式锁的工具方法,大都满足互斥、防止死锁的特性,有些工具方法会满足可重入特性。如果只满足上述3种特性会有哪些隐患呢?redis分布式锁无法自动续期,比如,一个锁设置了1分钟超时释放,…

算法学习(一)排序

排序 1. 概念 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外…

#Z0463. 巡逻1

Description 在一个地区中有 n 个村庄,编号为 1, 2, ..., n。有 n – 1 条道路连接着这些村 庄,每条道路刚好连接两个村庄,从任何一个村庄,都可以通过这些道路到达其 他任一个村庄。每条道路的长度均为 1 个单位。 为保证该地区的…

计算机毕业设计 | springboot商城售后管理系统(附源码)

1,绪论 1.1 开发背景 在数字化时代的推动下,产品售后服务管理机构面临着信息化和网络化的挑战。传统的手工管理和纸质档案已经无法满足管理人员和读者的需求。为了提高产品售后服务管理机构的管理效率和服务质量,开发和实现一个基于Java的售…

使用Pillow来生成简单的红包封面

Pillow库(Python Imaging Library的后继)是一个强大而灵活的图像处理库,适用于Python。Pillow 库(有时也称 PIL 库) 是 Python 图像处理的基础库,它是一个免费开源的第三方库,由一群 Python 社区…

大数据环境搭建(一)-Hive

1 hive介绍 由Facebook开源的,用于解决海量结构化日志的数据统计的项目 本质上是将HQL转化为MapReduce、Tez、Spark等程序 Hive表的数据是HDFS上的目录和文件 Hive元数据 metastore,包含Hive表的数据库、表名、列、分区、表类型、表所在目录等。 根据Hive部署模…

C++进阶(十二)lambda可变参数包装器

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、新的类功能1、默认成员函数2、类成员变量初始化3、 强制生成默认函数的关键字default:4、…

CTF-show WEB入门--web19

今晚web19也就顺便解决了 老样子我们先打开题目看看题目提示: 可以看到题目提示为: 密钥什么的,就不要放在前端了 然后我们打开题目链接: 然后我们查看网页源代码: 可以发现有用的内容全在网页源代码里。 前端验证…

Map 集合

Map集合 1. 概述2. 方法3. 代码示例4. 输出结果5. 注意事项 实现类: HashTable、HashMap、TreeMap、Properties、LinkedHashMap 其他集合类 具体信息请查看 API 帮助文档 1. 概述 Map是Java中的一种数据结构,用于存储键值对(key-value pair&…

【Vue】组件间通信的7种方法(全)

目录 组件之前的通信方法 1. props/$emit 2.parent/children 3.ref 4.v-model 5.sync 6.attrs,attrs,attrs,listeners 7.provide/inject 7.eventBus 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进行修改 可以静态传递 也可…

回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现RIME-CNN-LSTM-Attention霜冰优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制&#xff0…

elementui常用组件-个人版(间断更新)

Dialog 对话框 el-dialog <el-dialogtitle"提示":visible.sync"dialogVisible"width"30%":before-close"handleClose"><span>这是一段信息</span><span slot"footer" class"dialog-footer"…

python-分享篇-屏保计时器

文章目录 代码效果 代码 import turtle, time def drawGap():turtle.penup()turtle.fd(5) def drawLine(draw):drawGap()turtle.pendown() if draw else turtle.penup()turtle.fd(40)drawGap()turtle.right(90) def drawDigit(d):drawLine(True) if d in [2,3,4,5,6,8,9] else…

COMSOL接触(高度非线性)仿真常见报错及解决方法总结

前言 由于COMSOL采用隐式求解器&#xff0c;相较于使用显式求解器的Dyna、Abaqus等软件。要在COMSOL中实现结构接触这一高度非线性问题难度较大&#xff0c;报错时有发生。究其原因&#xff0c;是当物体之间相互接触时&#xff0c;物体受到的应力、运动路径会发生突变&#xff…

查看NodeJs版本和查看NPM版本

Windows10 Dos命令下 查看NodeJs版本和查看NPM版本 NodeJs的命令是&#xff1a;node -v Npm的命令是&#xff1a;npm -v 下图&#xff1a; 记录下&#xff01;~

java hutool工具类实现将数据下载到excel

通过hutool工具类&#xff0c;对于excel的操作变得非常简单&#xff0c;上篇介绍的是excel的上传&#xff0c;对excel的操作&#xff0c;核心代码只有一行。本篇的excel的下载&#xff0c;核心数据也不超过两行&#xff0c;简洁方便&#xff0c;特别适合当下的低代码操作。 下载…