当前位置: 首页 > news >正文

【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的可逆性,就可以减少一半测量

相关文章:

【GAMES101】Lecture 17 材质

目录 材质 漫反射 镜面反射 折射-Snell’s Law Fresnel Reflection / Term(菲涅耳项) 微表面模型 各向同性与各向异性 BRDF的性质 测量BRDF 材质 渲染方程中的BRDF描述了物体是如何与光线作用的,而物体的材质决定了它看起来是怎么样…...

数模.matlab画图

一、mesh函数 上图是平常用到的方式 例题: 上图的meshgrid函数相当于上上图的前三个指令(temp,x,y) mash函数: mashc函数: mashz函数: 上图subplot函数的作用是将下标为index的图片放到对应的x&…...

[word] word表格表头怎么取消重复出现? #媒体#笔记#职场发展

word表格表头怎么取消重复出现? word表格表头怎么取消重复出现?在Word中的表格如果过长的话,会跨行显示在另一页,如果想要在其它页面上也显示表头,更直观的查看数据。难道要一个个复制表头吗?当然不是&…...

vue项目开发vscode配置

配置代码片段 步骤如下: 文件->首选项->配置用户代码片段新增全局代码片段起全局代码片段文件名“xxx.code-snippets” 这里以配置vue2初始代码片段为例,配置具体代码片段 {"name": "vue-sph","version": "…...

BUUCTF-Real-[Tomcat]CVE-2017-12615

目录 漏洞描述 一、漏洞编号:CVE-2017-12615 二、漏洞复现 get flag 漏洞描述 CVE-2017-12615:远程代码执行漏洞 影响范围:Apache Tomcat 7.0.0 - 7.0.79 (windows环境) 当 Tomcat 运行在 Windows 操作系统时,且启用了 HTTP P…...

Qt应用软件【协议篇】http协议get、post示例

文章目录 QT Http的APIHTTP GET 请求示例HTTP POST 请求示例伪装chrome浏览器get请求QT Http的API QNetworkAccessManager 作用:管理所有的网络请求,是发送请求和接收响应的中心点。主要功能: 发送HTTP请求(GET, POST, PUT, DELETE等)。处理网络请求的异步回调。管理网络…...

如何选择Centos的替代者

开篇废话:许久许久没有更新博客了。寒假回到故土,大雪虽然没有封路,还是增加了不出门的决心,虽然年岁已高,但是不学习还是不踏实,那就借着写作再继续前行。 背景:信息化部门,掌管着…...

【Java数据结构】ArrayList和LinkedList的遍历

一&#xff1a;ArrayList的遍历 import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** ArrayList的遍历*/ public class Test {public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(5);list…...

springboot163美食推荐商城的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…...

[机器学习]K-means——聚类算法

一.K-means算法概念 二.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt # 画图依赖 from sklearn.datasets import make_blobs # 从sklearn中直接生成聚类数据# 1. 数据加载 # 生成&#xff08;n_samples&#xff1a;样本点&#xff0c;centers&…...

并发编程 java锁机制

1、什么是锁&#xff0c;为什么需要锁&#xff1f; 并发环境下&#xff0c;会存在多个线程对同一个资源进行争抢的情况&#xff0c;假设线程A对资源正在进行修改&#xff0c;此时线程B又对同一资源进行了修改&#xff0c;就会导致数据不一致的问题。为了解决这个问题&#xff…...

Onerugged三防平板厂家丨三年质保承诺丨三防平板PAD

行业领先产品——Onerugged三防平板。凭借着十年的经验&#xff0c;我们深知终端设备在各个行业中的重要性&#xff0c;因此致力于为用户提供高可靠性的解决方案。 Onerugged三防平板以其卓越的性能和全方位的保护功能&#xff0c;在市场上脱颖而出。首先&#xff0c;它拥有IP…...

Android 系统启动流程

一.Android系统启动流程基本框架 Android系统完整的启动过程&#xff0c;从系统层次角度可分为 Linux 系统层、Android 系统服务层、Zygote进程模型三个阶段&#xff1b;从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤&#xff0c;下面就从具体的细节来解读 And…...

鸿蒙学习-app.json5配置文件

官网文档参考&#xff1a;https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/app-configuration-file-0000001427584584-V3 位于AppScope下的app.json5配置文件 一、基础属性 {"app": {/*包名*/"bundleName": "com.example.dem…...

华为OD机试 - 智能成绩表( Python C C++ JavaGo JS PHP)

题目描述 小明是一名新老师&#xff0c;他需要将学生按考试总分或单科分数进行排名。学生的信息包括姓名、科目和对应的分数。帮助小明完成这个任务吧&#xff01; 输入描述 第一行包含两个整数 n 和 m&#xff0c;分别代表学生人数和科目数量。 0 < n < 1000 < m &…...

训练集,验证集,测试集比例

三者的区别 训练集&#xff08;train set&#xff09; —— 用于模型拟合的数据样本。验证集&#xff08;validation set&#xff09;—— 是模型训练过程中单独留出的样本集&#xff0c;它可以用于调整模型的超参数和用于对模型的能力进行初步评估。 通常用来在模型迭代训练时…...

Altium Designer(AD)加载常用元器件库到工程图文教程及视频演示

🏡《专栏目录》 目录 视频演示1,概述2,加载方法3,总结视频演示 Altium Designer(AD)加载常用元器件库到工程 欢迎点击浏览更多高清视频演示 1,概述...

Java学习笔记2024/2/8

面向对象 //面向对象介绍 //面向: 拿、找 //对象: 能干活的东西 //面向对象编程: 拿东西过来做对应的事情 //01-如何设计对象并使用 //1.类和对象 //2.类的几个不错注意事项 1. 类和对象 1.1 类和对象的理解 客观存在的事物皆为对象 &#xff0c;所以我们也常常说万物皆对…...

【安防】三个问题:IPC和ITC主要的差异点和相同点 、影响图像成像效果的因素有哪些、摩尔纹如何产生的和消除方法

问题一、IPC和ITC主要的差异点和相同点 差异点 1、应用场景&#xff1a;IPC主要应用于普通安防监控领域&#xff0c;如广场、商场、公园、写字楼等。它们通常被用于监控室内或有限区域的安全&#xff0c;例如&#xff0c;监控办公室、仓库、门口等。而ITC则主要应用于交通领…...

Windows 安装 MySQL 最新最简教程

Windows 安装 MySQL 最新最简教程 官网地址 https://dev.mysql.com/downloads/mysql/下载 MySQL zip 文件 配置 MySQL1、解压文件 2、进入 bin 目录 搜索栏输入 cmd 回车进入命令行 C:\Users\zhong\Desktop\MySQL\mysql-8.3.0-winx64\mysql-8.3.0-winx64\bin 注意这里是你自己…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...