【PBR系列三】BRDF方程及渲染方程

2023-10-31

本文核心知识主要参照《现代计算机图形学入门-闫令琪课程课件PPT》,后续光线追踪系列知识也源于此处。

一、BRDF方程

通过上一部分所有辐射度量学各种概念的定义之后,我们可以从这样一个角度理解光线的反射,如下图所示:

在这里插入图片描述

一个点(微分面积元)在接受到一定方向上的亮度 dE(wi) 之后,再向不同方向把能量辐射出去 dLr(wr)

从直观的理解来说,不同物体表面材质自然会把一定方向上的入射亮度( dE(wi) )反射到不同的方向的光线上( dLr(wr)),如理想光滑表面会把入射光线完全反射到镜面反射方向,其它方向则完全没有。如理想粗糙表面会把入射光线均匀的反射到所有方向。因此所谓 BRDF 就是描述这样一个从不同方向入射之后,反射光线分布情况的函数,定义如下:

在这里插入图片描述
上图中下方的式子即为BRDF,它接收两个参数,入射光方向[公式],反射光方向[公式],函数值为反射光的radiance与入射光的iiradiance的比值。(从某个方向接受到的光能有多少反射到另外一个方向)

借助BRDF,可以定义出反射方程如下:

在这里插入图片描述
即摄像机所接受到的 wr 方向上的反射光,是由所有不同方向上入射光线的irradiance贡献得到的(即图中式子的[公式]),而不同方向入射光线的irradiance对反射方向[公式]的贡献程度则由物体表面材质决定,所以乘上了一个BRDF函数。

到这里,通过辐射度量学,以及BRDF最终得到的反射方程正是一个完全正确的光线传播模型了,解决了在第一章提到的现有模型的所有缺点!(渲染方程只是在反射方程的基础之上加了一个自发光项,关于渲染方程会在下一章仔细去了解)。

在进入到渲染方程之前,再仔细观察一下反射方程:

在这里插入图片描述
不难发现正如上图中所说的,入射光线的radiance不仅仅是光源所引起的,还有可能是其他物体上着色点的反射光线的radiance,恰好反射到当前的着色点p(即间接光照),同时其他物体上的反射光线的radiance依然也是由直接光照和间接光照构成,因此这与whitted-style当中的光线追踪过程十分类似,也是一个递归的过程。所以说想要解这样一个方程还是比较难的。

接下来,我们会引入渲染方程,并对渲染方程做一些直观上的物理解释,对于反射方程或者说是渲染方程的具体求解,留在之后系列的光线追踪去实现。

二、渲染方程及其物理含义解释

在这里插入图片描述

正如在上一节中提到的,渲染方程知识在反射方程的基础之上添加了一个自发光项(Emission term),从而使得反射方程更加的general:
在这里插入图片描述
其中 Le(p,wo) 为自发光项,反射方程中的 cosQn*wi 代替。 (tips:所有光线方向均指向外)

接下来从一个点光源和单个物体的场景开始理解渲染方程:

在这里插入图片描述
(点光源对一个点来说自然只有一个方向有入射光,所以这里没有了积分)

多个点光源一个物体的情况:

在这里插入图片描述
将这些所有的点光源的贡献全部求和即可,那么如果点光源变成了面光源呢?如下图所示:

在这里插入图片描述
其实面光源就相当于无穷多个点光源的集合,只需要对 面光源所在的立体角范围进行积分,并且能够确定不同立体角方向的面光源的入射光radiance即可。

那么更进一步的,再在场景当中加入其它物体,使得物体之间发生光线交互之后是什么情况呢:

在这里插入图片描述
如上图所示,可以把其它物体同样考虑成面光源,对其所占立体角进行积分即可,只不过对其它物体的立体角积分不像是面光源所有入射方向都有radiance,物体的立体角可能只有个别几个方向有入射的radiance(即多次物体间光线反射之后恰好照射到着色点x),其它方向没有,但本质上都可以视作是面光源。

观察一下图中的渲染方程可以发现除了两个radiance,其它所有项都是知道的,可以将上式进一步写成如下图下方所示的式子:

在这里插入图片描述
其中各项与原渲染方程中一一对应,(这里其实是有数学严格推导的,不过我们只是为了接下来构建直观的物理解释,对于这些推导不必在意,默认成立即可),再接着,可以把该式子离散化写为线性代数的形式:

在这里插入图片描述
其中L其实就是想要求得的反射光,E是自发光其实就是光源的发光项,K可以理解为对光线进行反射的一种算子操作(因为它由BRDF化来的)。那么利用线性代数的知识很容易就可以推导出L的结果如下:

在这里插入图片描述

仔细观察这个式子,注意E是光源所发出的光,K为反射算子,这样一个式子的物理含义如下图所示:

在这里插入图片描述

E 为光源发出的光,KE 则代表对光源反射一次的结果,即直接光照,那么前两项之和就是光栅化当中着色所考虑的结果,对于全局光照来说,还考虑了 K2E,即一次弹射的间接照明, K3E 就是两次弹射的间接照明,依次类推,如果所有的间接光照都考虑进去也就是我们常说的全局光照。

这样来看整个结果是不是就很清晰了,就是光源发光加上直接光照与多次间接光照的结果!而这一切都是从渲染方程推导而来的,因此这也正是渲染方程的物理意义!

三、BxDF系列

BxDF一般而言是对BRDF、BTDF、BSDF、BSSRDF等几种双向分布函数的一个统一的表示。

其中,BSDF可以看做BRDF和BTDF更一般的形式,而且BSDF = BRDF + BTDF。

而BSSRDF和BRDF的不同之处在于,BSSRDF可以指定不同的光线入射位置和出射位置。

在上述这些BxDF中,BRDF最为简单,也最为常用。因为游戏和电影中的大多数物体都是不透明的,用BRDF就完全足够。而BSDF、BTDF、BSSRDF往往更多用于半透明材质和次表面散射材质。

在这里插入图片描述
图 BSDF:BRDF + BTDF

我们时常讨论的PBR中的BxDF,一般都为BRDF,对于进阶的一些材质的渲染,才会讨论BSDF等其他三种BxDF。

另外,BxDF即上文所示渲染方程以及反射方程中的 fr 项(图片中也已标出)。

总结

以上【PBR系列二】辐射度量学理论和本章渲染方程相关知识就是所有的关于PBR的一些相关基础知识了,我们从辐射度量学入手,掌握了正确衡量光线属性的方法,由此定义出了BRDF,来表示物体的材质,即它对于光线的反射能量分布,最后结合辐射度量学与BRDF得到渲染方程,一个个真正完全正确的光线传播模型,这也是后续系列光线追踪的理论基础!

下一节我们也会具体来看PBR效果的实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【PBR系列三】BRDF方程及渲染方程 的相关文章

  • Vulkan-程序结构

    程序结构 一般来说 完整的Vulkan程序包含 创建Vulkan实例 获取物理设备列表创建逻辑设备 创建命令缓冲 获取设备中支持图形工作的队列 初始化交换链 创建深度缓冲 创建渲染通道 创建帧缓冲 创建绘制对象 初始化渲染管线 创建栅栏和初
  • openGL之API学习(四)纹理操作

    纹理操作代码流程 向着色器传递纹理单元 glUniform1i gSampler 0 向GPU上传纹理数据 GLuint m textureObj glGenTextures 1 m textureObj 生成一个纹理对象 一个纹理对象有多
  • openGL之API学习(六十二)glBufferData

    往gpu缓冲区写入数据 void glBufferData GLenum target GLsizeiptr size const GLvoid data GLenum usage target Specifies the target t
  • openGL之API学习(六)如何绑定深度缓冲区到片元着色器

    本质是使用帧缓冲区glBindFramebuffer GL FRAMEBUFFER m fbo 深度缓存是帧缓冲区的一个挂载点 在OpenGL中3d管线输出的结果称为 帧缓冲对象 简称FBO FBO可以挂载颜色缓冲 在屏幕上显示 深度缓冲区
  • Vulkan同步机制和图形-计算-图形转换的风险(二)

    利用乒乓机制的交错队列减少风险 在本篇文章中 我们将提到Vulkan 图形处理过程中夹杂计算任务时遇到的各式问题 为更准确地了解我们的话题 可查看文章第一部分 第一部分概述了在Vulkan中如何使用barrier 具体来说 涉及图形 计算b
  • 普通光照模型:unityshader

    我们都知道物体表面的光照是由 自发光 镜面光 高光 环境光 漫反射得出来的 环境光 光照系数 环境光颜色 Ambient K GlobalAmbient 漫反射 Diffuse K LightColor max dot N L 0 反射光线
  • Games101,Lecture 13(光线与物体求交,引入包围盒)

    光线追踪 光线追踪更多的用于离线应用 因为一帧一般需要一万个CPU小时 原理 由摄像机发出感应光线 判断与物体相交的点是否可以与 光源连线 无遮挡物 如何判断光线与物体有交点 是管线追踪中较难的部分 光线与物体求交 1 与隐式表示的曲面求交
  • 光线追踪渲染实战(五):低差异序列与重要性采样,加速收敛!

    项目代码仓库 GitHub https github com AKGWSB EzRT gitee https gitee com AKGWSB EzRT 目录 前言 1 低差异序列介绍 2 sobol 序列及其实现 2 1 生成矩阵与递推式
  • 计算机图形学OpenGLC++实现: 橡皮筋技术实现折线和矩形的鼠标实现(附源码)

    废话不多说 直接开始 下列是会使用到的函数简单介绍 初始化背景 void Initial void 改变窗口大小 void ChangeSize int w int h 菜单响应函数 chooseWay int value 清除当前已经画的
  • 利用cygwin编译cholmod以获得在windows上可用的库lib

    原文http blog parlin me complie cholmod to get library for win64 记录要点 cygwin好好装 希望哪位神人能够提供一个好用的cygwin国内mirror 编译cholmod的时候
  • PBR渲染原理

    PBR渲染原理 Tags computer graphics 基于PBR做渲染 需要涉及到很多物理学 几何学 热辐射学概念 本文将逐一介绍每个关键概念 并给出相关重要公式 微平面 microfacets 理论 微观尺度下的任意一个平面 su
  • Vulkan再探(11):立方体贴图数组

    08 20 2020 文章目录 立方体贴图数组 创建纹理贴图 图像 拷贝区域 图像视图 着色器 片元着色器 立方体贴图数组 创建纹理贴图 提取信息 cubeMapArray width ktxTexture gt baseWidth cub
  • 全局光照算法:reflective shadow maps

    1 技术理解 RSM的全称是reflective shadow maps 受到Instant Radiosity这个离线技术的启发 其思想和ShadowMap的思想近似 在正式介绍和了解这个技术之前 我需要确定RSM用处何在 我想 RTR4
  • openGL之API学习(六十九)水平同步 垂直同步

    垂直和水平是CRT中两个基本的同步信号 水平同步信号决定了CRT画出一条横越屏幕线的时间 垂直同步信号决定了CRT从屏幕顶部画到底部 再返回原始位置的时间 而恰恰是垂直同步代表着CRT显示器的刷新率水平 垂直同步打开 那么在游戏中 或许强劲
  • 为什么我们需要多个渲染通道和子通道?

    我过去有过使用 DirectX12 的经验 但我不记得 Vulkan 中类似渲染通道的东西 所以我无法进行类比 如果我理解正确 则同一子通道内的命令缓冲区不需要同步 那么为什么要复杂化并制作多个呢 为什么我不能只使用一个命令缓冲区并将所有与
  • Vulkan 的 VkMemoryHeapFlagBits 是否缺少值?

    在 Vulkan 规范 1 0 9 第 180 页 中 我们有以下内容 typedef struct VkMemoryHeap VkDeviceSize size VkMemoryHeapFlags flags VkMemoryHeap 和
  • vkCreateDebugReportCallback EXT 未链接,但 vulkan.h 中的所有其他函数都可以完美运行

    所以我最近一直在尝试学习 Vulkan 在尝试让验证层工作时 我收到错误 LNK2019 1 gt Renderer obj error LNK2019 unresolved external symbol vkCreateDebugRep
  • 使用 VkSubpassDependency 与信号量?

    我正在关注这个 vulkan 教程 https vulkan tutorial com Drawing a triangle Drawing Rendering and presentation https vulkan tutorial
  • 什么时候关闭光栅化步骤才有意义?

    在 vulkan 中 有一个创建管道所需的结构 名为VkPipelineRasterizationStateCreateInfo 在这个结构体中有一个名为rasterizerDiscardEnable 如果该成员设置为VK TRUE那么在光
  • Vulkan 交换链格式 UNORM 与 SRGB?

    在 Vulkan 程序中 片段着色器通常向每个红 蓝 绿通道输出 0 0 到 1 0 范围内的单精度浮点颜色 然后将这些颜色写入 混合到 交换链图像中 然后呈现在屏幕上 根据交换链图像的格式 创建交换链时指定 浮点值被编码为位 当我更改交换

随机推荐

  • vector扩容

    扩容原理 vector以连续的数组存放数据 当vector空间已满时会申请新的空间并将原容器中的内容拷贝到新空间中 并销毁原容器 存储空间的重新分配会导致迭代器失效 因为分配空间后需要进行拷贝 编译器会预分配更多空间以减少发生拷贝影响程序效
  • 音视频绕不开的话题之WebRTC

    什么是WebRTC 闲来无事 我们今天探讨下音视频绕不开的一个话题 WebRTC WebRTC之于音视频行业 无异于FFMpeg 可以说WebRTC的开源 让音视频行业大跨步进入发展快车道 WebRTC是一个支持实时音视频通信的开源项目 它
  • Vue3项目开发使用技巧setup

  • 【第18例】IPD进阶:跨部门团队 —— SPDT超级产品开发团队

    目录 简介 专栏目录 详细内容 相关专栏推荐 CSDN学院 作者简介 简介 今天 IPD体系进阶100例 就更新到了第 18 例 SPDT 是英文 Super Product Development Team 的英文首字母简称
  • java网络编程:9、基于TCP的socket编程(二)服务器端循环监听接收多个客户端_多线程服务器程序

    声明 本教程不收取任何费用 欢迎转载 尊重作者劳动成果 不得用于商业用途 侵权必究 文章目录 一 核心代码编写 1 服务器端程序的编写 2 客户端程序的编写 3 测试打印输出 二 系列文章 java网络编程 上篇讲了基于tcp的编程的一些基
  • 【Python-利用动态二维码传输文件(七)】计算文件传输速度,以KB/s形式显示在Tkinter界面。

    上一篇文章实现了动态二维码文件接收端的基本功能 但只能显示接收数据的完成度 不能显示接收速度 本篇文章研究怎么计算文件传输速度 并以KB s形式显示在Tkinter界面 方便以后调试和优化代码 一 程序效果展示 可以看到右下角有统计发送速度
  • 应用 POI 解析 Excel 表格并批量上传到数据库

    在日常生活中 我们时常会遇到添加用户之类的操作 但是这类操作 只能一位一位的添加 遇到向我这种强迫症晚期患者 会被烦死 那么应用 POI 解析含有用户信息的 EXCEL 表格会省很多时间 本文针对解析 EXCEL 表格以及将表格上的内容批量
  • 机器学习——损失函数(lossfunction)

    问 非监督式机器学习算法使用样本集中的标签构建损失函数 答 错误 非监督式机器学习算法不使用样本集中的标签构建损失函数 这是因为非监督式学习算法的目的是在没有标签的情况下发现数据集中的特定结构和模式 因此它们依赖于不同于监督式学习的算法 因
  • ADC介绍

    ADC Analogue to Digital Converter 模数转换器 analog to Digital Converter 简称ADC 是一种数据转换器 它通过将模拟信号编码为二进制代码 使数字电路能够与现实世界进行接口 模数转
  • react学习笔记(完整版 7万字超详细)

    1 React基础 1 1 react 调试插件安装 浏览器右上角 gt 更多工具 gt 扩展程序 gt 开启开发者模式 gt 将调试插件包拖拽进来即可 1 2 react 基本使用 React 需要引入两个包 React ReactDOM
  • uni-app开发微信小程序,wx.onNetworkStatusChange、uni.onNetworkStatusChange网络状态监听不生效问题

    问题描述 1 该方法只能在手机上进行验证才能生效 小程序开发工具上面不生效 2 该方法只能写在onLoad方法里面 写在mounted方法不生效 错误写法 mounted uni onNetworkStatusChange function
  • JDBC(超详细)

    1 简介 JDBC Java DataBase Connectivity java数据库连接 是一种用于执行SQL语句的Java API 可以为多种 关系数据库提供统一访问 它由一组用Java语言编写的类和接口组成 JDBC提供了一种基准
  • 图解使用mock.js获取四位数验证码

    Mock js是用来模拟产生一些虚拟的数据 可以让前端在后端接口还没有开发出来时独立开发 我们可以使用真实的url mockjs可以拦截ajax请求 返回设定好的数据 一 安装 npm install mockjs D 二 全局引入mock
  • SpringBoot 启动时自动执行代码的几种方式

    一 java自身的启动时加载方式 static代码块 static静态代码块 在类加载的时候即自动执行 构造方法 在对象初始化时执行 执行顺序在static静态代码块之后 二 Spring启动时加载方式 PostConstruct注解 Po
  • C语言初步总结

    内容比较多 大家可以复制做一个文档 然后用得时候直接搜索就好了 非常方便 不用网络也可以使用 第二周的学习总结 1 对C语言的介绍与初步认识 C语言的产生与发展 FORTRAN 1957年 ALGOL 60 1960年 传统C或K R C
  • RS485在切换收发状态的时候收到0x00

    介绍一下测试背景 我使用单片机的TTL232 通过MAX485芯片转成RS485协议 但是遇到一个问题 MAX485芯片在从发送状态切换到接收状态的时候会收到一个0x00 很显然这是一个 假 数据 并不是真实接收到的数据 这个0x00着实有
  • C++中namespace detail或namespace internal的使用

    在很多开源代码中偶尔会使用名字为 detail 或 internal 的命名空间 如OpenCV的modules目录中 有些文件中使用了namespace detail 有些文件中使用了namespace internal 名为detail
  • Ceph 存储池命令 以及 数据压缩

    文章目录 一 存储池操作 1 1 常用命令 1 2 删除存储池 1 3 存储池配额 1 4 存储池可用参数 二 存储池快照 2 1 创建快照 2 2 验证快照 2 3 回滚快照 2 4 删除快照 三 数据压缩 3 1 启用压缩并指定压缩算法
  • Oracle ——删除表中重复记录

    为了方便 假设表名为Tbl 表中有三列col1 col2 col3 其中col1 col2是主键 并且 col1 col2上加了索引重复数据删除 1 通过创建临时表 把数据先导入到一个临时表中 然后删除原表的数据 再把数据导回原表 SQL语
  • 【PBR系列三】BRDF方程及渲染方程

    本文核心知识主要参照 现代计算机图形学入门 闫令琪课程课件PPT 后续光线追踪系列知识也源于此处 一 BRDF方程 通过上一部分所有辐射度量学各种概念的定义之后 我们可以从这样一个角度理解光线的反射 如下图所示 一个点 微分面积元 在接受到