用于软阴影的球面光源

时间:2012-12-09 07:28:16

标签: c++ graphics geometry raytracing

我正在尝试在我的光线跟踪器中实现柔和阴影。为此,我计划从交叉点向区域光源拍摄多条阴影光线。我的目标是使用球形区域光 - 这意味着我需要在球体上为我的光线的方向矢量生成随机点(回想一下,光线是用原点和方向指定的)。

我四处寻找在球体上生成随机点均匀分布的方法,但它们看起来比我正在寻找的要复杂一些。有谁知道在球体上生成这些点的任何方法?我相信我的球面光源将简单地由其XYZ世界坐标,RGB颜色值和r半径定义。

我从 Graphics Gems III ,第126页引用了这段代码(这也是所讨论的方法herehere):

void random_unit_vector(double v[3]) {    
double theta = random_double(2.0 * PI);
double x = random_double(2.0) - 1.0;
double s = sqrt(1.0 - x * x);
v[0] = x;
v[1] = s * cos(theta);
v[2] = s * sin(theta);

}

这很好,我理解这一点,但是我的球体光源将位于由3D X-Y-Z坐标和半径指定的空间中的某个点。我知道该公式适用于单位球体,但我不确定该公式如何解释球体的位置。

谢谢,我感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你似乎混淆了生成方向的公式 - 即,球体上的一个点 - 以及你试图生成一个方向/朝向/一个球体的事实。

您给出的公式均匀地采样随机射线:它在单位球上找到X,Y,Z三元组,可以将其视为方向。

你真正想要达到的目的是仍然生成一个方向(球体上的一个点),但是它有利于指向球体的特定方向(或者限制为圆锥体:从中心获得的锥体)您的相机和球体光源的轮廓)。 这样的事情可以通过两种方式完成:

  • 使用余弦波瓣对球面光源中心进行重要采样。
  • 上面定义的锥形中的均匀采样。

在第一种情况下,公式在“Global Illumination COmpendium”中给出: http://people.cs.kuleuven.be/~philip.dutre/GI/TotalCompendium.pdf (第38页第21页).. 在第二种情况下,你可以做一些拒绝抽样,但我很确定有一些紧密的形式公式。

最后,有一个最后一个选项:您可以使用您的公式,将结果(X,Y,Z)视为场景中的一个点,从而将其转换为球体的位置,并使向量指向从你的相机到它。但是,它会带来严重的问题:

  • 您将在球体光源背面生成矢量
  • 您将无法获得生成的一组路线的pdf公式,以便稍后进行Monter Carlo集成。