Delta Distribution in Light Transport
- 按照mitsuba的传统,正确的写法为
bsdf::sample()
给出- 采样出的方向
- 采样方向对应的pdf(如果delta,则为1)
- 采样lobe的属性(delta或者solidAngle)
- 采样方向的入射出射比bsdfVal
- 如果是delta,bsdfVal不用乘dot(n, l)
- 如果不是delta,bsdfVal要乘dot(n, l)
bsdf::pdf()
给出由其他sampler产生bsdf在这个方向的pdf- 需要传进sampler产生方向的属性measureType(是delta还是solidAngle)
- 如果bsdf只有delta lobe,返回0,表示采不到
bsdf::eval
给出由其他sampler产生bsdf在这个方向的入射出射比- 需要传进sampler产生方向的属性measureType(是delta还是solidAngle)
- 对于delta lobe,只接受delta形式的采样方向
- 对于solid angle lobe,只接受solid angle形式的采样方向
- 做Direct Illumination的时候:
bsdf::eval()
和 bsdf::pdf()
全部传入solid angle形式measureType- 这样做之后,唯一看起来不对劲的就是万一采到了点光源(delta)怎么办
- 首先这个时候不会和bsdf做MIS,所以
bsdf::pdf()
怎么算都无所谓 - 对于
bsdf::eval()
- 如果它eval到了非specular lobe,比如点光源和完美漫反射,没啥问题啊没啥问题
- 如果eval到了specular lobe,这个lobe只接受delta形式的采样方向;specular lobe不会在direct illumination做计算,也很合理啊;因为没有MIS,算了direct illumination之后,如果我再hit到这个光源(入射反射对称)不就多算了一次吗
- 只会对有非specular lobe的bsdf表面做。
- 反证:如果bsdf全是specular lobe,由sampler产生available入射方向的pdf为0,因为它是一个delta分布。
- 如果bsdf是specular lobe和非specular lobe混合
- eval非specular lobe一切都很合理,因为传入的measure是solid angle
- eval specular lobe无效,因为此lobe只接受delta measure
- Hit light的时候:
- 这个时候应该这可能hit到solid angle形式的light,像点光源、方向光这种应该是hit不到的
- 如果bsdf sample出来的方向是specular,就不用算light pdf,不做mis
- 如果bsdf sample出来的不是specular,那就做mis