我要做的是在我用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;
}
在此之后,我不知道我应该如何移动,因为我的渲染方程(在我的简单光线跟踪器中)定义如下:
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;
其中传输是一个简单的浮点数,如果从我的hitPoint到lightCenter的光线用于在中间找到一个对象,则设置为0。
所以,我试图做的是:
为了简单起见:让我们想象一下,在我的情况下,我从我的观点向光线上的随机点射出3条阴影光线。 3条光线中只有2条到达光线。因此,我的像素的最终颜色将是= color * shadowFactor ,其中 shadowFactor = 2/3。在我的等式中,然后我删除传输因子(现在是错误的),而我使用 shadowFactor 。问题是,在我的等式中,我有:
std::max(float(0), nHit.dot(lightDirection))
我不知道怎么改变,因为我不再有一个指向光中心的lightDirection。你能帮我理解我应该做什么,到目前为止有什么问题?提前谢谢!
答案 0 :(得分:1)
您应该为拾取的光样本评估整个BRDF。然后,您还将获得光线方向(从物体位置到拾取光样本的矢量)。你可以平均这些结果。请注意,大多数区域的灯具有非各向同性的发光特性(即从点发出的光量随着出射方向而变化)。
平均可见度不会产生正确的结果(尽管它们通常在视觉上看似合理)。