本篇博客在理论基础上加入自己的初步理解,致力于形象结束辐射度学相关概念.
如果看完还是觉得不清楚,可以访问个人博客:https://zhaishengfu.github.io查阅辐射度学更细致的介绍.
了解PBR就必须明白辐射度学。辐射度学提供了许多想法和工具来描述光的传播和反射。辐射度学并不是从光的物理特性里面推导来的,而是在空间中流动的粒子中建立的抽象光的概念上建立起来的。可以理解为辐射度学是基于光的粒子特性建立的。光具有波粒二象性,辐射度学并没有考虑波的特性。正因为这样,所以一些波特性带来的效果没有办法用辐射度学的方法描述,例如光的偏振。假定几何光学可以充足描述光和光的散射,那么光就会具有以下特性:
采用几何光学模型最大的损失是衍射和干涉现象不能很容易的实现。例如在衍射和干涉中,通过两个区域的整体光通量并不一定等于在每个区域接受到的功率之和。(光通量下面会看到,就是功率的一种)
辐射度学有四个基本量对于渲染至关重要:光通量,辐射照度,光强和辐射亮度(个人翻译,对应英文分别是flux, irradiance, intensity, radiance)。不要被这些名词吓坏,实际非常简单。他们都可以从能量关于时间,面积和方向的极限中推导出来。通常来说这四个值都和波长有关。
让我们从能量开始。能量中学就学过了,单位是焦耳( J J J)。光源向外发射光子,每个光子都有特定的波长,并携带了一定的能量。所有上面的四个基本量都是有效衡量光子能量的方法。能量和波长的关系是:
Q = h c λ Q=\frac{hc}{\lambda} Q=λhc
其中c是光速,h是普朗克常量。
能量描述的是一段时间内做的功。然后渲染中我们更关心某个时刻内光的特性,也就是功率。光的功率就是光通量,也就是单位时间内通过某个区域的总能量。可以通过对能量进行时间的微分来获取光通量;
Φ = lim Δ t → 0 Δ Q Δ t = d Q d t \Phi ={\lim_{\Delta t \to 0}}\frac{\Delta Q}{\Delta t} = \frac{\mathrm{d}Q}{\mathrm{d}t} Φ=Δt→0limΔtΔQ=dtdQ
光通量的单位是瓦特 W W W。
反过来,如果知道了光通量关于时间的函数,我们可以对时间进行积分球的整体能量:
Q = ∫ t 0 t 1 Φ ( t ) d t Q=\int_{t_0}^{t_1}\Phi(t)\mathrm{d}t Q=∫t0t1Φ(t)dt
光源的总辐射一般用光通量来表达。下图中正中间的光源在两个球上面的光通量是一样的。但是经验告诉我们,二者在该光源下表现出来的亮度等特性是不一样的。所以光通量还不足以表达光的足够信息。注意到实际上两个球的面积是不一样的。
从上面我们可以看出来我们还需要光的能量关于面积的衡量,这就是辐射照度。辐射照度的定义是:给定有限区域 A A A, 辐射照度 E E E是:
E = Φ A E=\frac{\Phi}{A} E=AΦ
实际有两种辐射照度:一种我们用E表示(注意这个E不是上面的辐射照度), 表示到达表面的辐射照度,可以叫做“辐射入射度”;另一种是离开表面的辐射照度,可以叫做“辐射出射度”(radiant exitance), 用M表示。其他地方可能看到 E E E同时用来表示入射度和出射度,但是我们为了清晰分开表达。
再看上图的例子,虽然两个球的辐射通量是一样的,但是外球的辐射入射度E比内球的E要小。如果光源在所有方向均匀照射的话,那么对于半径为 r r r的球来说,他的辐射辐射度是:
E = ϕ 4 π r 2 E=\frac{\phi}{4\pi r^2} E=4πr2ϕ
所以辐射照度可以解释为什么外球上的一个点接受到的光的能量更少。并且可以知道这种衰减是正比于和光源之间的距离的平方的。
更一般的,对于某个点p,我们可以通过去p点功率关于面积的微分来定义辐射照度:
E ( p ) = lim Δ A → 0 Δ Φ ( p ) Δ A = d Φ ( p ) d A E(p)={\lim_{\Delta A \to 0}}\frac{\Delta \Phi(p)}{\Delta A} = \frac{\mathrm{d}\Phi(p)}{\mathrm{d}A} E(p)=ΔA→0limΔAΔΦ(p)=dAdΦ(p)
我们同样可以对一定区域的辐射照度进行积分求导光通量;
Φ = ∫ A E ( p ) d A \Phi=\int_{A}E(p)\mathrm{d}A Φ=∫AE(p)dA
理解了辐射照度之后,我们就可以更好的理朗伯定律。朗伯定律说明到达某个表面的光的能量正比于光的方向和表面法向量之间的余弦值
关键一点是:这里是从辐射照度的角度来考虑表面能量,也就是单位面积的功率。如果从能量角度来说,实际上 A 1 A_1 A1和 A 2 A_2 A2的总能量是一样的,总功率也是一样的。但是二者还是展现出来不同的光学现象(想象右图 θ \theta θ为 90 ° 90\degree 90° ,那么A的光几乎照不到平面上,可以类比凌晨时候的太阳。而左图相当于正午时候的太阳。这种类比并不严谨。另外一个更好的类比是,你可以尝试用手电筒在晚上照射某个区域。当垂直照射的时候,此时照亮的区域少,但是非常明亮;但是当你倾斜角度,例如照射很远的区域,这个时候整体亮度就会很低,但是光覆盖的范围很大。实际上两种情况下所有照亮区域的总光能是一致的,但是由于倾斜手电筒的时候面积更大,导致单位面积内的光的能量降低。)所以这里朗伯定律的描述并不严谨,因为到达整个照亮表面的能量和方向无关,应该描述成:到达某个表面每个点的光的能量正比于光的方向和表面法向量之间的余弦值。实际上也就是辐射照度。具体推导请读者自己推导。
好了,上面的辐射照度是不是足够用来描述常见的光学现象了呢??并没有。现在把你想象成一个空间中的一个光子大小(想象吃了爱丽丝的缩小饼干变得很小)。这个时候你会发现一些微观光学现象的震撼:光子在不断震动携带能量、在空间中不同介质中间不断发生作用、吸收释放等等。好扯远了,现在把你放在某个观察点观察照到某个面积上的光,很大概率在不同观察点你会观察到不同的的光亮度(也就是各向异性,真正理想的各项同性的表面我觉得现实生活中是不存在的,或多或少都会有各向异性,只是明显程度不同而已。)。另外一个例子是金属表面的高光,会随着你不同观察方向位置发生变化。这一类现象告诉我们,很多光学现象与观察角度有很大关系,即使其他条件完全一样的情况下。为此,辐射度学引入了“立体角”(Solid angle)和光强的概念。
立体角是2D平面的角度在三维球体上面的拓展。下图是二维角度的示意。单位圆上面物体 c c c的投影弧长 s s s就是弧度,单位是 r a d i a n s radians radians
现在考虑以p为中心的单位球,如下图,这个时候某个物体 c c c在球上会有一个投影表面积 s s s。 s s s的面积就是物体 c c c的立体角,单位是 s t e r a d i a n s steradians steradians。所以很容易就能知道,整个球体的立体教师4 π \pi π sr。
考虑单位球上面的任意一点k, 从中心点p到k的单位向量可以用来表述方向,我们用 ω \omega ω来表示这个单位方向向量。
现在考虑一个无穷小的光源在散发光子,如果我们将这个光源防止在上面的球中心处,我们可以计算光源某个角度的发射功率,这个量就是光强I,单位是W/sr。整个球体的光强是:
I = Φ 4 π I=\frac{\Phi}{4\pi} I=4πΦ
这计算的是平均,并且假定这个理想光源在所有方向上面都是完全均匀发散的,也就是上面提到的理想各项同性光源。更一般的,取光通量在方向上面的微分可以获取某个方向的光强:
I = lim Δ ω → 0 Δ Φ Δ ω = d Φ d ω I={\lim_{\Delta \omega \to 0}}\frac{\Delta \Phi}{\Delta \omega} = \frac{\mathrm{d}\Phi}{\mathrm{d}\omega} I=Δω→0limΔωΔΦ=dωdΦ
一样的,反向去积分就可以获取光通量:
Φ = ∫ Ω I ( ω ) d ω \Phi=\int_{\Omega}I(\omega)\mathrm{d}\omega Φ=∫ΩI(ω)dω
可以看到,光强和辐射照度二者是没有关系的,是从不同角度对光通量进行描述的。二者均可以与光通量进行微积分操作上的转化。
终于到了最重要的基本量,辐射亮度 L L L。辐射照度给了p点光通量在面积上的微分,但是并不能区分不同方向的光通量。举个例子,考虑两个手电筒,二者口径不一样。大的手电筒A垂直照射地面B,小的手电筒C倾斜45 ° \degree °照射地面D,通过辐射照度公式我们可以使得B和D的辐射照度完全一样,但是我们选定某个观察方向观察照射平面会有不同光学现象。这种不同有一方面原因就是由于观察方向的不同。辐射亮度衡量的是辐射照度在立体角上的微分,定义是:
L ( p , ω ) = lim Δ ω → 0 Δ E ω ( p ) Δ ω = d E ω ( p ) d ω L(p, \omega)={\lim_{\Delta \omega \to 0}}\frac{\Delta E_{\omega}(p)}{\Delta \omega} = \frac{\mathrm{d}E_{\omega}(p)}{\mathrm{d}\omega} L(p,ω)=Δω→0limΔωΔEω(p)=dωdEω(p)
这里要注意的一点是, E ω E_\omega Eω表示的是垂直于方向 ω \omega ω的表面的辐射照度。如果你还记得上面的朗伯定律,你会发现这种这种垂直的表示抵消了朗伯定律里面的cos θ \theta θ。那么应该如何理解辐射亮度呢??因为确实现实生活中我们观察到的照射亮度是和角度有关系的,也就是郎伯定律是宏观可见的性质,但是如果按照辐射亮度的理解,那么相同光源以不同方向照射平面,平面上某点某方向的辐射亮度是一样的!!那么这个辐射亮度对应的是什么宏观光学现象呢??这里我的理解是未必正确:辐射亮度不是针对宏观现象提出来的量,它本身就是针对微观层面的微分的。考虑照射的表面无穷小,这个时候光源某个方向就成了一个理想的光束,照射的是一个理想的点,那么这个单独点上面的辐射亮度确实是一样的!!但是宏观的亮度确实有不一样,为什么呢?我认为是密度的问题。当垂直照射,由于照射区域紧凑,导致相同区域有更多的光子照射,而倾斜的时候照射表面区域变大,虽然辐射亮度一样,但是到达一定区域的光子的密度更少,也就是光子要照亮的区域更大,所以会变暗。注意这里描述的是“一定区域”,也就是又变成了宏观层面。因为人眼看到的只能是“一定区域”。上面只是我个人猜想。如果错误欢迎指正。
言归正传,辐射亮度当然也可以定义为光通量在垂直面积和立体角上的微分:
L = d Φ d ω d A ⊥ L= \frac{\mathrm{d}\Phi}{\mathrm{d}\omega \mathrm{d}A^\perp} L=dωdA⊥dΦ
好了,到达辐射亮度的级别基本足够用了。当辐射亮度已知后,其他三个辐射度学基本量都可以根据积分公式获取。这也是为什么辐射亮度最经常使用的一个重要原因。另外一个原因就是辐射亮度在真空中光线传输过程中保持恒定。
好了,辐射度学的基本知识讲解完毕。之后我们将讲解辐射度学在这四个基本量上如何描述复杂而真实的光学现象。
Linux 操作系统Shell编程快速入门、shell函数,Shell编程综合案例(定时备份数据库)。
本篇文章介绍了组件自定义事件的原理以及使用的方法,在实际开发中,组件的自定义事件也是一个小技巧,能有效提高开发的效率
最近做项目。客户好些地方需要打印网页上的表格,研究了好些方法都不太理想。最后找到一个jquery.print.js打印插件,非常方便就可以实现想要的网页打印效果,值得推荐。实现方法 引用jquery和,jqprint到您的页面<script language="javascript" src="jquery-1.4.4.min.js"></script><...
后天终于可以回家了,马上就要过年了,趁着年底打酱油的模式,就多学习学习,然后记录记录吧。关于Activity已经学习了七七八八了,还有就是Activity的四种启动模式了,它们分别为,standard,singleTop,singleTask,singleInstance,根据名字也差不多可以理解这四种模式了: standard:标准启动模式,默认情况下就是这个模式了,这个模式下启动的A
GNU Scientific Library(以下简称GSL)是来自开源社区的重磅礼物,历史悠久功能强大,集成了最基础的同时也是最重要的科学计算算法如BLAS、Monte Carlo积分等。本文讲解了其基本使用方法,结合笔者的经验点明其应用,并提供代码进行参考。这里是PDF文档下载。一、基础 如果你是Windows用户,请访问GNUWin32下载最新的预编译库或者源代码包手动编译,为了程序运行稳定
分类: C/C++原文地址:http://www.ddj.com/cpp/204202899?cid=RSSfeed_DDJ_C 本文译自Gigi Sayfan在DDJ上的专栏文章。Gigi Sayfan是北加州的一个程序员,email:[email protected]. 本文是一系列讨论架构、开发和部署C/C++跨平台插件框架的文章的第一篇。第一部分探索了一下现状,调查了许多现有的插件/组件库,深入研究了二进制兼容问题,并展现了一些该方案必要的一些属性。后续的文章用一个例子展示了可用于Window、Linux
关于 iwiw 是一种新的基于 nl80211 的用于无线设备的CLI配置实用程序。它支持最近已添加到内核所有新的驱动程序。采用无线扩展接口的旧工具iwconfig已被废弃,强烈建议切换到 iw 和 nl80211。像Linux内核的其余部分,iw 仍处于开发阶段。功能被随时添加。 iw 的唯一文档就是此页和“iw help”的输出。 请帮助扩大这个
数论四大定理之威尔逊定理数论四大定理之威尔逊定理 - 简书威尔逊定理及其证明 - clockwhite - 博客园数论四大定理之威尔逊定理_L__ear的博客-程序员秘密_威尔逊定理威尔逊定理威尔逊定理_Michael_Li的博客-程序员秘密_威尔逊定理威尔逊定理_jkchen's Haven-程序员秘密威尔逊定理 数论威尔逊定理 数论_初学者-程序员秘密_威尔逊定理如何用最简单明了的话语解释威尔逊定理吗?哪种证明威尔逊定理的方法最简单?如何用最简
在我们的F盘里面有一个文件把这些原有的文件全部替换一下即可,之前我们数据库里面写一个User.java代码块,今天我们要改为动态的,所以要更换。1.把我们不要的先删掉了,这些是当时为了搭建项目,被选中的可以删掉了,还要其他被选中的,目前我们只做了登录和主界面。在我们的login.js里面把我们的login.jsp里面的script里面的方法给复制过去。还有我们的main.js里面把我们的mian.jsp里面的script里面的方法给复制过去。现在我们把它变为活的UserAction.java代码块。....
1.引入 <properties> <dubbo-spring-boot-starter.version>2.7.5</dubbo-spring-boot-starter.version> <dubbo-registry-nacos.version>2.7.5</dubbo-registry-nacos.version> </properties> <dependencies&g
torch.randn(*sizes, out=None)→ Tensor功能:从标准正态分布(均值为0,方差为1)中抽取的一组随机数。返回一个张量sizes (int…) - 整数序列,定义输出张量的形状out (Tensor, optinal) - 结果张量eg:random = torch.randn(2, 3)out: 0.5419 0.1594 -0.0413...
项目需要,在驱动模块里用内核计时器timer_list实现了一个状态机。郁闷的是,运行时总报错“Scheduling while atomic”,网上搜了一下:"Scheduling while atomic" indicates that you've tried to sleep somewhere that you shouldn't - like within a spinlock-protected critical section or an interrupt handler.改进程