【发布时间】:2015-07-27 16:17:24
【问题描述】:
我想做的是在我用 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;
其中 transmission 是一个简单的浮点数,它设置为 0,以防从我的 hitPoint 到 lightCenter 的光线用于在中间找到一个对象。
所以,我尝试做的是:
- 向灯光上的随机点创建多条光线
- 计算他们中有多少人撞到了路上的物体并记住了这个数字
为简单起见:假设在我的情况下,我从我的点向灯光上的随机点射出 3 条阴影光线。 3 条光线中只有 2 条到达光线。因此,我的像素的最终颜色将是 = color * shadowFactor 其中 shadowFactor = 2/3。在我的等式中,我删除了 transmission 因子(现在是错误的),我使用 shadowFactor 代替。问题是在我的等式中我有:
std::max(float(0), nHit.dot(lightDirection))
我不知道如何更改,因为我不再有指向灯光中心的 lightDirection。你能帮我理解我应该做什么以及到目前为止有什么问题吗?提前致谢!
【问题讨论】:
标签: c++ graphics pixel shadow raytracing