PBR Step by Step(四)Lambertian反射模型
光照可分为局部光照和全局光照。
局部光照:直接照射到物体表面的光照
全局光照:物体表面受周围环境影响的光照

左图中点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反射模型的更多相关文章
- PBR Step by Step( 五)Phong反射模型
Lamertian模型描述了当光源直接照射到粗糙物体表面时,反射光线的分布情况.在现实中,除了直接光照,还有来自周围环境的间接光照. 直接照射到物体表面的光照,又称为局部光照: 间接照射到物体表面的光 ...
- 课程四(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 ...
- 【转载】MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)
1. Set - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: { ([Product].[Category].[Accessories]), ([Product].[ ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调
上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServ ...
- WPF Step By Step 系列 - 开篇 ·
WPF Step By Step 系列 - 开篇 公司最近要去我去整理出一个完整的WPF培训的教程,我刚好将自己学习WPF的过程和经验总结整理成笔记的方式来讲述,这里就不按照书上面的东西来说了,书本上 ...
- enode框架step by step之框架要实现的目标的分析思路剖析1
enode框架step by step之框架要实现的目标的分析思路剖析1 enode框架系列step by step文章系列索引: 分享一个基于DDD以及事件驱动架构(EDA)的应用开发框架enode ...
- Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1
摘要: Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1 安装遇到问题请文末留言. 悦动智能公众号:aibbtcom AI这个概念好像突然就 ...
- 数据库设计 Step by Step (2)——数据库生命周期
引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整 ...
- 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 ...
随机推荐
- SQL Server 数据库对象命名参考
一. 引言 编码规范是一个优秀程序员的必备素质,然而,有很多人非常注重程序中变量.方法.类的命名,却忽视了同样重要的数据库对象命名.这篇文章结合许多技术文章和资料,以及我自己的开发经验,对数据库对象的 ...
- INF文件详解
安装信息(Setup Information)文件是Windows系统支持的一种安装信息存放文件,一般以INF作为扩展名,因此也叫INF文件.安装信息INF文件与Windows内建的安装服务引擎(AP ...
- 使用 maven 搭建web开发基本架构
我觉得可能,对于还没有使用过 IDEA 进行开发的童鞋来说,直接撸代码是有些尴尬的.那么我会把示例代码之前的那些事再在这里写一遍 按图步骤进行即可进行基本项目结构搭建 现在基本流行 maven 管理项 ...
- Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)
编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...
- android中实现在ImageView上随意画线涂鸦
我实现的思路: 1.继承ImageView类 2.重写onTouchEvent方法,在ACTION_MOVE(即移动时),记录下所经过的点坐标,在ACTION_UP时(即手指离开时,这时一条线已经画完 ...
- js 奇葩技巧之隐藏代码
昨天在群看到有人发了个文章叫<“短”化你的代码>,思路非常不错,采用unicode的零宽字符来实现字符隐藏,虽然有字符,可是你却看不见它.这篇文章详细的介绍了这种方法的实现原理,最后还给出 ...
- html5 canvas旋转+缩放
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- J2EE简介
一,J2EE概念: J2EE的全称为,Java2 Platform Enterprise Edition,Java或java2平台企业版,他是基于java平台或java2平台的标准版,保留并扩展了J2 ...
- Floyd判圈算法 UVA 11549 - Calculator Conundrum
题意:给定一个数k,每次计算k的平方,然后截取最高的n位,然后不断重复这两个步骤,问这样可以得到的最大的数是多少? Floyd判圈算法:这个算法用在循环问题中,例如这个题目中,在不断重复中,一定有一个 ...
- SVM Kernel Functions
==================================================================== This article came from here. Th ...