【发布时间】:2014-12-29 15:35:29
【问题描述】:
我目前正在开发一个简单的光线追踪器,到目前为止,我已经成功实现了几个功能,例如抗锯齿、景深和带区域光的柔和阴影。 代表我的作品的图像可能是这个:
(这里没有AA)
下一步是使用一些全局照明算法为渲染添加现实,所以我决定转向光子映射方式,这似乎是最简单的一种。
为此,我阅读了一些在网上找到的论文,例如:http://graphics.stanford.edu/courses/cs348b-01/course8.pdf
写的很好。
现在我的程序可以在场景中拍摄光子并在第一次反弹(漫反射或镜面反射)后存储它们,然后将每个光子的功率缩放到 LIGHT_POWER / PHOTON_AMOUNT。 这些图像对此进行了直接可视化,其中我拍摄了 1000k 和 50k 个光子,每个允许反弹 6 次,在全球地图中总共有 5000k 和 250k 个光子:
我觉得效果是对的,所以我转到下一部分,使用光线追踪光线的交点上方一定半径内的光子来计算间接照明。
在我的光线追踪器中,我执行以下操作:
对于每个像素,我通过它发送一条光线以与场景相交并计算直接照明
(dot(N, L) * primitive.color * primitive.diffuseFactor * light.power)和镜面反射项;-
这是棘手的部分:我寻找位于交叉点周围固定半径圆盘中的最近光子,并以这种方式将每个光子产生的光相加:
对于半径内的每个光子 计算光照的方式与直接光照相同 (dot(-photonDir, N) * original.color * photonColor) 总结一切。
当每个有趣的光子都被处理并添加到最终颜色中时,我将它除以定义搜索区域的圆盘区域。
问题是这样做我没有得到想要的结果,特别是与我在网络上找到的图像相比,天花板非常暗(我不知道天花板怎么能像地板一样亮,如果后者有直接照明的额外贡献,如果上面的光子只有红色或绿色,它怎么可能是白色的)。
代表问题的图像如下:
这是使用 150k 光子渲染的,每个光子有 4 次反射,直接照明已除以 PI。
另外,如果你知道我如何去除角落里那些丑陋的文物,请告诉我。
【问题讨论】:
-
对我来说看起来不错。干得好
-
谢谢,但正如您所见,天花板是我的主要问题,非常非常暗,如果我增强间接照明,唯一会发生的事情是颜色渗色会变得更加明显这不是我想要的
-
可以预料天花板是黑暗的:没有直接照明。如果您在网络上看到天花板不暗的图像,那是由于添加了一些环境光(即,如果没有任何光源,您甚至会看到天花板)。颜色渗色也并非不现实,只是我们人类如此适应忽略彩色光,以至于我们通常没有意识到这一点。这就是为什么您经常看到光子光变灰以使渲染图像与预期而非现实相匹配。唯一真正的伪影是角落处的亮线。
-
嗯,天花板肯定比这更亮,就像在真正的康奈尔盒子网站中:graphics.cornell.edu/online/box/compare.html 或来自网络的其他图像:peterkutz.com/computergraphics/images/path_tracer/… 或来自路径跟踪渲染:@987654324 @
-
你真的必须缩小范围。这个问题虽然在某些地方很有趣且有效,但对于编程问答存储库来说远太宽泛了。
标签: c++ raytracing