现在我们有了光线在平面随机散射的 pdf 和直接对光源采样的 pdf,接下来我们可以混合这两种 pdf 得到混合概率密度,使用概率密度的好处之一正是 pdf 支持线性组合。
因为我们要混和多种 pdf,最好的方法就是新建一个类去管理他们:
1 | /* |
然后我们将之前的随机散射的 pdf 作为派生类实现:
1 | // 法线周围随机散射的pdf |
然后实现一个向场景中某个物体的方向采样光线的 pdf 类,这样我们可以不只向光源方向采样,还可以支持场景中的其他物体:
1 | // 向场景中某个物体方向采样的pdf |
这里我们新调用了 hittable
类中的两个方法 value
和 random
,因此要在抽象类中声明:
1 | class hittable { |
然后在 xz 平面物体类中实现这两个函数:
1 | // xz平面矩形 |
然后开始实现混合 pdf 类:
1 | // 混合pdf |
我们这里只是简单的把两个 pdf 平均起来。
然后修改 ray_color
函数:
1 | // 得到光线颜色 |
然后修改主函数:
1 | /*******创建场景*******/ |
得到的效果: