计算机图形学入门22:双向反射分布函数(BRDF)

1.定义

        所谓BRDF(Bidirectional Reflectance Distribution Function,双向反射分布函数),指的是从辐射度量学的角度去理解光线的反射,如下图所示。

       所谓反射就是一个点从ωi方向发出的Radiance转化为dA接收到的功率E,然后功率E将转换为其他任何方向ωr发出的Radiance。 也就是一个点(微分面积元)在接受到一定方向上的亮度dE(ωi)之后,再向不同方向把能量辐射出去dLr(ωr)

        因此所谓BRDF就是描述这样一个光线从不同方向入射之后,反射光线的分布情况的函数。数学定义如下。

        上图中下方的式子即为BRDF,它接收两个参数,入射光方向ωi,反射光方向ωr,函数值为反射光的radiance与入射光的iiradiance的比值(从某个方向接受到的光能有多少反射到另外一个方向)。

        从直观的理解来说,不同材质的表面自然会把一定方向上的入射光线反射到不同方向上,如理想光滑表面会把入射光线完全反射到镜面反射方向,其它方向则完全没有。而理想粗糙表面会把入射光线均匀的反射到所有方向。

2.性质

        1.BRDF是非负的(Non-negativity),表示了能量的分布。

        2.BRDF是线性的(Linearity),可以拆分和叠加。

        3.BRDF是可逆的(Reciprocity principle),调换入射方向和出射方向依然成立。

        4.BRDF满足能量守恒(Energy conservation),入射能量等于反射能量(存在能量吸收的情况时,入射能量大于反射能量)。

3.反射方程

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

        因为BRDF表示从某一个方向考虑入射,然后往某一个方向反射出去会是什么样的结果。假如以某一个反射方向ωr出去的点,从相机方向看到的这个着色点可以接收来至四面八方的不同的光照。那就考虑对于每一个入射方向ωi,都会对应入射方向着色点和出射方向这样的BRDF。BRDF会告诉我们从某一个方向进来的光反射到出射方向有多强,那就将每个方向的入射光线的强度(Radiance)乘以BRDF,再乘以cos\theta(之前的定义),然后把每一个方向上对出射光线的贡献相加,这样就得到了这个点在所有可能得入射光下反射到ωr上的情况

        如上可知,所谓的反射方程定义了任何一个着色点在各个不同的光照环境下,考虑任何一个光照入射方向对观察方向(出射方向)的一个贡献,将所有入射方向的贡献相加,相加就是求一个积分,得到最终的着色效果。

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

        假如从某个方向观察某个着色点,要考虑所有能够到达这个着色点的所有光线,但是能够达到的可不止是光源发出的光线,还有可能有其他物体上着色点反射的光线,即间接光照。也就是说考虑的入射radiance不止来至光源,也可能来至其他物体反射出去的radiance,这是一个递归的过程。即任何出射的radiance都可能是其他入射的radiance,这就是为什么光线在场景中不止弹射一次的原因,这是一个很难计算的问题。

4.渲染方程

4.1 定义

        渲染方程只是在反射方程的基础之上添加了一个自发光项(Emission term),用来模拟物体自发光(物体有自发光和反射光),从而使得反射方程更加的通用,适用于所有物体表面上的光线传播问题。如下公式。

        其中Le(p,ω0)为自发光项,反射方程中的 cosθ 用 n·ωi 代替 (一样)。注意:所有光线方向均以从平面向外为正方向。

4.2 理解渲染方程

        1.一个点光源和单个物体的场景

        点光源对一个点来说自然只有一个方向有入射光,所以这里没有了积分(相加)。

        2.多个点光源一个物体的场景

        将所有的点光源的贡献全部求和即可。

        3.那么如果有一个是面光源呢?

        其实面光源就相当于无穷多个点光源的集合,由于多个点光源贡献可以相加,那么对面光源任意一点的贡献积分(相加)道理是一样,所以对这个面占据的立体角范围进行积分,然后考虑所有的方向Radiance经过BRDF反射出去的样子。

        4.在场景当中加入其它物体,使得物体之间发生光线交互之后是什么情况呢?

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

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

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

        经过两步我们不是很清楚但其实是正确的数学推导之后,得到了这样一个递归式。

        其中L其实就是想要求得的反射光,E是自发光其实就是光源的发光项,K可以理解为对光线进行反射的一种算子操作(因为它由BRDF转化来的)。

        那么利用线性代数的知识很容易就可以推导出L的结果如下。

        其中 为单位矩阵,再接着使用广义二项式定理得到。

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

        E为光源发出的光,KE则代表对光源反射一次的结果,即直接光照,那么前两项之和就是光栅化当中着色所考虑的结果。对于全局光照(所有光线弹射次数加起来)来说,还考虑了第三项K^{2}E,即一次弹射的间接照明,K^{3}E就是两次弹射的间接照明,依次类推。

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

        不同弹射次数下同一场景的渲染效果如下。

        显然弹射次数越多越接近真实图片效果,但提升幅度逐渐递减。

        注意:图片顶部中间有块玻璃,当进行第4次弹射时才从黑色变亮。这是因为光从相机出来到玻璃球里至少弹射2次才能出来,如果玻璃是双层的2次弹射只能进去,再经过2次弹射才能出来。

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

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

相关文章

在jeesite框架中增加一个收藏夹功能-- V1.0版本

Jeesite简介:JeeSite 快速开发平台,不仅仅是一个后台开发框架,它是一个企业级快速开发解决方案,提供在线数据源管理、数据表建模、代码生成等功能。 正文:Jeesite是一个方便实用,适合敏捷开发,提…

openmetadata1.3.1 自定义连接器 开发教程

openmetadata自定义连接器开发教程 一、开发通用自定义连接器教程 官网教程链接: 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector (一&…

Webpack: 其他性能优化

概述 前面章节我们已经详细探讨 Webpack 中如何使用分包、代码压缩提升应用执行性能。除此之外,还有不少普适、细碎的方法,能够有效降低应用体积,提升网络分发性能,包括: 使用动态加载,减少首屏资源加载量&…

Adobe Photoshop 2024 v25.5.1 中文激活版下载以及安装方法教程

软件介绍 Adobe Photoshop 2024 v25.5.1 是Adobe公司的最新版图像处理软件,它提供了强大的图像编辑工具和智能自动化功能,包括图像修复、色彩校正和滤镜效果,以满足专业人士和业余爱好者的需求。这款软件还支持矢量图形设计和实时协作&#…

一维信号短时傅里叶变换域邻域降噪方法(MATLAB)

噪声在人类日常生活中无处不在,其会降低语音信号的质量和可懂度。在低信噪比的恶劣环境中,这种负面影响愈发严重。为了解决这个问题,众多研究人员在过去的几十年里提出了许多降噪算法。 根据原理的不同,降噪算法可大致分为五类:谱减法、最优滤波法、基于统计模型的方法、子空间…

Java案例打印乘法口诀表,三角形

目录 一问题: ​编辑二代码: 三运行结果: 四问题 二代码: 三运行结果: 一问题: 二代码: package 重修;import java.util.Random; import java.util.Scanner;public class first {public …

IDEA中Java源文件编译后class文件中文乱码

文章目录 一、设置 一、设置 路径:File -> Settings -> Bulid, Execution,Deployment -> Compiler -> Java Compiler

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日聚会(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

WordPress网站如何做超级菜单(Mega Menu)?

大多数的网站菜单都是像以下这种条状的形式: 这种形式的是比较中规中矩的,大多数网站都在用的。当然还有另外一种菜单的表现形式,我们通常叫做“超级菜单”简称Mega Menu。网站的超级菜单(Mega Menu)是一种扩展的菜单&…

前端基础:CSS(篇一)

目录 css概述 CSS与HTML的关系 基本语法 行内样式表 代码 运行 内嵌样式表 代码 运行 外部样式表 代码 运行 选择器 标签选择器 代码 运行 id选择器 代码 运行 类选择器 代码 运行 选择器优先问题 通配选择器 选中所有的标签 代码 运行 选择器组…

2-22 基于matlab的NSGA-2求解多目标柔性车间调度算法

基于matlab的NSGA-2求解多目标柔性车间调度算法,计算最大完工时间、计算总延期时长、计算调度方案的总能耗、计算设备总负荷。输出四项结果,多次运行可寻找最佳的调度计划。程序已调通,可直接运行。 2-22 NSGA-2求解多目标柔性车间调度算法 - 小红书 (xi…

Java - 程序员面试笔记记录 实现 - Part2

2.1 输入输出流 流可以被看作一组有序的字节集合,即数据在两个设备间的传输。 字节流:以字节作为单位,读到一个字节就返回一个字节;InputStream & OutputStream。 字符流:使用字节流读到一个到多个字节先查询码…

传输距离3000M|低延迟|48K采样音频传输模块-SA356大功率发射模块

无线音频应用中,远距离音频传输在许多领域具有广泛的应用需求,例如大型会议系统、公共广播、户外活动和音乐演出等。为了满足这些需求,音频传输模块需要具备一些关键特性,包括长距离传输能力、高音质、低延迟、稳定性以及抗干扰能…

【第11章】MyBatis-Plus条件构造器(上)

文章目录 前言一、功能详解1. allEq2. eq3. ne4. gt5. ge6. lt7. le8. between9. notBetween10. like11. notLike12. likeLeft13. likeRight14. notLikeLeft15. notLikeRight16. isNull17. in18. notIn19. inSql20. notInSql21. eqSqlSince 3.5.622. gtSql Since 3.4.3.223. ge…

【CentOS7.6】yum 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org

一、报错 1.报错内容如下 在使用 yum makecache 命令时报错,在 yum install -y xxx 的时候报错等等 [roothcss-ecs-a901 yum.repos.d]# yum makecache Loaded plugins: fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorl…

【鸿蒙学习笔记】Column迭代完备

属性含义介绍 Column({ space: 10 }) {Row() {Text(文本描述).size({ width: 80%, height: 60 }).backgroundColor(Color.Red)}.width(90%).height(90).backgroundColor(Color.Yellow) } .width(100%) // 宽度 .height(200) // 高度 .backgroundColor(Color.Pink) // 背景色 .…

【深圳大学算法设计与分析】 实验六 最大流应用问题 FF -> EK -> Dinic

目录 一、实验目的: 二、内容:棒球赛问题 三、实验要求 四、提交要求 ———————— 问题分析解释: ———————— 算法简解: Ford–Fulkerson 增广 Edmonds–Karp 算法 Dinic算法 Dinic和EK的区别: …

STM32第十四课:低功耗模式和RTC实时时钟

文章目录 需求一、低功耗模式1.睡眠模式2.停止模式3.待机模式 二、RTC实现实时时钟1.寄存器配置流程2.标准库开发3.主函数调用 三、需求实现代码 需求 1.实现睡眠模式、停止模式和待机模式。 2.实现RTC实时时间显示。 一、低功耗模式 电源对电子设备的重要性不言而喻&#xff…

【程序大侠传】异步架构应用回调数据接收接口偶发NPE

前序 在这片浩瀚的代码江湖中,各大门派林立,各自修炼独门绝技,江湖中的侠士们分别担任着开发、测试、产品和运维的角色,共同守护着这片数字化的疆域。 开发门派:代码剑宗 代码剑宗的弟子们精通各种编程语言&#xff…

【嵌入式】探索嵌入式世界:在ARM上构建俄罗斯方块游戏的奇妙之旅

文章目录 前言:1. 简介2. 总体设计思路及功能描述2.1 设计思路2.2 功能描述2.3 程序流程图 3. 各部分程序功能及详细说明3.1 游戏界面函数3.1.1 游戏界面中的图片显示3.1.2 游戏开始界面3.1.3 游戏主界面3.1.4 游戏结束广告界面3.1.5 游戏界面中的触摸反馈3.1.6 游戏…