作业七的内容是实现现代光追算法中的路径追踪算法。在完成作业的过程中,犯了好几个错误,相似错误在互联网上没有被提及到,特此记录。如果渲染出的图像跟我的类似,可以尝试debug。
作业七的内容是实现现代光追算法中的路径追踪算法。在完成作业的过程中,犯了好几个错误,相似错误在互联网上没有被提及到,特此记录。如果渲染出的图像跟我的类似,可以尝试debug。
本文仅包含基础部分的debug,不包含bonus。
整张图像几乎是黑的
犯错误位置:没有正确判断光源到点p的路径是否被遮挡
伪代码中If the ray is not blocked in the middle
部分,我开始的实现是:
1 | if (block.happened && block.obj == inter.obj) |
然后发现,渲染出的图像几乎是全黑,很少程序能进入这个条件语句。打印发现,光源的物体是不存在的,即光源不算作物体。于是改成了:
1 | if (!block.happened) |
渲染出的图像如下:
仍然,很多渲染程序都被挡在了这个条件判断前。因为光线虽然不会和光源相撞,但会继续运动跟光源后面的物体相撞,绝大部分的光线都是有碰撞即block.happened == True
的。
正确判断语句:
1 | if (block.distance - (x - p).norm() > -0.001) |
阴影处出现大量白色噪点
排除了t_enter = t_exit
和pdf
过小的问题。犯错误位置:计算间接光照中,射线构造错误。
在按照伪代码编程时,错将递归中shade(q, wi)
写成castRay(Ray(q, wi)
,实际上应该是castRay(Ray(p, wi)
。
画面整体噪声很多
这是因为,我没有好好搞清楚函数castRay
中参数depth
的含义(擦汗),直接在递归中写了0。应该为castRay(Ray(p, wi), depth + 1)
,这样会和轮盘法一起限制递归的次数。(可能某些点很容易反复反射,着色次数多了,像素点就会很白)
最后的效果
spp=16:
spp=64: