实施光子映射遇到困难

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。

另外,如果您知道如何去除那些角落里的丑陋伪影,请告诉我。


天花板肯定应该比这个亮,就像在真正的康奈尔盒子网站上一样:http://www.graphics.cornell.edu/online/box/compare.html 或者其他网上的图片:http://www.peterkutz.com/computergraphics/images/path_tracer/PhotonMapping.png 或来自路径追踪渲染:http://www.eecs.berkeley.edu/~jonash/MCPT/MCPT_Result/Boxes/Dutre_Final_2048_Hemisphere.bmp - DI2edd
你必须更加明确你的问题。虽然这个问题很有趣,但对于一个编程问答库来说太过宽泛。 - Lightness Races in Orbit
我的问题是:从我所写的内容中,我描述的算法是否存在任何错误?如果这里有任何在计算机图形学领域有经验的人,也许他可以帮助我。我认为我已经尽可能地说明了所有可能帮助你解决问题的事情。再次感谢。 - DI2edd
我获取半径为R的球体中的所有光子,但我的光子以一种方式组织,我只能获取由射线击中的基元上的光子。 - DI2edd
谢谢你的帮助,但是增加光子图中最终光子数量也会使场景中其他部分变亮,而且可能直接照亮的部分会变得太亮。也许我需要在一些反弹后降低光子的强度? - DI2edd
显示剩余10条评论
1个回答

4

首先,非常感谢您的帮助。

其次,我在此宣布,在一些麻烦和长时间未接触代码后,我终于搞定了。

我不明白我做错了什么,也许是获取半球内随机方向的算法,也许是光子收集通道......重点是,在重新格式化代码后(并实现最终的收集步骤和2.2伽马校正),我能够使用200k光子、10个漫反射反弹、20个直接照明样本和100个FG样本(以随机 - 余弦加权 - 方向采取)渲染以下内容:

The final result

我非常高兴,因为这看起来几乎与使用V-Ray路径跟踪在c4d中再现场景相同。

我仍然不清楚存储光子入射方向的效用是什么,哈哈哈哈哈,但它能工作,所以没问题。

再次感谢。


存储光子入射方向的效用是什么?它用于比纯漫反射更复杂的任何BRDF。由于您似乎正在使用纯Lambertian模型,因此您不需要它。 - MikeMx7f
哦,所以当光子反弹时也应该评估BRDF吗?(以确定其强度) - DI2edd
是的,您应该在每个反弹上重要性采样BRDF,并在收集步骤中应用它。然而,对于Lambertian表面来说很简单。 - MikeMx7f
嗯,我对此有些困惑。您如何为每个BRDF模型找到重要性采样算法? - DI2edd
这是一个值得写几篇学术论文的问题。以下是其中之一:http://cseweb.ucsd.edu/~ravir/papers/brdf/brdf.pdf - MikeMx7f

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