我目前正在开发一个简单的光线追踪器,到目前为止,我已经成功实现了几个功能,比如抗锯齿、景深和区域光源的软阴影。下面是我的工作成果之一:
(这里没有抗锯齿)
接下来的步骤是通过一些全局光照算法增加渲染的真实感,所以我决定使用最简单的光子映射方法。
为此,我阅读了一些在网上找到的论文,比如这篇:http://graphics.stanford.edu/courses/cs348b-01/course8.pdf,写得非常好。
现在我的程序可以在场景中发射光子,并在第一次反弹(漫反射或镜面反射)后存储它们,然后将每个光子的功率缩放为LIGHT_POWER/PHOTON_AMOUNT。以下是这种效果的直观展示,我发射了1000k和50k个光子,每个光子最多反弹6次,在全局地图中共有5000k和250k个光子: 我认为这个效果是正确的,所以我转移到下一个部分,在该部分中,光线追踪光线的交点上方某个半径内的光子用于计算间接照明。
在我的光线追踪器中,我按以下方式进行:
1.对于每个像素,我发送一条射线穿过它以相交场景并计算直接照明(dot(N, L)*primitive.color*primitive.diffuseFactor*light.power)和高光项;
2.这是棘手的一部分:我寻找最近的光子,它们位于固定半径圆盘周围的交点处,并按以下方式总结每个光子产生的光: 对于半径内的每个光子 以与直接照明相同的方式计算光 (点积(-photonDir,N)*primitive.color*photonColor) 并将所有内容加起来。
3.当处理完每个有趣的光子并将其贡献添加到最终颜色时,我将其除以定义搜索区域的圆盘的面积。
问题在于这样做我没有得到预期的结果,特别是天花板与我在网上找到的图像相比非常暗(我无法理解如果地面有直接照明的额外贡献,天花板如何能像地面一样亮,以及如果天花板上的光子只有红色或绿色,它怎么可能是白色的)。
下面是代表问题的图片:
(这里没有抗锯齿)
接下来的步骤是通过一些全局光照算法增加渲染的真实感,所以我决定使用最简单的光子映射方法。
为此,我阅读了一些在网上找到的论文,比如这篇:http://graphics.stanford.edu/courses/cs348b-01/course8.pdf,写得非常好。
现在我的程序可以在场景中发射光子,并在第一次反弹(漫反射或镜面反射)后存储它们,然后将每个光子的功率缩放为LIGHT_POWER/PHOTON_AMOUNT。以下是这种效果的直观展示,我发射了1000k和50k个光子,每个光子最多反弹6次,在全局地图中共有5000k和250k个光子: 我认为这个效果是正确的,所以我转移到下一个部分,在该部分中,光线追踪光线的交点上方某个半径内的光子用于计算间接照明。
在我的光线追踪器中,我按以下方式进行:
1.对于每个像素,我发送一条射线穿过它以相交场景并计算直接照明(dot(N, L)*primitive.color*primitive.diffuseFactor*light.power)和高光项;
2.这是棘手的一部分:我寻找最近的光子,它们位于固定半径圆盘周围的交点处,并按以下方式总结每个光子产生的光: 对于半径内的每个光子 以与直接照明相同的方式计算光 (点积(-photonDir,N)*primitive.color*photonColor) 并将所有内容加起来。
3.当处理完每个有趣的光子并将其贡献添加到最终颜色时,我将其除以定义搜索区域的圆盘的面积。
问题在于这样做我没有得到预期的结果,特别是天花板与我在网上找到的图像相比非常暗(我无法理解如果地面有直接照明的额外贡献,天花板如何能像地面一样亮,以及如果天花板上的光子只有红色或绿色,它怎么可能是白色的)。
下面是代表问题的图片:
这是使用150k个光子进行渲染的,每个光子反弹4次,并且直接照明被除以PI。
另外,如果您知道如何去除那些角落里的丑陋伪影,请告诉我。