光照可分为局部光照全局光照

局部光照:直接照射到物体表面的光照

全局光照:物体表面受周围环境影响的光照

左图中点x接收到周围环境的光线照射,来自周围表面的反射光照称为全局光照;右图中点x接收来自太阳光的直接照射,来自太阳发射的直接光照称为局部光照。

在现实环境中,全局光照的情况更为复杂,例如:

  • 半透明表面(Semi-transparent surfaces):光线可以穿过表面进行复杂的交互,如玻璃棱镜,可以改变光的波长;
  • 次表面散射(Sub-Surface Scattering):光线可以穿过子表面,在同一表面的不同方向反射,如皮肤;
  • 表面渗色(Surface bleeding):光线穿过表面,在介质中改变颜色到目标表面。

其他例子还有很多,全局光照会比局部光照效果更佳柔和自然,但考虑到其复杂性,应用到实时渲染中也是有一定难度的。

我们在前几篇中通过理论得到的BRDF光照模型公式实际为局部光照模型中,还欠缺了全局光照因素。

下面,我们来研究一下BRDF的局部反射模型,先来看下最简单的Lambertian反射模型。

Lambertian反射模型

Lambertian反射称作完全漫反射。这是一种理想情况,现实中不存在完全漫反射,但Lambertian可以用来近似的模拟一些粗糙表面的效果,比如纸张。

对于Lambertian表面,入射方向与出射方向无关\({\omega_i}\)与\({\omega_o}\)无关,\({L_o(p, \omega_o)}\)可以表示为\({L_o(p, \omega_o)} = {L_r(p)}\)。

在上一篇中,我们知道反射辐射度的方程为:

\({L_o(p,\omega_o)} = \int_{\Omega_i}{f_r(p, \omega_i, \omega_o)}\, {L_i(p, \omega_i)}\, {\cos \theta_i}\, {d\omega_i}\)

在Lambertian反射模型中,由于\({\omega_i}\)与\({\omega_o}\)无关,BRDF项\({f_r(p, \omega_i, \omega_o)} = {f_r(p)}\),上式可表示为:

\({L_r(p)} = {f_r(p)\int_{\Omega_i}L_i(p, \omega_i)\, \cos \theta_i \, d\omega_i} = {f_r(p)\, E_i(p)}\)

\(\Rightarrow {f_r(p)} = \frac{L_r(p)}{E_i(p)}\)

在上一篇的反射率中,\({\Omega_o}\)内的反射通量\({d\Phi_o} = {dA\int_{\Omega_o}L_o(p,\omega_o) \, \cos \theta_o \, d\omega_o}\)

在整个Lambertian表面半球积分(\({\Omega_o} = {2\pi}\))中:

\({d\Phi_o} = {dAL_r(p)\int_{2\pi}\cos \theta_o \, d\omega_o} = {dA \, L_r(p) \, \pi}\)

式中的\({\int_{2\pi}\cos \theta_o \, d\omega_o} = {\pi}\),这是一个半球积分,在第一篇中我们推出过该结果。

\({d\Phi_i} = {dA\int_{2\pi} L_i(p, \omega_i) \, \cos \theta_i \, d\omega_i} = {dA \, E_i(p)}\)

反射率\({\rho_d(p)} = \frac{d\phi_o}{d\phi_i} = \frac{L_r(p) \, \pi}{E_i(p)} = {f_r(p) \, \pi}\)

这样,我们就得到了Lambertain BRDF:\({f_r(p)} = \frac{\rho_d(p)}{\pi}\)

其中\({\rho_d}\)可以用常数项表示:\({\rho_d} = {k_d \, c_d}\),\({k_d \in [0, 1]}\),表示漫反射系数;\({c_d}\)表示漫反射颜色。

Lambertain BRDF又可写为\({f_r(p)} = \frac{k_d \, c_d}{\pi}\)

我们通常在实时渲染出于性能方面的考虑,会省略掉\(\pi\),我们熟知的漫反射颜色计算公式,就是从反射辐射度方程中简化而来的:

反射辐射度方程:\({L_o(p,\omega_o)} = {f_r(p, \omega_i, \omega_o)}\int_{\Omega_i}{L_i(p, \omega_i)}\, {\cos \theta_i}\, {d\omega_i}\)

漫反射着色公式:\({L_r} = {k_d \, c_d} {\sum_{1}^{n}  \, L_i \, (n * l)} \)

对比看一下,是不是很像?\(\sum_{1}^{n}\)表示逐个光源求和近似积分,\({L_i}\)表示光源强度,\({n * l}\)表示\({\cos \theta_i}\)项

PBR Step by Step(四)Lambertian反射模型的更多相关文章

  1. PBR Step by Step( 五)Phong反射模型

    Lamertian模型描述了当光源直接照射到粗糙物体表面时,反射光线的分布情况.在现实中,除了直接光照,还有来自周围环境的间接光照. 直接照射到物体表面的光照,又称为局部光照: 间接照射到物体表面的光 ...

  2. 课程四(Convolutional Neural Networks),第一周(Foundations of Convolutional Neural Networks) —— 2.Programming assignments:Convolutional Model: step by step

    Convolutional Neural Networks: Step by Step Welcome to Course 4's first assignment! In this assignme ...

  3. 【转载】MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)

    1. Set  - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: { ([Product].[Category].[Accessories]), ([Product].[ ...

  4. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调

    上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServ ...

  5. WPF Step By Step 系列 - 开篇 ·

    WPF Step By Step 系列 - 开篇 公司最近要去我去整理出一个完整的WPF培训的教程,我刚好将自己学习WPF的过程和经验总结整理成笔记的方式来讲述,这里就不按照书上面的东西来说了,书本上 ...

  6. enode框架step by step之框架要实现的目标的分析思路剖析1

    enode框架step by step之框架要实现的目标的分析思路剖析1 enode框架系列step by step文章系列索引: 分享一个基于DDD以及事件驱动架构(EDA)的应用开发框架enode ...

  7. Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1

    摘要: Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1 安装遇到问题请文末留言. 悦动智能公众号:aibbtcom AI这个概念好像突然就 ...

  8. 数据库设计 Step by Step (2)——数据库生命周期

    引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整 ...

  9. Asp.Net Core 5 REST API - Step by Step

    翻译自 Mohamad Lawand 2021年1月19日的文章 <Asp.Net Core 5 Rest API Step by Step> [1] 在本文中,我们将创建一个简单的 As ...

随机推荐

  1. Linux上软件安装

    手动安装 以安装SublimeText3为例: 首先下载安装包 [keysystem@localhost ~]$ wget https://download.sublimetext.com/subli ...

  2. harbor高可用集群配置

    目录 说明 双主复制 主从同步 双主复制说明 多harbor实例共享后端存储 方案说明 环境说明 配置说明 安装redis和mysql 导入registry数据库 配置harbor 挂载nfs目录 修 ...

  3. [游戏数据分析]WAU模型简介及WAU预测

    声明:本博客中所采用的数据并非真实数据,会对真实数据加以变换,重在讨论游戏数据分析的思路. 这里是参考友盟的WAU模型[文章网址,  演示网址],利用某款游戏(以下称为游戏A)数据进行的分析. 作用: ...

  4. linux - 流量切分线路

    流量切分线路方式 # 程序判断进入IP线路,设置服务器路由规则控制返回 vi /etc/iproute2/rt_tables #添加一条策略 bgp2 #注意策略的序号顺序 ip route add ...

  5. netty学习总结(一)

    netty是一个nio框架,将java的nio进行了一个封装,形成了一个高性能,高可用的网络编程框架,很多的框架都是基于netty的,所以学好netty是很有用的,而且netty本身的代码结构设计,以 ...

  6. 面积并+扫描线 覆盖的面积 HDU - 1255

    题目链接:https://cn.vjudge.net/problem/HDU-1255 题目大意:中文题目 具体思路:和上一篇的博客思路差不多,上一个题求的是面积,然后我们这个地方求的是啊覆盖两次及两 ...

  7. apropos找命令助手

    apropos (意即"关于")能够搜索 Linux 帮助文档来帮你找到你想要的命令.比如说,你不记得你用的发行版用的什么防火墙工具了.你可以输入 apropos "fi ...

  8. 如何提升mysql replication的性能&amp;多线程传输二进制日志

    1,最好使用内网或者专线链路传输binlog数据 (千兆网卡.还不够的话,bounding 技术,扩展带宽) 在my.cnf中强制使用内网ip传输数据bind-address=ip2,将二进制保存在独 ...

  9. kernel——make menuconfig的实现原理【转】

    转自:https://blog.csdn.net/hpr1992/article/details/41048693 .系统移植可以分为配置系统和编译系统两大块,其中通过命令makemenuconfig ...

  10. apiCloud app调用浏览器打开网页的方法

    在APP调用浏览器有两种方法:1.使用openApp2.使用openWin 两种方法调用浏览器后的效果有一点不同:1.使用openApp调用浏览器后,如果手机内有多个浏览器,会首先弹出选择浏览器的框2 ...