dfaf吧 关注:14贴子:208
  • 9回复贴,共1

【转】PBRT阅读:辐射度学

只看楼主收藏回复

原文转自opengpu论坛


1楼2012-11-17 16:46回复
    辐射度学提供了描述光的传播和反射的基本理论和数学工具。它也是本书所用到的渲染算法的基础。有趣的是,辐射度学并不起源于物理光学的基本原理,而是建立 在关于光在空间中做粒子性传播的一种抽象之上。所以,诸如光的偏振等现象就不在此理论框架的讨论范围之内。然而,辐射度学和麦克斯韦方程有相应的联系,使 得辐射度学也具备了很坚实的物理基础。
    辐射传输(Radiative transfer)理论是对辐射能传输的现象学研究。它是基于辐射度学中的原理并且是操作在几何光学的层面上的,在该层面上,光的宏观性质足以用来描述光 跟远大于光波长的物体的交互作用。虽然它也常常涉及到光的波动理论模型所描述的现象,但是这些结果需要用辐射传输理论的语言来描述。利用这种方式,我们就 可以描述光跟尺寸接近于光波长的物体之间的交互作用,从而能够描述诸如光的色散和干涉现象。更近一步地,描述光和原子的交互作用就要用到量子力学。幸运地 是,解决计算机图形学中的渲染问题还没有必要劳驾量子力学。
    在pbrt中,我们假定用来描述光和光散射的几何光学模型已经足够用了。这就需要我们有下面几个关于光的行为的基本假设:
    · 线性:两个对光学系统的输入所产生的合成效果总是等于两个单独的输入的效果之和。
    · 能量守恒:当光从表面或参与介质上产生散射现象时,这些散射现象不会产生更多的能量。
    · 无偏振现象:我们忽略电磁场的偏振现象,因此,光的性质只跟波长的分布(或频率)有关。
    · 无荧光或磷光现象:光在某一波长上的行为完全独立于在另一个波长上的行为。跟偏振现象一样,加上这些效果并不难,但是对整个系统的实际意义不大。
    · 稳定态:我们假定环境中的光已经达到平衡状态,所以它的辐射分布不会随时间的变化而变化。实际场景中的光也几乎是如此的,故不能算成一个实际限制。注意磷光现象就违背了这条假定。
    采用几何光学模型的最大缺失是很难解释光的衍射现象和干涉现象。就象Preisendorfor(1965)所说的,这是一个难题,例如,在出现光的衍射或干涉的情况下,两个面积上的总辐射通量并不一定等于两个单独面积上的辐射通量之和。


    2楼2012-11-17 16:47
    回复
      辐射亮度(Radiance)
      现在介绍最后一个也是最重要的辐射度学中的量值,辐射亮度,L。辐射亮度是单位面积单位立体角的辐射通量密度,即:
      L = d Φ / dω dAproj
      其中dAproj是面积dA在垂直于ω的假想表面上的投影面积(如图)。因此,它是当入射光方向上相关的dω趋向极小且表面上相关的局部面积dA趋向极小时测量入射光在表面上的极限值。

      在所介绍的这些辐射量定义中,辐射亮度是本书最常用的。其中一个直接的原因是因为它是最基本的辐射量;只要给定辐射亮度,所有其它的量都可以通过求面积和方向上的积分而得到。辐射亮度的另一个良好的性质是它通过空的空间区域时保持不变。这对光线追踪的计算非常便利。


      6楼2012-11-17 16:51
      回复
        5.2.2 入射光和出射光的辐射亮度函数
        当我们讨论某个环境中某个点上的辐射亮度并写关于辐射亮度的方程时,有必要区别开到达某个点上的辐射亮度(例如,光源所引起的照明)和离开那个点的辐射亮度(例如,表面上的反射)。在pbrt中,我们用入射光和出射光的辐射亮度函数来区别这两种情况。
        我们考虑物体上的一个点P。到达该点上的入射光的辐射亮度分布可以用一个关于位置和方向的函数来描述,我们记之为Li(P, ω)。我们把出射光的辐射亮度的函数记为Lo(P, ω)。注意在这两种情况下ω的方向是背离点P的,有些作者使用使用另一种记法使得两个函数中的ω正好相反(Li中的ω方向指向P)。

        应该注意,通常情况下,Li(P, ω)不等于Lo(P, ω)。
        另一个需要记住的性质是,在没有表面也没有引起散射的参与介质的空间中,对于点P有下列关系:
        Lo(P, ω) = Li(P, -ω)。


        7楼2012-11-17 16:52
        回复
          5.3 使用辐射度积分
          在渲染过程中最常见的任务之一就是求辐射度积分。在本节中,我们要介绍一些简化这一任务的技巧。为了讲明白这些技术,我们以计算某点上的辐射照度值为例。设在点P上的法向量为n,在方向**Ω上的辐射亮度所引起的在该点的辐射照度是:

          其中Li(P, ω) 是入射光的辐射亮度函数,积分中的cosθ项来自辐射亮度定义中的dAproj项。θ是方向ω和法向量n的夹角。我们通常对给定法向量n所对应的半球面的方向**求积分来计算出辐射照度(如图)。


          8楼2012-11-17 16:53
          回复
            5.3.1 投影立体角(projected solid angle)上的积分
            积分式中的余弦项是可变项,不利于积分的意义的表达。为了避免这个问题,我们可以用立体投射角(而不是立体角)来测量积分所对应的面积。跟立体角一样,能 涵盖物体的投影立体角是由物体到单位球面上的投影来决定的,但是还要近一步地把投影结果再在投影到单位圆盘上(如图)。因此,可以等价地把对半球上的方向 积分写成对投影立体角的积分。

            投影立体角测度跟立体角测度的关系如下:

            因此,由辐射亮度求半球上的辐射照度的积分的公式可以简化为:


            9楼2012-11-17 16:55
            回复
              5.3.2 球面坐标上的积分
              为了方便起见,我们常常把立体角上的积分转换为球面坐标(θ,Φ)上的积分。回顾一下方向向量(x,y,z)和球面参数角的关系如下:
              x = sin θ cos Φ
              y = sin θ sin Φ
              z = cos θ
              为了把立体角上的积分转换为球面坐标(θ,Φ)上的积分,我们需要表达方向集dω的微分面积跟(θ,Φ)坐标对的微分面积的关系(如图)。dω的微分面积等于它的微分边长sinθ dΦ和dθ的乘积。因此:
              dω = sin θ dθ dΦ

              这样我们可以把半球上的辐射照度的积分公式改写为:

              如果在所有方向上的辐射亮度相同,那么上式就简化为 E = π Li。
              跟利用入射光的辐射亮度求辐射照度的方法类似,我们也可以计算物体表面积A上的围绕法向量的半球面的总辐射通量:

              为方便起见,我们定义两个把θ和 Φ转换为(x,y,z)方向向量的函数。第一个函数实现了前面所给出的公式。注意函数的参数是θ的sine和cosine值(而不是θ本身)。这是因为调用者通常已经有了这两个三角函数值。而对Φ而言却不是如此,所以要直接传入Φ值。
              <Geometry Inline Functions> +=
              inline Vector SphericalDirection(float sintheta, float costheta, float phi) {
              return Vector(sintheta * cosf(phi),
              sintheta * sinf(phi),
              costheta);
              }
              第二个函数利用所传入的代表x,y,z轴的基向量, 返回在这三个轴对应的坐标系下的方向向量。
              <Geometry Inline Functions> +=
              inline Vector SphericalDirection(float sintheta, float costheta, float phi,
              const Vector &x, const Vector &y,
              const Vector &z) {
              return sintheta * cosf(phi) * x +
              sintheta * sinf(phi) * y + costheta * z;
              }
              由方向(x,y,z)求两个球面参数角的公式为:
              θ = arccos z
              Φ = arctan ( y / x)
              相应的函数实现如下,其中所传入的向量v已经被正规化了:
              <Geometry Inline Functions> +=
              inline float SphericalTheta(const Vector &v) {
              return acosf(v.z);
              }
              <Geometry Inline Functions> +=
              inline float SphericalPhi(const Vector &v) {
              float p = atan2f(v.y, v.x);
              return (p < 0.f) ? p + 2.f * M_PI : p;
              }


              10楼2012-11-17 16:57
              回复

                5.3.3 面积上的积分
                另一个能够简化计算的转换积分方法是把对方向的积分转换为对面积的积分。考虑本节开始介绍的辐射照度积分公式,假设有一个具有恒定光辐射的四边形,我们需 要计算在点P上的辐射照度。用方向上的积分计算这个值并不容易,因为给定一个方向,我们难以确定这个四边形在这个方向上是否可见。但是,在四边形的面积上 求辐射照度积分就容易多了。
                微分面积跟微分立体角(从点P的方向来看)的关系如下:
                dω = (dA cos θ) / r2
                其中,θ是dA的法向量跟P到dA的向量的夹角, r是P到dA的距离。我们不在这里推导这个公式了,我们可以对它有直观上的理解:如果dA跟P的距离为1,并跟方向dω正好垂直,则dω = dA, θ = 0, 显然上式成立。如果dA远离开P,或者把四边形倾斜使它不再跟dω垂直,r2和cos θ都可以使dω减小。

                因此,我们把四边形光源的辐射照度积分公式写为:

                其中L是四边形的表面所发射出的辐射亮度,θi是在点P的法向量跟P到光源上P'的方向向量的夹角。θo是p'在光源上的法向量跟P'到P的方向向量的夹角。


                11楼2012-11-17 16:59
                回复
                  5.4 表面反射和BRDF
                  当光线入射到表面上,表面就会对光产生散射,把其中一部分光反射回环境中。对这种反射,我们要描述两个主要的效果:反射光的光谱分布(spectral distrbution)和它的方向分布(directional distribution)。例如,柠檬皮吸收了绝大部分的蓝光波段的光,而反射了红光波段和绿光波段的光。因此,当用白光照射它时,它的颜色呈黄色。不 管从那个方向观察柠檬皮,它基本上保持同一颜色,虽然有些方向上可以看到高光(白色多于黄色的区域)。相反地,一面镜子所反射出的光几乎完全依赖于观察方 向。对于镜子上的一个固定的点,当观察角度改变时,镜子所反射的物体也跟着改变。
                  双向反射分布函数(bidirectional reflectance distribution function, BRDF)是一个正规地表述这类反射的核心概念。如图,给定方向ωi上的入射光辐射亮度Li(p, ωi),我们想知道在朝向观察者的方向ωo上有多少的辐射亮度离开表面,即Lo(p, ωo)。

                  如果我们把方向ωi看作关于方向的微分圆锥(a differential cone of directions),那么在P点的微分辐射照度是:
                  dE(p, ωi) = Li(p, ωi) cos θi dωi
                  因这个辐射照度而产生的ωo方向上的微分辐射亮度dLo(p, ωo)跟微分辐射照度dE(p, ωi)成正比例, 这个比例常数就定义了表面的关于给定方向对(ωi, ωo)的BRDF:
                  fr(p, ωi, ωo) = dLo(p, ωo) / dE(p, ωi) = dLo(p, ωo) / Li(p, ωi) cos θi dωi
                  基于物理的BRDF有如下两个性质:
                  1. 互逆性: 对于所有的方向对(ωi, ωo), 有fr(p, ωi, ωo) = fr(p, ωo, ωi) 。
                  2. 能量守恒: 反射光的所有能量小于或等于入射光的能量。
                  表面的双向透射分布函数(BTDF)表述透射光的分布,它的定义跟BRDF类似,记为ft(p, ωi, ωo)。有趣的是,BTDF并不遵守互逆性原则。(见第9.2节)。
                  为了方便,我们把BRDF和BTDF统一记为f(p, ωi, ωo);并称之为双向散射分布函数(bidirectional scattering distribution function, BSDF)。 利用BSDF的定义,我们有:
                  dLo(p, ωo) = f (p, ωi, ωo) Li(p, ωi) |cos θi| dωi
                  这里把cos θi加上取绝对值符号,这是因为pbrt并不把法向量改为反方向使其跟ωi在表面的同一侧。因为我们保证法向量总是指向表面的外面,取绝对值是为了保证计算的正确性。
                  我们对上式取围绕点P的入射方向球面上的积分,在方向ωo上的散射出的辐射亮度为:

                  这就是基本的渲染方程。它基于表面的散射性质,描述了在某一点上的入射光分布如何被转换为光的散射分布。当对整个球面进行积分时,称之为散射方程。当对半球面进行积分时,称之为反射方程。第16章所介绍的积分例程的核心任务之一求这个场景中表面上的点的积分。


                  12楼2012-11-17 17:00
                  回复
                    ==============================完====================================


                    13楼2012-11-17 19:03
                    回复