在光线跟踪器中实现软阴影 我想做的是在C++中开发简单的光线跟踪器中的软阴影。如果我理解正确的话,这背后的想法是向灯光发射多条光线,而不是向灯光中心发射一条光线,然后平均结果。因此,光线在光线的不同位置发射。到目前为止,我使用的是随机点,我不知道这是否正确,或者我是否应该使用规则分布在灯光表面上的点。假设我做得对,我会选择灯光上的一个随机点,在我的框架中,它被实现为一个球体。这是由以下公式得出的: Vec3<T> randomPoint() const { T x; T y; T z; // random vector in unit sphere std::random_device rd; //used for the new <random> library std::mt19937 gen(rd()); std::uniform_real_distribution<> dis(-1, 1); do { x = dis(gen); y = dis(gen); z = dis(gen); } while (pow(x, 2) + pow(y, 2) + pow(z, 2) > 1); // simple rejection sampling return center + Vec3<T>(x, y, z) * radius; }

在光线跟踪器中实现软阴影 我想做的是在C++中开发简单的光线跟踪器中的软阴影。如果我理解正确的话,这背后的想法是向灯光发射多条光线,而不是向灯光中心发射一条光线,然后平均结果。因此,光线在光线的不同位置发射。到目前为止,我使用的是随机点,我不知道这是否正确,或者我是否应该使用规则分布在灯光表面上的点。假设我做得对,我会选择灯光上的一个随机点,在我的框架中,它被实现为一个球体。这是由以下公式得出的: Vec3<T> randomPoint() const { T x; T y; T z; // random vector in unit sphere std::random_device rd; //used for the new <random> library std::mt19937 gen(rd()); std::uniform_real_distribution<> dis(-1, 1); do { x = dis(gen); y = dis(gen); z = dis(gen); } while (pow(x, 2) + pow(y, 2) + pow(z, 2) > 1); // simple rejection sampling return center + Vec3<T>(x, y, z) * radius; },c++,graphics,pixel,shadow,raytracing,C++,Graphics,Pixel,Shadow,Raytracing,我不知道如何改变,因为我不再有一个指向灯光中心的灯光方向。你能帮我理解我应该做什么,到目前为止有什么问题吗?提前谢谢 您应该为拾取的灯光样本评估整个BRDF。然后,还将获得灯光方向(从对象位置到拾取的灯光采样的向量)。你可以平均这些结果。请注意,大多数区域灯光具有非各向同性发光特性(即,从某个点发射的光量随出射方向而变化) 平均可见度不会产生正确的结果(尽管它们通常在视觉上是合理的)。通过“平均可见度不会产生正确的结果”您的意思是如果您不评估每个样本的BRDF吗?是的,这就是我的意思。您可能希望

我不知道如何改变,因为我不再有一个指向灯光中心的灯光方向。你能帮我理解我应该做什么,到目前为止有什么问题吗?提前谢谢

您应该为拾取的灯光样本评估整个BRDF。然后,还将获得灯光方向(从对象位置到拾取的灯光采样的向量)。你可以平均这些结果。请注意,大多数区域灯光具有非各向同性发光特性(即,从某个点发射的光量随出射方向而变化)


平均可见度不会产生正确的结果(尽管它们通常在视觉上是合理的)。

通过“平均可见度不会产生正确的结果”您的意思是如果您不评估每个样本的BRDF吗?是的,这就是我的意思。您可能希望检查此答案:
Vec3<float> surfaceColor = 0
for(int i < 0; i < lightsInTheScene.size(); i++){
    surfaceColor += obj->surfaceColor * transmission *
    std::max(float(0), nHit.dot(lightDirection)) * g_lights[i]->emissionColor;
}
return surfaceColor + obj->emissionColor;
 std::max(float(0), nHit.dot(lightDirection))