首先回顾路径追踪的原理,如下图
基本思想
wo是射向眼镜(相机)的光线,包含来自光源的直接光照ws,来自其他物体的间接光照wi两部分。
在实现path tracing时,我们考虑的是黄色线的方向,即光线从相机射向p点(实际上是从p点射向相机),然后通过多次随机采样从p点射出(实际上是射向p点)的光线得到该像素点的真实颜色。
为了提高效率,将射向p的光线分为ws(光源)和wi(其他物体)计算。由于wi、ws分开计算,因此如果ws被物体挡住,或者wi打到光源均不计算。
wi需要递归计算,通过神奇的Russian Roulette在减少递归层数的同时保持光照的期望不变。
然后按照作业指南上的伪代码写就可以了
注意事项
- 右墙壁发黑:检查Bound3::IntersectP,
return t_enter <= t_exit && t_exit >= 0;
就可以 - 小正方体右上角有三角形黑块:检查Triangle::getIntersectionin Triangle.hpp,当时间小于0时不能判定为相交
- 多线程:注意framebuffer的下标应该由m改为直接用i和j计算。CMakeLists.txt加一行
TARGET_LINK_LIBRARIES(RayTracing pthread)
就好。
代码
多线程优化
1 | // change the spp value to change sample ammount |
路径追踪
1 | // Implementation of Path Tracing |