您的位置:首页 > 其它

光照和材质——辐射度量学、绘制方程以及BRDF详解

2018-02-27 00:58 211 查看
早期的图像学教程中,使用经验模型如lambert漫反射模型以及phong模型表示光照,然而,经验模型并未对物理世界的原理进行准确的表示。因此,我们希望从物理现象和原理的角度出发,详解当今图形学领域的基础知识——光照和材质。由于大多数资料中并没有进行详细准确的推导,导致初学者在这一部分的学习中不能直观理解。因此本文将力求在数学推导过程中做到准确详细。

一、基本几何知识及推导

由于我们要研究三维空间中光线的传播过程,因此我们需要引入三维空间中新的计量单位——立体角(Solid Angle)。

为了深入理解立体角的概念,我们需要重温一下二维平面上有关平面角(弧度Radian)的定义。

1.平面角(弧度)

我们想要表达二维空间中的一个角度θθ,使用角度制表示为0度到360度范围的一个角度θ。而使用弧度制则表示为[0,2π][0,2π]范围内的一个弧度r,在单位圆中,其对应关系为:r=θπ/180r=θπ/180。我们可以直观地理解为,弧度对应了单位圆中角度所对应的弧长。

在数学和物理中,弧度是角的度量单位。它是由国际单位制导出的单位,单位缩写是rad。定义:弧长等于半径的弧,其所对的圆心角为1弧度。(即两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角的弧度为1)。

而之所以使用单位圆下的弧长表示弧度,是因为在圆心角相等的情况下,圆心角所对弧长l与圆的半径r成正比,即:l=θrl=θr因此平面角的微分形式可以表示为dθ=dl/rdθ=dl/r

在平面直角坐标系下,我们使用向量(x,y)表示一个固定的方向。而转换为极坐标系下的表示,我们做如下的坐标变换:r=x2+y2−−−−−−√,θ=arcsin(y/r)r=x2+y2,θ=arcsin(y/r)若向量(x,y)(x,y)为单位向量,则r=1,θ=arcsin(y)r=1,θ=arcsin(y),极坐标下的一个方向仅由θ可以表示。

根据上述弧度和极坐标下的推导,我们考虑二维平面上的一个简单问题:如何求单位圆的周长?

在直角坐标系下,单位圆的方程可以显式写为x2+y2=1x2+y2=1,根据第一类曲线积分,我们知道求平面上一段弧长l的积分可以转换为定积分的形式:dl=1+f′2(x)−−−−−−−−√dx,∫ldl=∫ba1+f′2(x)−−−−−−−−√dx=2∫1−11+x2/1−x2−−−−−−−−−−−√dx=2arcsin(1)−2arcsin(−1)=2πdl=1+f′2(x)dx,∫ldl=∫ab1+f′2(x)dx=2∫−111+x2/1−x2dx=2arcsin(1)−2arcsin(−1)=2π

由于直角坐标系下需要进行积分微元与积分变量之间的转换,而在极坐标系下并不需要转换,因此∫ldl=∫2π0dθ=2π,对于任意半径为r的圆,dl=rdtheta,因此圆的周长公式推导为2πr∫ldl=∫02πdθ=2π,对于任意半径为r的圆,dl=rdtheta,因此圆的周长公式推导为2πr。

2.立体角(立体弧度、球面度)

以平面角的定义推导三维空间中立体角的定义。平面角是二维平面上扇形的顶角,立体角则表示三维空间中锥体的顶角大小,我们使用符号ωω来表示立体角。立体角的单位是sr(steradians)。由于我们不能直观地观察立体角,因此我们仿照平面角与单位圆的推导过程推导立体角和单位球。

我们先在三维直角坐标系下推导单位球的表面积,单位球的方程可以显式写为x2+y2+z2=1x2+y2+z2=1根据第一类曲面积分,我们实际上实在单位球的xoy平面投影区域D上对球面微元ds进行积分。我们先做球面坐标变换计算球面微元和积分单位之间的转换关系:设球半径为ρρ,令θ表示经度,φ表示纬度。我们知道,通过经纬度可以准确表示球面上的一个点的位置,则其附近的面微元dA可以近似看作一个矩形,则纬度方向上的边长为ρdφ,由于经度方向在xoy平面上的投影半径为ρsinφ,因此对应dθ的投影边长为ρsinyφdθ,因此微元的面积为:dA=ρdϕ∗ρsinϕdθ=ρ2sinϕdϕdθdA=ρdϕ∗ρsinϕdθ=ρ2sinϕdϕdθ



因此球的表面积积分公式为:S=∫π0∫2π0ρ2sinϕdθdϕ=4πρ2S=∫0π∫02πρ2sinϕdθdϕ=4πρ2

从上述公式可知,球体的表面积与球体半径的平方成正比。从而我们可以类比平面角给出立体角的定义,即立体角表示球面上的局部面积与球半径平方的比值:A=ωρ2A=ωρ2其微分形式可以表示为dω=dA/ρ2dω=dA/ρ2。

因此,根据立体角的定义,我们可以将曲面积分转换为对立体角进行积分。通常使用ΩΩ表示立体角的积分范围,图形学中我们通常使用上半球面的积分,根据上述公式,对于上半球面的立体角进行积分结果等于半球表面积除以半径的平方,也就是2π2π。

3.使用平面角和立体角表示方向

通过上述的定义,平面角和立体角都是无量纲量。因此我们可以将1平面角理解为单位圆上的1弧长,1立体角理解为单位球面上的1球面积。换一个角度理解,我们可以将其看作2维空间和3维空间中的方向。在平面极坐标系中,θ可以被看作方向,因此在极坐标系中方向的取值范围是[0.2π][0.2π],并且可能取到无数个方向。设在极坐标系中定义常数函数f(θ)=cf(θ)=c,表示每一个方向对应一个函数值,那么这个函数在全方向的积分可以表示为∫2π0f(θ)dθ=2πc∫02πf(θ)dθ=2πc回想中学数学中对于圆的定义:圆是平面上到定点的距离等于定长的点的集合,我们也就不难发现,上述积分的结果为半径为c的圆的周长,是因为在平面上任意一个方向上函数值的取值都为半径,即“点动成线”。

对于立体角,由于立体角在三维空间中,因此我们不能直接在积分符号中写出立体角的上下限。在之前的推导中,我们使用Ω表示积分域,当积分域是半球面空间时,∫Ωdω=2π∫Ωdω=2π。如果使用球面坐标表示上述立体角的积分,半球面空间可以表示为经度和纬度的范围:0≤θ≤2π,0≤ϕ≤π/20≤θ≤2π,0≤ϕ≤π/2,我们也需要将立体角转变为微分经度和微分纬度的组合形式,即dω=sinϕdϕdθ,∫Ωdω=∫2π0∫π/20sinϕdϕdθ=2πdω=sinϕdϕdθ,∫Ωdω=∫02π∫0π/2sinϕdϕdθ=2π

同样,我们将立体角也可以看作三维空间中的一个方向,之前提到,地球上的每一个位置都可以用经纬度来表示,而立体角作为单位出现则更加简化了方向的表达形式。设在三维空间中定义函数g(ω)=dg(ω)=d,在上半球面上求解这个函数的积分:∫Ωg(ω)dω=2πd∫Ωg(ω)dω=2πd因此,我们可以将“方向”作为自变量定义函数,简化了函数的表达形式。

综上所述,从平面角出发引入立体角的概念,我们能更好的对三维空间中的方向和计算方法进行全面详细的理解。而这一推导过程恰恰是许多参考资料中缺失的。

二、辐射度量学(Radiometry)

对于物理世界中光的基本现象以及表示方法,在中学物理中我们曾经从光线的传播开始学习,拓展到光的干涉、衍射等物理现象。由于光是电磁波,因此中学物理中我们接触到的是简单的几何光学和经典的波动光学以及量子光学。在计算机图形学领域中,我们需要从几何光学的角度深入探讨如何进行物理世界中光照现象的计算和模拟。在光学中,有关光的测量称为辐射度量学首先介绍辐射度学相关的基本知识:

1.辐射能量(Radiant Energy)

在辐射度量学中,最基本的单位是辐射能量(Radiant energy),表⽰为 Q,能量的单位通常都表示为为 J(焦⽿)。我们知道,每个光⼦都携带⼀定的能量,这个能量正⽐于它的频率 v:

Q=hvQ=hv 其中 h 为普朗克常数 (6.62620×10−34J⋅s)(6.62620×10−34J·s) 。光⼦的频率(或者说能量),影响着光⼦与物体表⾯的交互,更重要的是,它影响着光与感应器(例如⼈眼中的视锥细胞和视杆细胞)之间的作⽤,使不同频率的光被察觉为不同的颜⾊。在可见光谱(Visible Spectrum)中,更“蓝”的光⼦波长更小,频率更高,因此具有更⾼的能量,⽽更“红”的光⼦具有更低的能量。



2.辐射通量(Radiant Flux)

由于光以光速传播,因此使用仪器测光总是要测量单位时间内的通过的能量,而不能测量总能量。因此引入辐射通量的概念,使用符号ΦΦ表示,辐射通量表明了光源的发光功率,单位是W瓦特,即J/sW瓦特,即J/s,表示单位时间内通过某一区域的光能。Φ=dQ/dtΦ=dQ/dt

3.辐射照度(Irradiance)

之前提到的辐射通量表示单位时间内通过某一面积的辐射能量,而对于单位面积来说,我们仍需要定义一个量来表示单位时间内通过单位面积的辐射能量,即辐射照度。我们使用符号E表示辐射照度,定义为:E=dΦ/dAE=dΦ/dA

辐射照度的单位是W/m2W/m2。我们也可以将辐射照度理解为辐射通量密度(Radiant Flux Density)。由于光的传播是有方向的,因此我们将到达表面的辐射照度称为辐入度,将离开表面的辐射照度称为辐出度,使用符号M表示。

我们可以直观地理解光线入射角度对辐射照度的影响。假设平行光的发光功率是100W,有两个面积均为A的平面,其中一个平行于光线方向放置,另一个恰好垂直于光线方向放置,则平行面上的辐射照度为0,垂直面上的辐射照度最大。因此辐照度总是表示成垂直入射表面的分量。最大的辐射照度ELEL出现在表面恰好垂直光线的时候,即EL=Φ/AEL=Φ/A。将表面A以任意方向放置,则E=ELcosθi,其中θi表示平面法线与光线反向的夹角E=ELcosθi,其中θi表示平面法线与光线反向的夹角。

以点光源为例,点光源向四周辐射能量,假设以点光源为中心不同半径的球包裹,点光源发光功率恒定(即辐射通量恒定),则通过每一个包裹球的辐射照度(通量密度)是不同的,为E=Φ/4πr2E=Φ/4πr2

,也就是说,辐射照度与距离的平方成反比,表面离光源越远,通量密度越低。

4.辐射强度(Radiant Intensity)

之前提到的辐射照度将光的测量表示为单位面积上的量。然而,使用单位面积来衡量仍然不够,因为空间中每一个点都有可能被光线照亮,每一个点所接受的辐射都是不同的,如何衡量一个点、一束光线的辐射量?因此在这里引入辐射强度的概念。

定义辐射强度为通过单位立体角的辐射通量,使用符号I表示,单位为W/sr,定义式如下:I=dΦ/dωI=dΦ/dω之所以引入辐射强度,是因为有时候要度量通过一个点的通量的密度,但因为点的面积是0,无法使用辐照度,所以引入辐射强度。辐射强度不会随距离变化而变化,不像点光源的辐照度会随距离增大而衰减,这是因为立体角不会随距离变化而变化。

5.辐射亮度(辐射率,Radiance)

我们常需要度量从一个微小面积表面出发,射向某个微小方向的通量(或者来自某个微小方向,照射到微小面积表面的通量),辐射率就是度量这种情况的量。

辐射率(Radiance),指单位投影面积单位立体角的辐射通量。用符号L表示,单位W/m2sr,定义为L=dΦdωdA⊥W/m2sr,定义为L=dΦdωdA⊥ 。其中dA⊥dA⊥是微分面积dA在垂直于光线方向的投影,如下图所示。

辐射率实际上可以看成是我们眼睛看到(或相机拍到)的物体上一点的颜色,也就是单束光的亮度。在基于物理着色时,计算表面一点的颜色就是计算它的辐射率。

辐射率不会随距离变化而衰减,这和我们日常感受一致,在没有雾霾的干扰时,我们看到的物体表面上一点的颜色并不会随距离变化而变化。为什么辐照度会随距离增大而衰减,但是我们看到的颜色却不会衰减呢?这是因为随着距离变大,我们看到的物体上的一块区域到达视网膜的通量密度会变小,同时这块区域在视网膜表面上的立体角也会变小,正好抵消了通量密度的变化。

6.辐射亮度与其他物理量的关系

根据上述几个物理量的定义式,我们可以进行如下推导:

某点x处的辐照度E(x)=∫ΩL(x←Θ)cosθdωΘE(x)=∫ΩL(x←Θ)cosθdωΘ,其中Θ表示入射光方向,θ表示入射光与面法线的夹角,Ω表示点x处的上半球面空间。

通过上式我们可以看到,表面上一点x处的辐照度事实上表示表面上单位面积的辐射通量,求辐照度即求解上半球面空间中所有方向上入射辐射亮度的积分。

某平面的辐射通量(发光功率)Φ=∫A∫ΩL(x→Θ)cosθdωΘdAΦ=∫A∫ΩL(x→Θ)cosθdωΘdA

例:点光源向上半球面的辐出度,向各个方向发射的辐射亮度都相同

Radiosity,B(x)=、∫ΩL(x→Θ)cosθdωΘ=LπRadiosity,B(x)=、∫ΩL(x→Θ)cosθdωΘ=Lπ

三、BRDF(双向反射分布函数)

我们看到一个表面,实际上是周围环境的光照射到表面上,然后表面将一部分光反射到我们眼睛里。双向反射分布函数BRDF(Bidirectional Reflectance Distribution Function)描述了表面入射光和反射光的关系。

对于一个方向的入射光,表面会将光反射到表面上半球的各个方向,不同方向反射的比例是不同的,我们用BRDF来表示指定方向的反射光和入射光的比例关系,BRDF定义为:

f(x,ωi,ωo)=dLo(x,ωo)/dEi(x,ωi)=dLo(x,ωo)/Li(x,ωi)cosθidωif(x,ωi,ωo)=dLo(x,ωo)/dEi(x,ωi)=dLo(x,ωo)/Li(x,ωi)cosθidωi

公式中,f(x,ωi,ωo)f(x,ωi,ωo)表示在表面x点处入射光方向ωiωi到出射方向ωoωo的BRDF函数,定义为出射方向的微分辐射亮度与入射方向的微分辐照度的比值。单位是sr−1sr−1。

根据能量守恒定律,假设表面不会自身发光,那么入射到表面的光能会转化为1.反射(和折射)的光能,离开表面2.被表面吸收的光能。不考虑能量损失,这几部分能量的总和应该是不变的。因此我们考虑沿ωiωi方向入射到面微元dA的辐照度Ei,这一部分能量到达表面微元后,会被反射到各个方向。我们将之前求积分的过程看作求和,也就是说,各个方向反射的能量加和应该等于总能量(不考虑表面吸收)。那么如何衡量在每个方向上的反射能量的比例呢?我们很自然的想到直接相除。由于实际上我们只关心某个方向上的反射能量,也就是反射的辐射亮度,而不是某区域立体角内反射的辐射照度,因此BRDF的量纲为sr−1sr−1。

四、BRDF与材质属性

BRDF从物理的角度描述了材质属性。在OpenGL固定着色管线中,我们使用经验模型表示光照和材质。常用的经验模型包括Lambert漫反射模型和Phong模型。

1.漫反射模型

根据Lambert漫反射定律,漫反射具有如下性质:

a.从任意视点观察亮度都是相同的

b.亮度只与入射光的方向有关

Le=kd⋅(N⋅L)⋅LiLe=kd·(N·L)·Li

上式中,我们以RGB表示颜色,Le和Li分别表示出射光(视点观察方向)和入射光(光源方向)的光颜色。余弦项表示漫反射定律,参数kd则表示表面的反射率。举例来说,如果表面的反射率是(1,0,0)则表示表面对红光全部反射,而对绿光和蓝光全部吸收,因此如果我们使用白光照射表面,则一定会观察到红色表面。在编辑材质的时候,我们通常会为材质指定kd参数,注意到kd通常是归一化的。

如果使用BRDF来表示漫反射材质,我们需要进行下面的推导:

f(x,ωi,ωo)=dLo(x,ωo)/dEi(x,ωi)=dLo(x,ωo)/Li(x,ωi)cosθidωif(x,ωi,ωo)=dLo(x,ωo)/dEi(x,ωi)=dLo(x,ωo)/Li(x,ωi)cosθidωidLo(x,ωo)=f(x,ωi,ωo)Li(x,ωi)cosθidωidLo(x,ωo)=f(x,ωi,ωo)Li(x,ωi)cosθidωi

对上式在x点上半球面空间求积分。对于任意方向的入射光,经过漫反射表面反射到各个方向的光线比例都是相同的,因此漫反射表面的BRDF是一个常量。可以单独作为因子放在积分外。

∫dLo(x,ωo)=f(x,ωi,ωo)∫ΩLi(x,ωi)cosθidωi∫dLo(x,ωo)=f(x,ωi,ωo)∫ΩLi(x,ωi)cosθidωi

Lo(x,ωo)=f(x,ωi,ωo)ELo(x,ωo)=f(x,ωi,ωo)E

注意到,在半球空间积分右式得到的是表面微元处的辐照度E,表示各个方向接受的光照总和。而关于反射率ρ的定义,各种资料中并没有给出详细准确的定义。我们需要推导漫反射表面BRDF的函数形式,还必须从Le=kd⋅(N⋅L)⋅LiLe=kd·(N·L)·Li进行推导:

我们知道程序中会定义一个漫反射系数kd,然而kd是一个无量纲的常量。假设场景中只有一个光源L,光源L向各个方向的辐照度为ELEL,那么到达表面微元处的辐照度为ELcosθELcosθ,出射方向的辐射亮度Lo=fELcosθ=kdLicosθLo=fELcosθ=kdLicosθ因此我们可以得到f=kd∗Li/Ef=kd∗Li/E
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图形