您好,欢迎访问三七文档
第12章体积散射到目前为止,我们都假定场景中的所有表面都在真空中,这意味者在表面之间的光线的辐射亮度是恒定的。然而,在许多真实世界中的情景中,这个假设并不精确:雾和烟对光产生了衰减和散射作用,大气中的粒子的散射作用使得蓝天呈蓝色,使得夕阳晚景呈红色。本章介绍相关的数学知识来描述参与介质(participatingmedia--分布于三维空间区域中的粒子)对光的影响。有了对参与介质的效果的模拟,我们就可以渲染场景有雾霭的图像、穿透云层的光束、子表面的散射(即光线的出射点跟入射点不同)。本章首先描述了光线的辐射亮度受参与介质影响的基本物理过程。然后,我们介绍VolumeRegion基本类,它是描述不同介质的接口。为了确定光在场景中的分布的整体效果,我们还需要第17章中所介绍的VolumeIntegrator。12.1体积散射过程在有参与介质的环境中,有三个主要过程可以影响辐射亮度的分布:吸收(Absorption):由于光能转变成其它形式的能量(如热)而减弱了辐射亮度。放射(Emission):发光的粒子增强了环境中的能量。散射(Scattering):由于光跟粒子的碰撞,在一个方向上传播的光被散射到其它方向上去。所有这些特性既可以是均质的(homogeneous),也可以是非均质的(inhomogeneous)。均质的特性在给定的一个空间范围之内是一个恒量,而非均质的特性在空间内是变化的。下图显示了一个体积散射的例子:一个聚光灯照亮了参与介质,并投射出一个体积阴影(volumetricshadow)。12.1.1吸收考虑一下火产生的浓烟:烟遮挡了后面的物体,因为烟的颗粒吸收了从物体到观察者的光线。烟越浓,被吸收的光就越多。下图显示了烟的这种特效,其体积密度是由一个模拟烟的精确物理模型生成的。注意地面上的阴影:参与介质已经吸收了光源和地面之间的光线,从而投射出一个阴影。吸收是通过介质的吸收截面σa来表述的,它是光线在介质中单位距离之内被吸收的概率密度。通常情况下,吸收截面随着位置p和方向ω的变化而变化,虽然严格地讲它是关于位置的函数,但是它通常也是随光谱变化的量。σa的单位是距离的倒数(m-1)。这意味者σa可以取任意正值,并不需要限定在0到1之内。下图显示了沿着很短一段光线上的吸收效果。在点p上有一定的辐射亮度Li(p,-ω),我们希望求出在微分体积之内被吸收后的出射辐射亮度Lo(p,ω)。沿光线微分长度dt的辐射亮度变化值可以通过下面的微分方程来表示:Lo(p,ω)−Li(p,−ω)=dLo(p,ω)=−σa(p,ω)Li(p,−ω)dt,也就是说,沿着光线的辐射亮度的微分减少值跟其初始值呈线性关系。这个微分方程的解实际上是要给出描述光线上被吸收的光的总比率的积分方程。如果我们假定光线以p为起始点在介质中沿方向ω上行进了距离d,则总的吸收比率是:12.1.2放射在介质中,吸收过程对沿光线的辐射亮度有减弱作用,而放射过程却有增强作用,原因是由于化学、热力学或核作用将能量转换为可见光。我们记在点p处的ω方向上单位距离上增加的出射辐射亮度为Lve(p,ω),那么有下列微分方程:dLo(p,ω)=Lve(p,ω)dt.注意这个方程基于这样的假定:即出射光Lve是不依赖于入射光Li的。在pbrt的线性光学的前提下这个假定总是成立的。12.1.3外散射(out-scattering)和消光(extinction)在参与介质中,第三个光的基本交互作用是散射。当一束光穿过一种介质中,它可以跟介质中的粒子碰撞并被反射到不同的方向上。这对光束的总辐射亮度有两个效果:它减弱了光束出离一个微分区域时的辐射亮度,因为部分光线被反射到其它方向上。这个效果被称为外散射(out-scattering),即本节要介绍的主题。然而,其它光线的辐射亮度也会被加到当前的光线的路径中,这是下一节要介绍的内散射(in-scattering)。单位距离内的外散射事件发生的概率由散射系数给σs给出。跟衰减系数类似,外散射在微分长度dt上所产生的辐射亮度减少值可以通过下列方程给出:dLo(p,ω)=−σs(p,ω)Li(p,−ω)dt由吸收和外散射所引起的总辐射亮度的减少是根据σa+σs来决定的。这个综合效果被称为衰减或消光(extinction)。为了方便起见,我们用衰减系数σt来代表两个系数之和:σt(p,ω)=σa(p,ω)+σs(p,ω)有了衰减系数以后,我们可以得到描述总衰减效果的微分方程:dLo(p,ω)/dt=−σt(p,ω)Li(p,−ω)我们通过解这个方程可以得到光束透射率(beamtransmittance),它给出了一条光线通过两个点所传输的辐射亮度的比率:其中d是点p到点p'的距离,ω是两点之间的向量的正规化向量,Tr是两点之间的光束透射率。如果表面上给定方向ω上的出射辐射亮度是Lo(p,ω),那么,通过消光作用之后,在方向ω上的入射辐射亮度是:Tr(p→p')Lo(p,ω)光束透射率有两个很有用的性质:一个点到它自身的透射率为1,即Tr(p→p)=1;在真空中对于所有点p'都有Tr(p→p')=1。另外,对于所有的介质,在光线上各点上的透射率有相乘的关系(例如下面p,p',p''三个点):Tr(p→p'')=Tr(p→p')Tr(p'→p'')这个性质对于体积散射的实现而言非常有用,因为我们可以靠计算相继点上透射率的乘积逐步地得到沿光线上的许多点上的透射率。在Tr中取负值的指数被称为两点之间的光学厚度(opticalthickness),用符号τ来表示:对于均匀介质而言,σt为常量,很容易计算出τ的积分,从而得到Beer定律:Tr(p→p')=e−σtd.11.1.4内散射(In-Scattering)外散射由于向不同方向进行散射的缘故减弱了光线的辐射亮度;与之相反的是,由于其它方向上被散射的光线加入到当前光线的方向,内散射加强了光线的辐射亮度。假定粒子之间的间距是它们半径的数倍,这样我们就可以忽略粒子之间的交互作用。在这个假定之下,相函数p(ω→ω')表示了在某点上的散射辐射(scatteredradiation)的角分布。它相当于体积上的BSDF。然而,这个比拟并不准确,因为相函数有一个归一化约束,即对于所有的ω,满足下列条件:这个约束条件意味着相函数实际上定义了在特定方向上散射的概率分布。内散射所增加的总辐射亮度可以由源项S给出,即:dLo(p,ω)=S(p,ω)dt它包括了体积放射和内散射:源项的内散射部分是单位距离内的散射概率σs和在该点上所增加的辐射亮度的乘积,所增加的辐射亮度可以通过对入射辐射亮度和相函数的乘积进行球面积分得到。注意这个公式跟第5章的散射方程很相似,主要的不同是这里没有cosine项,因为相函数使用的是辐射亮度而不是微分辐射照度(differentialirradiance)。12.2相函数人们为了描述表面上散射研究了许多BSDF模型,同样地,人们也开发了许多相函数来描述体积散射。其中包括用少数参数来做拟合函数的参数化模型,还有基于粒子形状和材质(如球形水滴)而推导出的散射辐射分布的解析模型,等等。在大多数的自然产生的介质中,相函数是关于两个方向ω和ω'的夹角θ的一维函数;这样的介质被称为各向同性的(isotropic),它们的相函数常常被写成p(cosθ)。在比较奇异的介质中,例如有水晶结构的介质,它的相函数是两个方向的4D函数。除了前面提到的归一化性质以外,自然生成的介质还有一个重要的性质,即互反性(reciprocal):两个方向相互交换后,相函数值保持不变。注意各向同性的介质的互反性很容易从cos(-θ)=cos(θ)得到。相函数本身可以是各向同性的(isotropic),也可以是各向异性的(isotropic)的。因为各向同性的相函数描述的是在各个方向上的均匀散射,因此跟两个方向都无关。因为相函数是归一化的,因此只有唯一的各向同性函数,且为常量1/4π:Pisotropic(ω→ω')=1/4πVolumeScatteringDefinitions=floatPhaseIsotropic(constVector&,constVector&){return1.f/(4.f*M_PI);}本节下面所介绍的各向异性相函数描述的是各向同性介质,因此是用两个方向的夹角来定义的(如图)。跟表面上散射的约定(两个方向都背离散射点)有所不同的是,这里入射方向是指向散射点的,而出射方向是背离散射点的,这跟相函数的约定一致。pbrt实现了描述Rayleigh散射和Mie散射的相函数。Rayleigh模型表示了在地球大气中极小粒子(如分子)所产生的散射。如果粒子半径比光波长λ小(r/λ0.05),Rayleigh模型就可以很精确地描述散射光的分布。跟波长相关的Rayleigh散射也是蓝天之所以蓝、晚霞之所以红的原因。Mie散射基于更一般性的理论:它是从Maxwell方程推导出来的,可以描述的粒子半径范围更为宽广。例如,它可以很好地描述水雾中的天气。VolumeScatteringDeclarations=floatPhaseRayleigh(constVector&w,constVector&wp);floatPhaseMieHazy(constVector&w,constVector&wp);floatPhaseMieMurky(constVector&w,constVector&wp);在计算机图形学中得到广泛应用的一个相函数是由Henyey和Greenstein开发的。这个相函数很容易和测量出的散射数据相拟合。它有一个单一的参数g(称为非对称参数),用来控制散射光的分布:pHG(cosθ)=(1/4π)(1−g2)/(1+g2−2g(cosθ))3/2下图显示了Henyey–Greenstein相函数,它具有可变的非对称参数g,变化范围是(-1,1)。负的g值对应于向后散射(back-scattering),这时光大多数会在入射方向上散射(图中的实线部分对应g=-0.35);正的g值对应于向前散射(forword-scattering)(图中的虚线部分对应g=0.67)。g的值越大,散射方向就越靠近-ω(向后散射)或ω(向前散射)方向。VolumeScatteringDefinitions+=floatPhaseHG(constVector&w,constVector&wp,floatg){floatcostheta=Dot(w,wp);return1.f/(4.f*M_PI)*(1.f-g*g)/powf(1.f+g*g-2.f*g*costheta,1.5f);}非对称参数有很严格的意义。它是相函数和ω-ω'夹角余弦的乘积的平均值。给定一个任意的相函数,可以用下式计算g:这样,对于各向同性相函数来说,g=0。满足这个方程的相函数有任意多个,单独使用g值不足以唯一地描述一个散射分布。然而。我们将复杂的散射分布化简为一个只有一个参数的模型,这样做所带来的方便比可能的精度上的缺失更重要。无法用单一的非对称参数描述的更复杂的相函数常常用相函数(如Henyey–Greenstein相函数)的加权和来表示,其中每个相函数带有不同的参数值:其中所有的wi的和为1以保证正规性。Blasi,LeSaec,和Schlick开发出了一个Henyey–Greenstein相函数的很高效的近似表示,由于它的高效性而被广泛地应用于计算机图形学领域中:pSchlick(cosθ)=(1/4π)(1−k2)/(1−kcosθ)2其中参数k跟Henyey–Greenstein中的g项有类似的作用,-1对应于向后散射,0对应于各向同性散射,1对应于向前散射。两者关系如下:k=1.55g-.55g3VolumeScatteringDefinitions+=floatPhaseSchlick(constVector&w,constVector&wp,floatg){floatk=1.55f*g-.55f*g*g*g;float
本文标题:第12章体积散射
链接地址:https://www.777doc.com/doc-2153280 .html