zoukankan      html  css  js  c++  java
  • Cosine-Weighted采样算法

    Cosine-Weighted是一种对球面进行采样的算法,常用于路径追踪时对入射方向进行采样等领域。在介绍该算法之前,我们先来复习一下概率论的知识。

    随机变量之间PDF的转换

    假设有两个随机变量X和Y,它们的PDF为(p_x(x))(p_y(y)),假设我们已知(p_x(x))以及Y=f(X),我们该如何推出(p_y)呢?PBRT第13.5小节中给出了推导关系:
    (LARGE p_y(y)=|frac{df}{dx}^{-1}| p_x(x))
    当然前提必须是X和Y是一一对应的转换关系,且(frac{df}{dx})不能小于0。
    举个例子,假设Y=sinX,X采样在[0,1],且(p_x(x)=2x),那么可得:
    (LARGE p_y(y)=frac{2x}{cosx}=frac{2arcsin y}{sqrt{1-y^2}})

    那么如果X和Y是多维的又该如何处理呢?假设X是n维的向量,其中Y=T(X),且T是双射,那么他们之间的PDF关系如下:

    (LARGE p_y(y)=frac{p_x(x)}{|J_T(x)|})

    其中(J_T(x))是T关于X的雅克比矩阵

    另外,我们在之前的文章中曾经得到:

    (LARGE d{omega}=sin{ heta}d{ heta}d{phi})

    那么,在围绕球面采样时,因为:

    (LARGE int p( heta, phi)d heta dphi = int p(omega)domega)

    所以:

    (LARGE p( heta, phi) = sin heta p(omega))

    对球面的采样

    当我们获得了一个顶点和它的法向,想去采样得到一个方向时,一般来说有两种针对球面的采样方式:均匀采样方法和Cosine-Weighted采样方法。
    均匀采样方法是对球坐标系中的( heta)(phi)随机采样,理论上所有的方向被采样到的概率都是一样的,均匀采样的PDF c 可以简单计算出:

    除此之外,我们还可以使用Cosine-Weighted算法来进行采样。
    Cosine-Weighted采样指的是立体角方向与竖直方向夹角的余弦值越高,那么该立体角被采样得到的概率就越大的一种采样方式。
    我们设(p(omega)=c⋅cos heta)其中c是常数。
    那么我们可以推导出:

    因此(large p(omega)=frac{cos heta}{pi}),那么(large p( heta, phi)=frac{sin heta cos heta}{pi})

    得到了概率密度函数后,就可以据此进行采样了。
    具体的采样方法其实也非常简单:在顶点所属半球面的截面圆处随机采样一个顶点,然后把它投影到球面上,得到的必然是符合Cosine-Weighted分布的采样:

    如何证明这一点呢?在二维圆面上采样可以获得:(large p(r,phi)=frac{r}{pi})(这个概率密度函数的计算可以见这篇文章中的圆面采样),不难发现 sinθ = r,那么我们可以尝试推导从(p(r, phi))(p( heta, phi))之间的转换关系。
    也就是(large (r,phi)=(sin heta, phi) → ( heta, phi)),由此可得雅克比矩阵:

    因此:
    (LARGE p( heta, phi)=|J_T|p(r, phi)=cos heta frac{r}{pi}=frac{cos heta sin heta}{pi})
    可以看到和我们前面推导出的(large p( heta, phi))是一模一样的。因此用这种方法采样肯定可以得到符合Cosine-Weighted分布的方向!

  • 相关阅读:
    java使用jsp servlet来防止csrf 攻击的实现方法
    Fiddler抓包6-get请求(url详解)
    Fiddler抓包5-接口测试(Composer)
    Fiddler抓包4-工具介绍(request和response)
    Fiddler抓包3-查看get与post请求
    Selenium2+python自动化60-异常后截图(screenshot)
    Selenium2+python自动化59-数据驱动(ddt)
    Selenium2+python自动化58-读取Excel数据(xlrd)
    Selenium2+python自动化57-捕获异常(NoSuchElementException)
    Selenium2+python自动化56-unittest之断言(assert)
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/13442367.html
Copyright © 2011-2022 走看看