PBR材质理解整理

PBR Material

草履虫都能看懂的PBR讲解(迫真)

先前看了很多遍类似的了,结合《Unity Shader 入门精要》中的内容整理了下便于以后理解,以后有补充再添加。



光与材质相交会发生散射和吸收,散射改变光的方向,吸收改变光的能量。

在均匀介质中,光沿直线传播。传播过程中材质的折射率变化,光的传播方向也会发生变化,介质边界折射率突变,光会发生散射现象。

实际光和物体交互非常复杂,光沿直线传播也只是一种特例。介质的表面是不平滑的,由很多的微表面构成,微表面折射的光被折射到物体内部,一部分被物体吸收,一部分被重新散射到物体外部。对于金属材质,折射的光往往会被立刻吸收,对于非金属材质,折射到物体外部的光又被称为次表面散射光

请添加图片描述

渲染建模中,会考虑两个介质的边界无限大且光学平滑。在此前提下,光在不同介质边界会被划分为两个方向:散射和折射。

双向反射分布函数BRDF

一般用辐射率去量化光。辐射率L是单位面积,单位方向上的光源辐射通量。评估光线的颜色和亮度。

计算光线与物体交互后的出射辐射率,需要使用BRDF计算。

当光线随着入射方向I到达表面某点时, BRDF=f(I,V) 表示了有多少能量被反射到了观察方向V上。

观察方向上的某个点出射辐射率等于所有入射辐射率叠加运算的结果。

由此引出反射等式:

L 0 = ∫ Ω f ( I , v ) ∗ L i ( I ) ∗ ( n ⋅ I ) d ω i L_0=\int_{\Omega}f(I,v)*L_i(I)*(n \cdot I)d\omega_i L0=Ωf(I,v)Li(I)(nI)dωi

BRDF表示了入射光线在观察方向上的权重分布。(n.I)表示f(I,v)*Li在材质表面的投影结果。渲染过程中采用的是精确的光源,方向确定,大小无限小。可以简化反射等式为:

L 0 = π f ( I , v ) ∗ c l i g h t ∗ ( n ⋅ I ) L_0=\pi f(I,v)*c_{light}*(n \cdot I) L0=πf(I,v)clight(nI)

BRDF决定了着色是否基于物理,需要满足交换律和能量守恒定律。基于这些理论,BRDF可以用于描述表面反射次表面散射。其中表面反射被成为高光反射项,次表面散射被称为漫反射项

漫反射

最简单的Lambert 模型中Lambertian BRDF表示为:

f L a m b s t ( I , v ) = c d i f f u s e / π f_{Lambst}(I,v)=c_{diffuse}/\pi fLambst(I,v)=cdiffuse/π

假定漫反射在任何方向的强度相同。满足能量守恒定律的BRDF要求反射能量不能超过入射能量,BRDF在半球内积分为1,所以要除Pi。(具体要好好思考下,关于能量守恒定律这点,书上有公式能很好的解释这点,就不多复述了)。

对于给定入射光方向的出射漫反射辐射::

L d i f f = c d i f f u s e / π ∗ L i ( I ) ∗ ( n ⋅ I ) L_{diff}=c_{diffuse}/\pi *L_i(I)*(n\cdot I) Ldiff=cdiffuse/πLi(I)(nI)

一点补充:

请添加图片描述

高光反射

微面源理论提出,物体表面是由很多人眼看不到的微面元组成的。微面元可以被认为是光学平滑的。

发生反射时,不同的微表面会把光线反射到不同方向,只有一部分为微面反射的光能够进入我们的眼睛,即表面。下图介绍了可能出现的反射情况。

请添加图片描述

h为I和v的半角矢向量,m为表面法线。

法线分布函数NDF可以用于计算有多少比例的微面元满足m=h, 阴影遮掩函数G(I,v,h) 用于计算满足m=h的微面元中有多少因为遮挡不被看到,给出了活跃微面元的所占浓度,活跃的微面元才能把光线反射到观察方向上。

Blinn模型中的法线分布函数是最简单的,而Unity中standard shader使用了GGX模型。

D b l i n n ( h ) = ( n ⋅ h ) g l o s s D_{blinn}(h)=(n\cdot h)^{gloss} Dblinn(h)=(nh)gloss

D G G X ( h ) = α 2 π ( α 2 − 1 ) ( n ⋅ h ) 2 + 1 D_{GGX}(h)=\cfrac{\alpha^2}{\pi(\alpha^2-1)(n\cdot h)_2+1 } DGGX(h)=π(α21)(nh)2+1α2

其中α=roughness^2。

阴影掩盖函数使用了GGX衍生的Smith-Schlick模型。

G ( I , v , h ) = 1 ( ( n ⋅ 1 ) ( 1 − k ) + k ) ( ( n ⋅ v ) ( 1 − k ) + k ) G(I,v,h)=\cfrac{1}{((n\cdot 1)(1-k)+k)((n\cdot v)(1-k)+k) } G(I,v,h)=((n1)(1k)+k)((nv)(1k)+k)1

其中k=roughness^2/2。

菲涅尔反射函数可以计算活跃的微面元会把多少光反射到观察方向上,表示了反射光线占入射光想的比例。

F ( I , h ) = F 0 + ( 1 − F 0 ) ( 1 − 1 ⋅ h ) 5 F(I,h)=F_0+(1-F_0)(1-1\cdot h)^{5} F(I,h)=F0+(1F0)(11h)5

其中F0为高光反射系数,可以理解为高光反射颜色。常常会受到材质金属性的影响。

float3 F0 = float3(0.04, 0.04, 0.04);
F0 = lerp(F0, ALBEDO(input.UV), metallic);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面部表情识别4:C++实现表情识别(含源码,可实时检测)

面部表情识别4:C实现表情识别(含源码,可实时检测) 目录 面部表情识别4:C实现表情识别(含源码,可实时检测) 1.面部表情识别方法 2.人脸检测方法 3.面部表情识别模型(Python) (1) 面部表情识别模型的训练…

Kuebernetes资源控制管理

第四阶段 时 间:2023年8月11日 参加人:全班人员 内 容: Kuebernetes资源控制管理 目录 Kubectl命令工具 一、kubectl 命令行的语法 二、kubectl命令列表 三、使用 Kubectl 工具容器资源 (一)创建Pod &…

新疆大学841软件工程考研

1.软件生产的发展经历了三个阶段,分别是____、程序系统时代和软件工程时代时代。 2.可行性研究从以下三个方面研究每种解决方法的可行性:经济可行性、社会可行性和_____。 3.HIPO图的H图用于描述软件的层次关系&…

git强推覆盖其他项目分支

git强推分支,覆盖其他分支; 操作: 下载branch-1.3代码; $ git clone gitlabgitlab.zte.net:zte-dba-service/branch.git $ git remote add origin2 gitlabgitlab.zte.net:zte-service/branch.git $ git push origin2 master -f注…

同一局域网共享一个打印机方法

文章目录 需求描述设备连接情况配置网络凭证 需求描述 pc2想直接打印,而不是每次存到u盘,再拿到pc1,打印,实现本机打印 设备连接情况 配置 (1)pc1设置 ①共享打印机操作 控制面板——>设备和打印机—…

使用gitee创建远程maven仓库

1. 创建一个项目作为远程仓库 2. 打包项目发布到远程仓库 id随意&#xff0c;url是打包到哪个文件夹里面 在需要打包的项目的pom中添加 <distributionManagement><repository><id>handsomehuang-maven</id><url>file:D:/workspace/java/2023/re…

全面讲解|DCMM数据管理能力成熟度及各地政策汇总

信息技术与经济社会的交汇融合引发了数据爆发式增长。数据蕴含着重要的价值&#xff0c;已成为国家基础性战略资源&#xff0c;正日益对全球生产、流通、分配、消费活动以及经济运行机制、社会生活方式和国家治理能力产生重要影响。数据价值发挥的前提是管理好数据&#xff0c;…

【Axure教程】账单列表和详情

账单列表和详情页在支付系统中不仅是用户了解财务状况和跟踪交易的关键工具&#xff0c;还有助于提高支付安全性、解决问题以及满足法律和财务要求。因此&#xff0c;设计一个清晰、易用且功能丰富的账单管理系统对于支付系统的成功运营和用户满意度至关重要。 今天作者就教大…

flutter开发实战-实现marquee根据文本长度显示文本跑马灯效果

flutter开发实战-实现marquee文本跑马灯效果 最近开发过程中需要marquee文本跑马灯效果&#xff0c;这里使用到了flutter的插件marquee 效果图如下 一、marquee 1.1 引入marquee 在pubspec.yaml中引入marquee # 跑马灯效果marquee: ^2.2.31.2 marquee使用 marquee使用也是…

Apipost接口测试断言

常用断言直接点右边栏 断言list&#xff1a; // 断言json数组长度 apt.assert(response.json.data.data.length20); // 断言json数组中的某个对象 apt.assert(response.json.data.data[0].docid1482);

在word的文本框内使用Endnote引用文献,如何保证引文编号按照上下文排序

问题 如下图所示&#xff0c;我在word中插入了一个文本框&#xff08;为了插图&#xff09;&#xff0c;然后文本框内有引用&#xff0c;结果endnote自动将文本框内的引用优先排序&#xff0c;变成文献[1]了&#xff0c;而事实上应该是[31]。请问如何能让文本框内的排序也自动…

10 年 2023 大目标检测模型总结

对象检测示例 “物体检测是计算机视觉中最令人兴奋和最具挑战性的问题之一&#xff0c;深度学习已成为解决这一问题的有力工具。 — 陈良杰博士 OBJECT检测是计算机视觉中的一项基本任务&#xff0c;涉及识别和定位图像中的对象。深度学习彻底改变了对象检测&#xff0c;可以更…

百度chatgpt内测版

搜索AI伙伴 申请到了百度的chatgpt&#xff1a; 完整的窗口布局&#xff1a; 三个哲学问题&#xff1a; 灵感中心&#xff1a; 请做一副画&#xff0c;一个渔夫&#xff0c;冬天&#xff0c;下着大雪&#xff0c;在船上为了一家的生计在钓鱼&#xff0c;远处的山上也都是白雪&a…

淘宝商品详情接口(商品列表,APP详情接口)返回示例说明,PC端和APP端

淘宝商品详情包括以下信息&#xff1a; 1. 商品标题&#xff1a;商品的名称或标题&#xff0c;用于描述商品的特点和功能。 2. 商品价格&#xff1a;商品的销售价格&#xff0c;包括原价和促销价等。 3. 商品图片&#xff1a;展示商品的照片或图像&#xff0c;以便顾客可以更…

重启服务器引发的Docker异常

公司使用云服务器需要硬盘扩容&#xff0c;服务器重启才生效。 重启以后发现拉取远程镜像的命令登录失败了&#xff01; 然后发现找不到容器和镜像列表了&#xff0c;但是容器都启动了。 查看docker运行状态都是正常的 systemctl is-active docker systemctl status docker.…

uni、css——制作表格样式的模型

案例展示 这里以5列做展示&#xff08;可随意调节&#xff09; 案例代码 <view class"list"><view class"item" v-for"(item,index) in list" :key"index">1</view> <!-- 有内容 --><view clas…

openlayers有哪些版本以及区别

vue3openlayer7 openlayer版本介绍 openlayer版本介绍 一、多个项目版本对比 官网首页罗列的几个版本&#xff1a; 包括&#xff1a;v7\v6\v5\v4\v3\v2 两年前使用v6.5.0 2023年7月版本是v7.4.0

最小生成树——prim算法

prim算法详解 prim算法简介prim算法步骤prim复杂度prim样例题目公路修建题目描述输入格式输出格式样例样例输入样例输出 提示 prim样例代码 prim算法简介 P r i m Prim Prim算法是一种用于解决最小生成树问题的贪心算法。最小生成树是一个连通图的生成树&#xff0c;它的所有边…

springboot vue 初步集成onlyoffice

文章目录 前言一、vue ts1. 安装依赖2. onlyoffice组件实现3. 使用组件4. 我的配置文件 二、springboot 回调代码1. 本地存储 三、效果展示踩坑总结问题1问题2 前言 对接onlyoffice&#xff0c;实现文档的预览和在线编辑功能。 一、vue ts 1. 安装依赖 npm install --sav…

【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承

【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承 依赖范围 依赖传递 依赖排除 依赖原则 依赖继承 依赖范围 在Maven中&#xff0c;依赖范围&#xff08;Dependency Scope&#xff09;用于控制依赖项在编译、测试和运行时的可见性和可用性。通过指定适当的依赖…