Graphics 光线跟踪中的区域照明

Graphics 光线跟踪中的区域照明,graphics,area,raytracing,lighting,Graphics,Area,Raytracing,Lighting,我有一个关于光线跟踪中的区域照明的快速问题。我是从中学习这个主题的,当没有应用反校准时,我的区域光的结果是这样的: 正如你所看到的,图像中有很多噪音。当我使用防腐蚀剂时,它看起来很好,当使用256x AA时,它看起来是这样的: [阴影颜色的变化很小,我改变了阴影的一些属性] 我的问题是,这是区域灯光的行为方式还是我做错了什么?因为渲染第一个只需要4秒,而渲染后一个几乎需要20分钟。感觉好像有什么不对劲 “我的点光源”类和“区域光源”类之间的唯一区别是get\u direction函数 点光源的

我有一个关于光线跟踪中的区域照明的快速问题。我是从中学习这个主题的,当没有应用反校准时,我的区域光的结果是这样的:

正如你所看到的,图像中有很多噪音。当我使用防腐蚀剂时,它看起来很好,当使用256x AA时,它看起来是这样的:

[阴影颜色的变化很小,我改变了阴影的一些属性]

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

“我的点光源”类和“区域光源”类之间的唯一区别是
get\u 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();
}
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());
}
区域灯的
获取方向
功能:

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();
}
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());
}

您发布的渲染时间对我来说非常有意义:

4 seconds * 256 ~= 17 minutes

随机数生成器引入的开销加起来就是其余的。

在前一种情况下,您采集了多少样本?我猜你只是严重地欠采样了区域光,导致了你看到的结果。前一个每像素发送一条光线,另一个每像素发送256条光线。那么,你的意思是,如果没有任何(或更少)AA,就无法获得第二个结果吗?嗯,你可以尝试不同的(自适应)采样策略。但是对于您已经实现的,结果与预期的一样。至少这是一个积极的结果编辑:从目录中我收集到那本书后面几章正是讨论这个问题的。也许值得一看?你是说第17章的环境遮挡吗?总的来说,当从区域光采样直接照明时,你需要发射更多的光线。