微分立体角与辐射度量学

微分立体角(Differential Solid Angle) 是立体角的一个微小变化量,用于描述空间中某一方向上的微小立体角范围。

微分立体角在辐射度量学(Radiometry)中是必不可少的,因为它参与了辐射度量单位的定制。

所以,我们要想研究辐射度量学,微分立体角是必须要完全掌握的。

1-立体角

我们应该学过二维世界里的角。

角是由两条具有公共端点的射线组成的图形。

通常,我们可以说∠A 等于90°,或者∠A 的弧度等于π/2。

它之所以是二维世界里的角,是因为构成这种角的两条射线必然共面。

那有没有三维空间里的角呢?

答案是:有的,这种角就是立体角(Solid Angle)。

三维空间里的立体角不再是由两条射线围成夹角,它是由一种扇形面围成的夹角,你可以将这种扇形面理解为由无数条射线围成的面。

立体角既然是由扇形面围成的夹角,那它必然是有大小之分的,因此我们能否像说∠A 的弧度等于π/2一样形容立体角的大小呢?

答案是:能。

我们可以通过扇形面围成的夹角在半径为1的单位球面上截取的面积来形容立体角的大小。

这时候,我们就需要制定一种单位,来表示这种度量立体角的方式。

这种单位就叫球面度。

2-球面度

球面度(Steradian,简称sr)是立体角的计量单位。

球面度可以理解为三维世界里的弧度,当然它不叫弧度,它就叫球面度。

一个单位圆的弧度就是这个单位圆的周长,即2π。

一个单位球的球面度就是这个单位球的面积,即4π。

因此,当我们用扇形面围成的立体角在半径为r 的球体上截取一块面积为A 的球面时,那此立体角的球面度就是:

3-单位立体角

单位立体角(Unit Solid Angle) 就是单位球上面积为1的球面所对应的立体角,即1球面度的立体角。

在辐射度量学中,会把单位立体角作为度量光线power的一种方式,这种方式就叫做radiant intensity。

power 是光源在单位时间中散发的能量,它决定了光源的亮度。

举个例子,已知光源在单位立体角ω 中散发出的power 是1,那我们就说光源的Radiant intensity 是1。

Radiant intensity 是power 在单位立体角中的能量。

再举个例子,已知点光源的power是Φ,它可以均匀的向四面八方发光,那这个光源射出的光线在每个方向上的radiant intensity 是多少呢?

答案是:光源的power除以整个球体的球面度。

公式如下:

然而,一个光源并不一定会均匀的向四面八方发光,因此它在各个方向上的radiant intensity 就不一定相等。这时候我们就需要以微分的方式表示光源在各个方向上的radiant intensity。

公式如下:

  • I(ω):光源在某一方向上的radiant intensity
  • ω:某一方向上的单位立体角
  • dΦ:微分power
  • dω:微分立体角

接下来咱们详细解释一下微分立体角概念。

4-微分立体角

微分立体角(Differential Solid Angle)是立体角的一个微小变化量,你可以将其理解为单位球面中,趋向于0的面积对应的立体角。

微分立体角的定义通常与球坐标系中的角度变化相关联。

在球坐标系中,一个点可以用半径r、极角θ和方位角ϕ来表示。

我们可以将θ和ϕ方向的极小变换量分别写做dθ和dϕ。

dθ 在球面上纵向截出的弧长是:

解释一下其原理。

θ和ϕ都是弧度,这种弧度可以理解为单位圆里的弧长。

当单位圆不是单位圆,而是任意半径为r的圆时,那之前单位圆里的弧度所对应的弧长就需要再乘以r。

同理,ϕ 在球面上横向截出的弧长是:

因此,dθ和dϕ在球面上截出的面积dA 就是:

因为dθ和dϕ都是趋向于0的极小值,所以dA 就是趋向于0的极小面积。

把dA投影到单位球上后的投影面积所对应的立体角就是微分立体角。

微分立体角通常用dω 表示,其公式如下:

到了这里,你可能会想,我为什么要知道微分立体角?为什么要知道radiant intensity?

接下来咱们举个简单的例子说一下其用法。

5-Lambert 材质的BRDF

Lambert材质是一种简化的光照模型,它只受漫反射影响,当光线打到Lambert物体表面的时候,会被均匀的散射,不会形成高光,没有镜面效果。

Lambert材质的漫反射可以理解为物体表面反射的power和吸收的power的比值。

接下来咱们把这个物体表面具化为一个单位面积。

这个单位面积吸收的power 就叫irradiance。

当然,你也可以说power在单位面积中的能量就叫irradiance。

漫反射的公式如下。

  • Eo:单位面积反射出的power
  • Ei:单位面积吸收的power

因为Lambert 材质会均匀散射入射光,所以我们假设单位面积向任意方向反射的radiant intensity 都是Lr。

接下来,我们可以根据Lr 和微分立体角的关系积分出Eo。

  • Lr:单位面积向任意方向反射的radiant intensity
  • H²:半球范围
  • cosθ:反射光线与单位面积所在平面的法线的夹角的cos值,θ∈[0,π/2]
  • dω:微分立体角
  • cosθdω:不同方向的radiant intensity 所消耗的单位面积里的power

在此我们要清楚一个问题,单位面积反射出去的radiant intensity 的和并不等于单位面积所能反射出去的总power。

这是因为单位面积所在的表面并不是一个半球,它无法毫无保留的反射出Lr2π 的power。

单位面积反射出去的radiant intensity 为单位面积贡献了多少的反射能量,会受反射光线和单位面积所在平面的法线的夹角影响。

在下图所示,反射光线的长度体现了反射光线为单位面积提供的反射能量与cosθ 的关系。

这就为什么我们要在Eo的微积分公式中用cosθ乘以微分立体角dω。

接下来咱们详细说一下Eo 的计算过程。

把微分立体角dω 展开:

  • θ∈[0,π/2]
  • Φ∈[0,2π]

整理微积分公式:

根据三角函数的倍角公式,可以对上式中的cosθsinθ 进行简化:

所以:

接下来,我们进行换元,令 u =2θ,则 du*=2*dθ,即 dθ=(1/2)du。

同时,当 θ =0 时,u =0;当 θ =2π 时,u =π

将上述换元代入原积分,得到:

最终的Eo 公式如下:

我们可以利用微积分第二基本定理计算Eo。

微积分第二基本定理:假设函数小f 是定义于[a,b] 闭区间的连续函数,则其在[a,b]区间的定积分可由某个函数大F 在上界b 点的数值,减去其在下界a 点的数值,大F 是小f 的反导函数,也就是大F的倒数等于小f。

接下来,我们根据上面的定理,先计算Eo里的反导函数。

dΦ 实际上是1dΦ ,所以我们要求1的反导函数,即Φ+c,其中的常数c可以在积分的过程中消掉,所以可以忽略不计。

sinu的反导函数是-cosu+c,常数c同样可以忽略不计。

将反导函数代入Eo可得:

将Eo的值代入之前的diffuse 公式可得:

由此我们可以得到Lr和diffuse 的关系:

接下来,我们再思考一个问题。

我能否创建一个函数,使其能够算出光线照到物体表面后,有多少能量向什么方向反射?

答案是肯定的,这种函数就叫BRDF。

BRDF 全称Bidirectional Reflectance Distribution Function,译作双向反射分布函数。

BRDF 是用来区分不同材质的关键。

BRDF要解决的问题是光线打到物体表面后,会有多少power 被反射到哪些方向上去。

在当前的Lambert 材质中,Ei 就是所有光线打到一个单位面积后产生的power,即irradiance。

Lr就是被反射出去的一条光线在单位立体角中的power,即radiant intensity。

至于反射的方向,就是均匀的半球方向。

因此,Lambert BRDF 计算公式如下:

我们在three.js 的着色器源码中,可以看到Lambert 材质的BRDF 代码。

javascript 复制代码
vec3 BRDF_Lambert( const in vec3 diffuseColor ) {
    return RECIPROCAL_PI * diffuseColor;
} // validated

上面的RECIPROCAL_PI 是1/π,因此BRDF_Lambert 返回的结果就是diffuseColor/π。

这段代码挺有意思的,Lambert的BRDF虽然经过了缜密的计算,但结果非常简单,以至于作者在后面还特意注释了个validated,生怕我们不相信。

因为Lambert 是一种理想化的均匀散射光线的模型,所以其BRDF 不需要考虑其光线的入射方向和反射方向的关系。

对于无法均匀散射光线的模型,我们通常会引入入射方向和反射方向的概念,并以微分的方式表示BRDF。

  • fr(ωi→ωr):BRDF,i方向的radiant intensity 照射到单位面积上后,向r方向反射出多少power
  • ωi:入射方向i 的立体角
  • ωr:反射方向r的立体角
  • dLr(ωr):单位面积对来自i方向的入射光power的反射,即Exiting Radiance。
  • dEi(ωi):单位面积的接收到的来自i方向的入射光的能量,即Incident Radiance。

在上面的公式里我们看到dLr(ωr)和dEi(ωi) 都属于Radiance。

Radiance 是power在单位立体角、单位面积中的能量。

Radiance 根据入射和出射方向分成Incident Radiance 和Exiting Radiance 两种。

Incident Radiance 是irradiance 在单位立体角中的power。

公式如下:

  • p:光源位置
  • ω:立体角
  • dE(p):微分irradiance
  • dω:微分立体角
  • dωcosθ:与单位面积垂直的微分立体角

Exiting Radiance 是来自于单位面积的radiant intensity。

格式如下:

  • dI(p,ω):微分radiant intensity
  • dA:微分面积
  • dAcosθ:与反射光垂直的微分面积

其它的BRDF 我得在后面的文章里说了,这一篇就算是通过微分立体角说一下辐射度量学里的基础概念了。

总结

立体角在辐射度量学中可以起到度量衡的作用。

微分立体角可以用于描述从光源发出的power 在空间中的分布情况。

Radiometry(辐射度量学)在物理上定义了光照的若干属性,并且描述了光的传播与衰减方式。

Radiometry定义的光照属性有以下几种:

  • Radiant energy:光源的所有能量,以焦耳为单位。
  • Radiant flux(power):Radiant energy 在单位时间中的能量。
  • Radiant intensity:power在单位立体角中的能量。
  • Irradiance:power在单位面积中的能量。
  • Radiance:power在立体角、单位面积中的能量。

参考链接:

www.bilibili.com/video/BV1X7...

www.cnblogs.com/wantnon/p/6...

相关推荐
腾讯TNTWeb前端团队1 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰4 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪5 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪5 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy5 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom6 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom6 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom6 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom6 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom6 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试