[OpenGL] Lambertian材质漫反射BRDF方程的解释与推导

打印 上一主题 下一主题

主题 1889|帖子 1889|积分 5667

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、简介

本文简单的介绍了 Physical Based Rendering, PBR 中的 Lambertian 材质漫反射BRDF公式                                   f                                   r                                       l                               a                               m                               b                               e                               r                               t                               i                               a                               n                                            =                                              c                                           d                                  i                                  f                                  f                                                 π                                       fr_{lambertian}=\frac{c_{diff}}{\pi}                  frlambertian​=πcdiff​​的推导。
二、漫反射项

根据 渲染方程:
                                                                                       L                                     o                                     (                                     v                                     )                                     =                                                   ∫                                        Ω                                                  f                                     r                                     (                                     l                                     ,                                     v                                     )                                     L                                     i                                     (                                     l                                     )                                     ∗                                     (                                     n                                     ⋅                                     l                                     )                                     d                                     l                                                                            (1)                                                       Lo(v) = \int_{\Omega}fr(l,v)Li(l)*(n\cdot l) dl \tag{1}                     Lo(v)=∫Ω​fr(l,v)Li(l)∗(n⋅l)dl(1)
其中的 BRDF 函数                                    f                         r                         (                         l                         ,                         v                         )                              fr(l,v)                  fr(l,v) 定义如下:
                                                                                       f                                     r                                     (                                     l                                     ,                                     v                                     )                                     =                                                   k                                        d                                                  ∗                                     f                                                   r                                                       l                                           a                                           m                                           b                                           e                                           r                                           t                                                                (                                     l                                     ,                                     v                                     )                                     +                                                   k                                        s                                                  ∗                                     f                                                   r                                                       s                                           p                                           e                                           c                                           u                                           l                                           a                                           r                                                                (                                     l                                     ,                                     v                                     )                                                                            (2)                                                       fr(l,v) = k_d * fr_{lambert}(l,v) + k_s*fr_{specular}(l,v)\tag{2}                     fr(l,v)=kd​∗frlambert​(l,v)+ks​∗frspecular​(l,v)(2)
其中                                             k                            d                                       k_d                  kd​ 为漫反射的比例,                                   f                                   r                                       l                               a                               m                               b                               e                               r                               t                                                 fr_{lambert}                  frlambert​为漫反射中的 BRDF 函数定义如下:
                                                                                       f                                                   r                                                       l                                           a                                           m                                           b                                           e                                           r                                           t                                                                =                                                                  c                                                           d                                              i                                              f                                              f                                                                     π                                                                                         (3)                                                       fr_{lambert} = \frac{c_{diff}}{\pi} \tag{3}                     frlambert​=πcdiff​​(3)
其中                                              c                                       d                               i                               f                               f                                                 c_{diff}                  cdiff​ 为形貌材质属性的漫反射颜⾊(diffuse)                                             c                                       d                               i                               f                               f                                                 c_{diff}                  cdiff​ ,大概反照率(albedo)                                    ρ                              \rho                  ρ。本文接下来介绍什么是 Lambertian 外貌,为什么 Lambertian 材质的漫反射BRDF 公式如公式(3) 所示。
1. Lambert 外貌

Lambertian 材质是指那种抱负的完全漫反射外貌,从任何观察方向看去,它反射的亮度都是一致的。即,不论外界的光照如何,Lambertian 材质满意以下公式:
                                                                                       L                                     o                                     (                                     v                                     )                                     =                                                   ∫                                        Ω                                                  f                                                   r                                                       l                                           a                                           m                                           b                                           e                                           r                                           t                                           i                                           a                                           n                                                                (                                     l                                     ,                                     v                                     )                                     (                                     n                                     ⋅                                     l                                     )                                                                           d                                     l                                     =                                     L                                                   o                                        c                                                                                         (4)                                                       Lo(v) = \int_{\Omega}fr_{lambertian}(l,v)(n\cdot l)\ dl = Lo_{c} \tag{4}                     Lo(v)=∫Ω​frlambertian​(l,v)(n⋅l) dl=Loc​(4)
不管视线向量                                    v                              v                  v 如何变革(必要保证在材质的上半球内),其出射的 radiance                                    L                         o                         (                         v                         )                              Lo(v)                  Lo(v) 恒即是定值                                    L                                   o                            c                                       Lo_{c}                  Loc​。
2. 漫反射公式解释

2.1 反照率 albedo

Lambertian BRDF 的恒定反射率通常被称为漫反射颜⾊(diffuse)                                             c                                       d                               i                               f                               f                                                 c_{diff}                  cdiff​ ,大概反照率(albedo)                                    ρ                              \rho                  ρ。反照率                                   ρ                              \rho                  ρ形貌了目标外貌反射的辐射通量                                             Φ                                       o                               u                               t                                                 \Phi_{out}                  Φout​与入射的辐射通量                                             Φ                                       i                               n                                                 \Phi_{in}                  Φin​ 之比。定义如下:
                                                                                                     c                                                       d                                           i                                           f                                           f                                                                =                                     ρ                                     =                                                                  Φ                                                           o                                              u                                              t                                                                                    Φ                                                           i                                              n                                                                                                                      (5)                                                       c_{diff} = \rho = \frac{\Phi_{out}}{\Phi_{in}} \tag{5}                     cdiff​=ρ=Φin​Φout​​(5)
2.2 能量守恒定律

根据能量守恒定理定律,应该有:
                                                                                                     c                                                       d                                           i                                           f                                           f                                                                =                                     ρ                                     =                                                                  Φ                                                           o                                              u                                              t                                                                                    Φ                                                           i                                              n                                                                               ≤                                     1.0                                                                            (6)                                                       c_{diff} = \rho = \frac{\Phi_{out}}{\Phi_{in}} \le 1.0 \tag{6}                     cdiff​=ρ=Φin​Φout​​≤1.0(6)
2.3 漫反射 BRDF 函数推导

接下来我们将基于以下假设和定义,推导得到 漫反射 BRDF 的渲染公式(3)。
2.3.1 已知信息


  • 漫反射BRDF满意渲染方程:                                        L                            o                            (                            v                            )                            =                            ∫                                       f                                           r                                               l                                     a                                     m                                     b                                     e                                     r                                     t                                     i                                     a                                     n                                                      (                               l                               ,                               v                               )                               ∗                               L                               i                               (                               l                               )                               ∗                               (                               n                               ⋅                               l                               )                                                               d                               l                                            Lo(v)=\int{fr_{lambertian}(l,v)*Li(l)*(n\cdot l)\ dl}                     Lo(v)=∫frlambertian​(l,v)∗Li(l)∗(n⋅l) dl。
  • 对于 Lambertian 材质,                                        f                                       r                                           l                                  a                                  m                                  b                                  e                                  r                                  t                                  i                                  a                                  n                                                 (                            l                            ,                            v                            )                                  fr_{lambertian}(l,v)                     frlambertian​(l,v) 与                                         v                                  v                     v 和                                         l                                  l                     l 无关,即                                         f                                       r                                           l                                  a                                  m                                  b                                  e                                  r                                  t                                  i                                  a                                  n                                                 (                            l                            ,                            v                            )                                  fr_{lambertian}(l,v)                     frlambertian​(l,v) 是定值                                         f                                       r                               c                                            fr_{c}                     frc​ 。那么根据渲染方程,不管如何光照                                         L                            i                            (                            l                            )                                  Li(l)                     Li(l) 如何分布,恣意出射方向的                                         L                            o                            (                            v                            )                                  Lo(v)                     Lo(v) 也都相称。
  • 对于 Lambertian 材质,假设其没有自发光,满意能量守恒定理,即:                                                   c                                           d                                  i                                  f                                  f                                                 =                            ρ                            =                                                   Φ                                               o                                     u                                     t                                                                  Φ                                               i                                     n                                                             ≤                            1.0                                  c_{diff} = \rho = \frac{\Phi_{out}}{\Phi_{in}} \le 1.0                     cdiff​=ρ=Φin​Φout​​≤1.0。
  • 目标外貌的入射/出射辐射通量/功率(Radiant flux/Power)                                                    Φ                                           i                                  n                                                       \Phi_{in}                     Φin​、                                                   Φ                                           o                                  u                                  t                                                       \Phi_{out}                     Φout​ 的计算公式如下:
                                                              Φ                                               i                                     n                                     t                                                      =                                           ∫                                  Ω                                          L                               i                               (                               l                               )                               ∗                               (                               n                               ⋅                               l                               )                               d                               l                                                               d                               A                                                     Φ                                               o                                     u                                     t                                                      =                                           ∫                                  Ω                                          L                               o                               (                               v                               )                               ∗                               (                               n                               ⋅                               v                               )                               d                               v                                                               d                               A                                      \Phi_{int} = \int_{\Omega} Li(l)*(n\cdot l) dl\ dA \\ \Phi_{out} = \int_{\Omega} Lo(v)*(n\cdot v) dv\ dA                        Φint​=∫Ω​Li(l)∗(n⋅l)dl dAΦout​=∫Ω​Lo(v)∗(n⋅v)dv dA
  • 假设目标外貌为 Lambertian 材质,即只有漫反射,没有镜面反射也没有自发光。
  • 假设目标外貌的面积为                                         A                                  A                     A。
  • 假设目标外貌的漫反射颜色(反照率)为                                                    c                                           d                                  i                                  f                                  f                                                       c_{diff}                     cdiff​,即                                                    c                                           d                                  i                                  f                                  f                                                 =                                                   Φ                                               o                                     u                                     t                                                                  Φ                                               i                                     n                                                                   c_{diff} = \frac{\Phi_{out}}{\Phi_{in}}                     cdiff​=Φin​Φout​​。
接下来本文将根据以上已知信息推导目标 BRDF 函数                                    f                                   r                                       l                               a                               m                               b                               e                               r                               t                               i                               a                               n                                            (                         l                         ,                         v                         )                         =                         f                                   r                            c                                  =                         ?                              fr_{lambertian}(l,v)=fr_{c}=?                  frlambertian​(l,v)=frc​=?:
2.3.2 推导过程

根据辐射通量/功率(Radiant flux/Power)                                   Φ                              \Phi                  Φ 的计算公式
                                         Φ                            =                                       ∫                               Ω                                      L                            (                            w                            )                            ∗                            (                            n                            ⋅                            w                            )                            d                            w                                                         d                            A                                  \Phi = \int_{\Omega} L(w)*(n\cdot w) dw\ dA                     Φ=∫Ω​L(w)∗(n⋅w)dw dA
可以得到目标外貌的总出射辐射通量                                              Φ                                       o                               u                               t                                                 \Phi_{out}                  Φout​ 为
                                                    Φ                                           o                                  u                                  t                                                 =                                       ∫                               Ω                                      L                            o                            (                            v                            )                            ∗                            (                            n                            ⋅                            v                            )                            d                            v                                                         d                            A                                     =                                       ∫                               0                                           2                                  π                                                            ∫                               0                                           π                                  /                                  2                                                 L                            o                            (                            v                            )                            ∗                            c                            o                            s                            (                            θ                            )                            ∗                            s                            i                            n                            (                            θ                            )                            d                            θ                            d                            ϕ                                                         d                            A                                  \Phi_{out} = \int_{\Omega} Lo(v)*(n\cdot v) dv\ dA \\ = \int_{0}^{2\pi} \int_{0}^{\pi/2} Lo(v)*cos(\theta)*sin(\theta) d{\theta}d{\phi}\ dA                     Φout​=∫Ω​Lo(v)∗(n⋅v)dv dA=∫02π​∫0π/2​Lo(v)∗cos(θ)∗sin(θ)dθdϕ dA
又因为对于 Lambertian 材质,恣意出射方向的                                    L                         o                         (                         v                         )                              Lo(v)                  Lo(v) 都相称,并且目标外貌的面积为                                    A                              A                  A,因此有:
                                                                                                     Φ                                                       o                                           u                                           t                                                                =                                                   ∫                                        0                                                       2                                           π                                                                              ∫                                        0                                                       π                                           /                                           2                                                                L                                     o                                     (                                     v                                     )                                     ∗                                     c                                     o                                     s                                     (                                     θ                                     )                                     ∗                                     s                                     i                                     n                                     (                                     θ                                     )                                                                           d                                     θ                                     d                                     ϕ                                                                           d                                     A                                                 =                                                   ∫                                        0                                                       2                                           π                                                                              ∫                                        0                                                       π                                           /                                           2                                                                L                                                   o                                        c                                                  ∗                                     c                                     o                                     s                                     (                                     θ                                     )                                     ∗                                     s                                     i                                     n                                     (                                     θ                                     )                                                                           d                                     θ                                                                           d                                     ϕ                                                                           d                                     A                                                 =                                     L                                                   o                                        c                                                  ∗                                                   ∫                                        0                                                       2                                           π                                                                              ∫                                        0                                                       π                                           /                                           2                                                                c                                     o                                     s                                     (                                     θ                                     )                                     ∗                                     s                                     i                                     n                                     (                                     θ                                     )                                                                           d                                     θ                                                                           d                                     ϕ                                                                           ∗                                     A                                                 =                                     L                                                   o                                        c                                                  ∗                                     π                                     ∗                                     A                                                                            (7)                                                       \Phi_{out} = \int_{0}^{2\pi} \int_{0}^{\pi/2} Lo(v)*cos(\theta)*sin(\theta)\ d{\theta}d{\phi}\ dA \\ = \int_{0}^{2\pi} \int_{0}^{\pi/2} Lo_{c}*cos(\theta)*sin(\theta)\ d{\theta}\ d{\phi}\ dA \\ = Lo_{c} * \int_{0}^{2\pi} \int_{0}^{\pi/2} cos(\theta)*sin(\theta)\ d{\theta}\ d{\phi}\ * A \\ = Lo_{c}*\pi*A \tag{7}                     Φout​=∫02π​∫0π/2​Lo(v)∗cos(θ)∗sin(θ) dθdϕ dA=∫02π​∫0π/2​Loc​∗cos(θ)∗sin(θ) dθ dϕ dA=Loc​∗∫02π​∫0π/2​cos(θ)∗sin(θ) dθ dϕ ∗A=Loc​∗π∗A(7)
那么
                                                                                       L                                                   o                                        c                                                  =                                                                  Φ                                                           o                                              u                                              t                                                                                    π                                           ∗                                           A                                                                                                       (8)                                                       Lo_{c} = \frac{\Phi_{out}}{\pi*A} \tag{8}                     Loc​=π∗AΦout​​(8)
同理可以得到目标外貌的总入射辐射通量                                             Φ                                       i                               n                                                 \Phi_{in}                  Φin​为:
                                                                                                     Φ                                                       i                                           n                                                                =                                                   ∫                                        Ω                                                  L                                     i                                     (                                     l                                     )                                     ∗                                     (                                     n                                     ⋅                                     l                                     )                                                                           d                                     l                                                                           d                                     A                                                 =                                                   ∫                                        Ω                                                  L                                     i                                     (                                     l                                     )                                     ∗                                     (                                     n                                     ⋅                                     l                                     )                                                                           d                                     l                                     ∗                                     A                                                                            (9)                                                       \Phi_{in} = \int_{\Omega} Li(l)*(n\cdot l)\ dl\ dA \\ = \int_{\Omega} Li(l)*(n\cdot l)\ dl * A \tag{9}                     Φin​=∫Ω​Li(l)∗(n⋅l) dl dA=∫Ω​Li(l)∗(n⋅l) dl∗A(9)
那么就有:
                                                                                                                    Φ                                                           i                                              n                                                                     A                                                  =                                                   ∫                                        Ω                                                  L                                     i                                     (                                     l                                     )                                     ∗                                     (                                     n                                     ⋅                                     l                                     )                                                                           d                                     l                                                                            (10)                                                       \frac{\Phi_{in}}{A} = \int_{\Omega} Li(l)*(n\cdot l)\ dl \tag{10}                     AΦin​​=∫Ω​Li(l)∗(n⋅l) dl(10)
根据渲染方程,我们可以得到:
                                         L                                       o                               c                                      =                            L                            o                            (                            v                            )                            =                                       ∫                               Ω                                      f                                       r                                           l                                  a                                  m                                  b                                  e                                  r                                  t                                  i                                  a                                  n                                                 (                            l                            ,                            v                            )                            ∗                            L                            i                            (                            l                            )                            ∗                            (                            n                            ⋅                            l                            )                                                         d                            l                                  Lo_{c} = Lo(v) = \int_{\Omega} fr_{lambertian}(l,v)*Li(l)*(n\cdot l)\ dl                     Loc​=Lo(v)=∫Ω​frlambertian​(l,v)∗Li(l)∗(n⋅l) dl
因为                                    f                                   r                                       l                               a                               m                               b                               e                               r                               t                               i                               a                               n                                            (                         l                         ,                         v                         )                              fr_{lambertian}(l,v)                  frlambertian​(l,v) 为定值                                    f                                   r                            c                                       fr_{c}                  frc​ ,那么就有:
                                                                                       L                                                   o                                        c                                                  =                                     L                                     o                                     (                                     v                                     )                                     =                                                   ∫                                        Ω                                                  f                                                   r                                                       l                                           a                                           m                                           b                                           e                                           r                                           t                                           i                                           a                                           n                                                                (                                     l                                     ,                                     v                                     )                                     ∗                                     L                                     i                                     (                                     l                                     )                                     ∗                                     (                                     n                                     ⋅                                     l                                     )                                                                           d                                     l                                                 =                                     f                                                   r                                        c                                                  ∗                                                   ∫                                        Ω                                                  L                                     i                                     (                                     l                                     )                                     ∗                                     (                                     n                                     ⋅                                     l                                     )                                                                           d                                     l                                                                            (11)                                                       Lo_{c} = Lo(v) = \int_{\Omega} fr_{lambertian}(l,v)*Li(l)*(n\cdot l)\ dl \\ = fr_c * \int_{\Omega} Li(l)*(n\cdot l)\ dl \tag{11}                     Loc​=Lo(v)=∫Ω​frlambertian​(l,v)∗Li(l)∗(n⋅l) dl=frc​∗∫Ω​Li(l)∗(n⋅l) dl(11)
将公式(10)代入公式(11)可以得到:
                                                                                       L                                                   o                                        c                                                  =                                     L                                     o                                     (                                     v                                     )                                     =                                     f                                                   r                                        c                                                  ∗                                                   ∫                                        Ω                                                  L                                     i                                     (                                     l                                     )                                     ∗                                     (                                     n                                     ⋅                                     l                                     )                                                                           d                                     l                                                 =                                     f                                                   r                                        c                                                  ∗                                                                  Φ                                                           i                                              n                                                                     A                                                                                         (12)                                                       Lo_{c} = Lo(v) = fr_c * \int_{\Omega} Li(l)*(n\cdot l)\ dl \\ = fr_c * \frac{\Phi_{in}}{A} \tag{12}                     Loc​=Lo(v)=frc​∗∫Ω​Li(l)∗(n⋅l) dl=frc​∗AΦin​​(12)
又因为根据公式(8),                                   L                                   o                            c                                  =                                   Φ                                       o                               u                               t                                            /                                   (                            π                            ∗                            A                            )                                       Lo_{c} = \Phi_{out}/{(\pi*A)}                  Loc​=Φout​/(π∗A),那么
                                                                                       L                                                   o                                        c                                                  =                                     f                                                   r                                        c                                                  ∗                                                                  Φ                                                           i                                              n                                                                     A                                                  =                                                                  Φ                                                           o                                              u                                              t                                                                                    π                                           ∗                                           A                                                                                                       (13)                                                       Lo_c = fr_c * \frac{\Phi_{in}}{A} = \frac{\Phi_{out}}{\pi*A} \tag{13}                     Loc​=frc​∗AΦin​​=π∗AΦout​​(13)
又因为                                             c                                       d                               i                               f                               f                                            =                                   Φ                                       o                               u                               t                                            /                                   Φ                                       i                               n                                                 c_{diff} = \Phi_{out}/\Phi_{in}                  cdiff​=Φout​/Φin​,那么可以得到:
                                                                                       f                                                   r                                        c                                                  =                                                                  Φ                                                           o                                              u                                              t                                                                                    π                                           ∗                                                           Φ                                                               i                                                 n                                                                                               =                                                                  c                                                           d                                              i                                              f                                              f                                                                     π                                                                                         (14)                                                       fr_c = \frac{\Phi_{out}}{\pi*\Phi_{in}} = \frac{c_{diff}}{\pi} \tag{14}                     frc​=π∗Φin​Φout​​=πcdiff​​(14)
即:
                                                                                       f                                                   r                                                       L                                           a                                           m                                           b                                           e                                           r                                           t                                           i                                           a                                           n                                                                (                                     l                                     ,                                     v                                     )                                     =                                     f                                                   r                                        c                                                  =                                                                  Φ                                                           o                                              u                                              t                                                                                    π                                           ∗                                                           Φ                                                               i                                                 n                                                                                               =                                                                  c                                                           d                                              i                                              f                                              f                                                                     π                                                                                         (14)                                                       fr_{Lambertian}(l,v) = fr_c = \frac{\Phi_{out}}{\pi*\Phi_{in}} = \frac{c_{diff}}{\pi} \tag{14}                     frLambertian​(l,v)=frc​=π∗Φin​Φout​​=πcdiff​​(14)
至此,我们得到了 Lambertian 材质的 漫反射 BRDF 公式                                    f                                   r                                       l                               a                               m                               b                               e                               r                               t                               i                               a                               n                                            (                         l                         ,                         v                         )                         =                                              c                                           d                                  i                                  f                                  f                                                 π                                       fr_{lambertian}(l,v)=\frac{c_{diff}}{\pi}                  frlambertian​(l,v)=πcdiff​​.
三、参考引用

[1].Real-Time Rendering, 4th Edition-Chapter 9 Physically Based Shading
[2].Background: Physics and Math of Shading

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表