光线追踪中的区域照明

3
我有一个关于光线追踪中区域照明的问题。我正在学习Ray Tracing from the Ground Up,当没有抗锯齿时,我的区域光结果如下所示:NO AA。你可以看到图像中有很多噪点。当我应用抗锯齿时,它看起来不错,当应用256x抗锯齿时,它看起来像这样:

AA 256x

[阴影颜色的变化微不足道,我改变了一些阴影属性]

我的问题是,这是区域光的行为方式还是我做错了什么?因为渲染第一个只需要4秒,但后一个却需要近20分钟。感觉有些不对劲。

我的点光源类和区域光源类之间唯一的区别是get_direction函数。

点光源的get_direction函数:

virtual Vec get_direction(ShadeRec& sr)
{
return Vec(position.x-sr.hit_point.x, position.y-sr.hit_point.y, position.z-sr.hit_point.z).norm();
}

Area Light的get_direction函数:

virtual Vec get_direction(ShadeRec& sr)
{
    Vec newLocation;
    newLocation.x = position.x + radius * (2.0 * rand_float() - 1.0);
    newLocation.y = position.y + radius * (2.0 * rand_float() - 1.0);
    newLocation.z = position.z + radius * (2.0 * rand_float() - 1.0);
    return ((newLocation - sr.hit_point).norm());
}

在前一种情况下,你要取多少个样本?我猜你只是严重地对区域光进行了欠采样,导致了你看到的结果。 - Bart
前者每像素发送一条光线,而后者每像素发送256条光线。那么你的意思是没有任何(或更少)抗锯齿的情况下无法实现第二个的结果吗? - hevele
1
你可以尝试不同的(自适应)采样策略。但对于你现有的实现,结果是符合预期的。至少这是一个积极的方面。 ;) 编辑:从目录中我发现该书的后面章节正好讨论了这个问题。也许值得一看? - Bart
你是指第17章的环境遮蔽吗? - hevele
在从区域光源采样直接照明时,你需要更多地发射光线。 - davidnr
1个回答

3
你发布的渲染时间对我来说很合理:
4 seconds * 256 ~= 17 minutes

随机数生成器引入的开销加总到其余部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接