【问题标题】:Spherical Area Light Source for Soft Shadows用于软阴影的球面光源
【发布时间】:2012-12-09 07:28:15
【问题描述】:

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

我一直在寻找在球体上生成均匀分布的随机点的方法,但它们似乎比我正在寻找的要复杂一些。有谁知道在球体上生成这些点的任何方法?我相信我的球面光源将简单地由它的 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 坐标和半径指定的空间中的某个点。我知道该公式适用于单位球体,但我不确定该公式如何解释球体的位置。

谢谢,感谢您的帮助!

【问题讨论】:

    标签: c++ graphics geometry raytracing


    【解决方案1】:

    您似乎混淆了生成方向的公式 - 即球体上的点 - 以及您试图生成方向 /toward/ 球体的事实。

    你给的公式均匀地采样一条随机射线:它在单位球面上找到一个 X,Y,Z 三元组,可以认为是一个方向。

    您实际尝试实现的是仍然生成一个方向(球体上的一个点),但它有利于指向一个球体的特定方向(或仅限于一个锥体:从中心获得的锥体您的相机和球体光源的轮廓)。 这样的事情可以通过两种方式完成:

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

    在第一种情况下,公式在“全局照明汇编”中给出: http://people.cs.kuleuven.be/~philip.dutre/GI/TotalCompendium.pdf (第 38 页第 21 页).. 在第二种情况下,您可以进行一些拒绝抽样,但我很确定有一些近似公式。

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

    • 您将生成朝向球体光背面的矢量
    • 对于生成的方向集的 pdf,您将没有任何公式,您将在以后的蒙特卡洛积分中需要这些公式。

    【讨论】:

    • 谢谢你,这是一个非常明确的回应——我想我确实混淆了我想要做什么。尽管您提供的资源看起来很有帮助,但我正在考虑使用其他光源,例如矩形。看起来这实现起来要简单得多,是吗?我只需要生成两个随机变量来指定矩形上的一个点以将光线射向,对吗?你会碰巧知道这方面的任何资源吗?再次感谢!
    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    相关资源
    最近更新 更多