I'm confused by the Mitsuba bidirectional framework for quite a while now, especially by the different eval and connect functions, as well as the weight and pdf variables.

So, what is the difference between PathVertex::eval and PathVertex::weight[], and PathVertex::evalPdf and PathVertex::pdf[].

What are the differences between PathEdge::evalCached, PathEdge::eval*, PathEdge::weight[], PathEdge::pdf[], etc.

Furthermore, how do the PathVertex::connect and PathEdge::pathConnectAndCollapse differ?

To make the problem more concrete, let's say I have two vertices, one at the end of an emitter subpath, call it $y_{s-1}$ and one at the end of a sensor subpath, $x_{t-1}$, both surface interactions.

  • What is the correct way of connecting these two?
  • If I want to calculate $f(y_{s-2} \rightarrow y_{s-1} \rightarrow z_{t-1}) G(y_{s-1} \leftrightarrow x_{t-1}) f(y_{s-1} \rightarrow z_{t-1} \rightarrow z_{t-2})$, what is the correct way of going about this?

Thanks a lot in advance!


Your Answer


Browse other questions tagged or ask your own question.