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…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...
