graphics, rendering
Home

Delta Distribution in Light Transport

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