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)∗(n⋅I)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∗(n⋅I)
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)∗(n⋅I)
一点补充:

高光反射
微面源理论提出,物体表面是由很多人眼看不到的微面元组成的。微面元可以被认为是光学平滑的。
发生反射时,不同的微表面会把光线反射到不同方向,只有一部分为微面反射的光能够进入我们的眼睛,即表面。下图介绍了可能出现的反射情况。

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)=(n⋅h)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)=π(α2−1)(n⋅h)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)=((n⋅1)(1−k)+k)((n⋅v)(1−k)+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+(1−F0)(1−1⋅h)5
其中F0为高光反射系数,可以理解为高光反射颜色。常常会受到材质金属性的影响。
float3 F0 = float3(0.04, 0.04, 0.04);
F0 = lerp(F0, ALBEDO(input.UV), metallic);
相关文章:
PBR材质理解整理
PBR Material 草履虫都能看懂的PBR讲解(迫真) 先前看了很多遍类似的了,结合《Unity Shader 入门精要》中的内容整理了下便于以后理解,以后有补充再添加。 光与材质相交会发生散射和吸收,散射改变光的方向,…...
从c++的角度来看ffmpeg 的架构
------------------------------------------------------------------------- author: hjjdebug date: 2023年 08月 01日 星期二 11:26:40 CST descriptor: 从c的角度来看ffmpeg 的架构 ------------------------------------------------------------------------…...
Ubuntu安装JDK与IntelliJ IDEA
目录 前言 Ubuntu 安装 JDK 1、更新软件包列表 2、安装OpenJDK 3、验证安装 Ubuntu安装IntelliJ IDEA 1、下载 IntelliJ IDEA 2、解压缩 IntelliJ IDEA 安装包 3、移动 IntelliJ IDEA 到安装目录 4、启动 IntelliJ IDEA 前言 APT(Advanced Package Tool&…...
【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块2
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…...
一个完整的http请求响应过程
一、 HTTP请求和响应步骤 以上完整表示了HTTP请求和响应的7个步骤,下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。 二、TCP/IP协议 TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系…...
Unity通过代码切换材质
效果展示 代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class MaterialSwitcher : MonoBehaviour {public Material newMaterial; // 新材质private Material oldMaterial; // 旧材质private Renderer renderer; // 渲染器组件…...
Java根据坐标经纬度计算两点距离(5种方法)、校验经纬度是否在圆/多边形区域内的算法推荐
目录 前言 一、根据坐标经纬度计算两点距离(5种方法) 1.方法一 2.方法二 3.方法三 4.方法四 5.方法五 5.1 POM引入第三方依赖 5.2 代码 6.测试结果对比 二、校验经纬度是否在制定区域内 1.判断一个坐标是否在圆形区域内 2.判断一个坐标是否…...
PIC单片机如何设计延时
PIC单片机如何设计延时 PIC单片机的延时基本有两种,一种是自己设计的delay()函数,另一种就是利用其自带的Time定时器。当然一般Time定时器的精度要高于自己设计delay()函数,Time定时器是单片机内部的硬件寄存器模块,而delay()函数是利用自加自减来实现延时,代码进行顺序执…...
FFmpeg常见命令行(二):FFmpeg转封装
前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个, 对应的要学习的内容是:如何使…...
全面升级:华为鸿蒙HarmonyOS4正式发布,玩趣个性化,小艺AI升级
8月4日新闻,今天下午,华为正式发布了最新版本的鸿蒙操作系统——HarmonyOS 4! 在华为发布会上,鸿蒙HarmonyOS迎来了一系列令人激动的功能升级。其中包括个性化空间、多种生产力工具以及增强的手机AI助手"小艺"。这次更…...
【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息
文章目录 前言导入依赖库设置ChromeDriver的路径创建Chrome WebDriver对象打开网页找到结果元素创建一个空列表用于存储数据遍历结果元素并提取数据提取标题、作者、发布时间等信息判断是否为目标文章提取目标文章的描述、阅读数量、点赞数量、评论数量等信息将提取的数据存储为…...
使用Feign 的远程调用,把mysql数据导入es
要把数据库数据导入到elasticsearch中,包括下面几步: 1)将商品微服务中的分页查询商品接口定义为一个FeignClient,放到feign-api模块中 2)搜索服务编写一个测试业务,实现下面功能: 调用item-ser…...
Java课题笔记~ MyBatis接口开发(代理开发)
使用XML文件进行开发,在调用SqlSession进行操作时,需要指定MyBatis映射文件中的方法,这种调用方式过于烦琐。为解决此问题,MyBatis提供了接口开发的方式。 接口开发的目的: 解决原生方式中的硬编码 简化后期执行SQL …...
从数学到深度学习的学习资料及教程合集
诸神缄默不语-个人CSDN博文目录 目前仅收集免费内容,最多需要买本纸质书。 付费的如果有免费版本我也会收录。 链接如失效请联系我。 这个笔记主要是为我自己准备的,算是一个可公开的to do list(其实做不完的我也知道)ÿ…...
nn.CrossEntropyLoss()报错
RuntimeError: “nll_loss_forward_reduce_cuda_kernel_2d_index” not implemented for ‘Float’ Traceback (most recent call last): File "<string>", line 1, in <module> File "/home/zz/anaconda3/envs/torch1.11/lib/python3.7/site-pack…...
【BASH】回顾与知识点梳理(一)
【BASH】回顾与知识点梳理 一 前言一. 认识与学习 BASH1.1 硬件、核心与 Shell1.2 为何要学文字接口的 shell?1.3 系统的合法 shell 与 /etc/shells 功能1.4 Bash shell 的功能1.5 查询指令是否为 Bash shell 的内建命令: type1.6 指令的下达与快速编辑按…...
AWS Amplify 部署node版本18报错修复
Amplify env:Amazon Linux:2 Build Error : Specified Node 18 but GLIBC_2.27 or GLIBC_2.28 not found on build 一、原因 报错原因是因为默认情况下,AWS Amplify 使用 Amazon Linux:2 作为其构建镜像,并自带 GLIBC 2.26。不过,…...
K8S添加yum源并安装kubectl/kubeadm/kubelet组件
1.安装kubectl/kubeadm/kubelet ##添加yum 源 cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck0 repo_gpgcheck0 gpgkeyhttps://mirr…...
kafka生产者指定ip
kafka生产者指定ip 最近工作中遇到一个问题,记录一下,需求中要求往kafka上推送信息。本来是个很简单的需求,但是踩了一个坑。 我通过spring boot集成了kafka写了一个生产者,客户那边给我三个节点的ip,然后我也没多想…...
python 封装sql 增删改查连接MySQL
select * from Teacher limit 10 连接字符串配置MysqlConfig.py class MysqlConfig:HOST 192.168.56.210PORT 3306USER rootPASSWORD 1qaz0987654321DBStudentDBCHARSET utf8封装增删改查MysqlConnection.py Author: tkhywang 2810248865qq.com Date: 2023-06-19 15:44:48 Las…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
