我一直在实现路径跟踪器,参考pbrt-v3。但是,我对它的实现有点困惑。代码是这里。
当我们采样进行传输时,它似乎测试它是否满足了一个完整的内部反射,但是它没有为pdf分配一个适当的值,而是在函数返回Vec3f(0,0,0)作为BTDF值之后,然后测试pdf是否为0,如果0然后直接跳出跟踪循环。
我不认为这是有意义的,因为如果这条射线继续从镜面物体中追踪,并撞上一个被照亮的表面,那么就应该有辐射值。但是这个实现似乎忽略了所有这样的亮度,并且依赖于sample_f函数来采样一个反射。
那么,如何正确计算全内反射的pdf呢?
// Account for the indirect subsurface scattering component
Spectrum f = pi.bsdf->Sample_f(pi.wo, &wi, sampler.Get2D(), &pdf,
BSDF_ALL, &flags);
if (f.IsBlack() || pdf == 0) break;发布于 2018-12-02 04:36:05
代码看起来确实有点难看,因为它没有分配pdf,而是返回0。
通过返回0,它基本上是表示与pdf =0相同的内容,因为f.IsBlack()返回true。
这是可以接受的,基本上是说BSDF不允许光通过给定的w_o
https://computergraphics.stackexchange.com/questions/8296
复制相似问题