我正在尝试在光线跟踪器中实现软阴影。为此,我计划从交点向区域光源发射多条阴影光线。我的目标是使用球形区域光——这意味着我需要在球体上为光线的方向向量生成随机点(回想一下,光线是用原点和方向指定的)。
我四处寻找在球体上生成随机点均匀分布的方法,但它们似乎比我想要的要复杂一些。有人知道在球体上生成这些点的方法吗?我相信我的球体区域光源将简单地由其XYZ世界坐标、RGB颜色值和r半径来定义。
我参考了Graphics Gems III第126页的这段代码(这也是这里和这里讨论的相同方法):
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);
}
这很好,我理解这一点,但我的球体光源将位于由三维X-Y-Z坐标和半径指定的空间中的某个点。我知道这个公式适用于单位球体,但我不确定这个公式是如何解释球体的位置的。
谢谢,我很感激你的帮助!
您似乎混淆了生成方向(即球体上的点)的公式,以及试图生成方向/朝向/球体的事实。
你给出的公式对随机射线进行了均匀采样:它在单位球体上找到了一个X、Y、Z三元组,这可以被视为一个方向。
你实际上试图实现的是仍然生成一个方向(球体上的一个点),但它倾向于指向球体的特定方向(或仅限于圆锥体:从相机中心获得的圆锥体和球体光源的轮廓)。这样的事情可以通过两种方式来完成:
- 使用余弦波瓣向球形光源中心进行重要采样
- 在上述锥体中进行均匀取样
在第一种情况下,"全局照明系数"中给出了公式:http://people.cs.kuleuven.be/~philip.dutre/GI/TotalCompendium.pdf(第21页第38项)。。在第二种情况下,你可以做一些拒绝抽样,但我很确定有一些近似形式的公式。
最后,还有最后一个选项:你可以使用你的公式,将结果(X,Y,Z)视为场景中的一个点,从而将其转换为球体的位置,并使向量从相机指向它。然而,这会带来严重的问题:
- 您将生成朝向球体灯光背面的矢量
- 对于生成的方向集的pdf,您将没有任何公式,这些公式将用于以后的蒙特卡罗积分