Skip to content

Instantly share code, notes, and snippets.

@bachi95
Created January 23, 2015 10:04
float BSSRDF::MISWeight(const Fragment& fo, const Fragment& fi,
BSSRDFSampleAxis mainAxis, float pdf, float sigmaTr,
float Rmax) const {
float weight = 0.0f;
// The U, V, N ratio is 1 : 1 : 2, and we do MIS with
// power heuristic, so 1: 1: 4
const Vector3& pwo = fo.getPosition();
const Vector3& pwi = fi.getPosition();
const Vector3& ni = fi.getNormal();
if(mainAxis == NAxis) {
const Vector3& u = normalize(fo.getDPDU());
const Vector3& v = normalize(fo.getDPDV());
float UPdf = 0.25f *
gaussianSample2DPdf(pwo, pwi, u, sigmaTr, Rmax) *
absdot(u, ni);
float VPdf = 0.25f *
gaussianSample2DPdf(pwo, pwi, v, sigmaTr, Rmax) *
absdot(v, ni);
float numerator = 4 * pdf * pdf;
weight = numerator / (numerator + UPdf* UPdf + VPdf * VPdf);
} else if(mainAxis == UAxis) {
const Vector3& n = fo.getNormal();
const Vector3& v = normalize(fo.getDPDV());
float NPdf = 0.5f *
gaussianSample2DPdf(pwo, pwi, n, sigmaTr, Rmax) *
absdot(n, ni);
float VPdf = 0.25f *
gaussianSample2DPdf(pwo, pwi, v, sigmaTr, Rmax) *
absdot(v, ni);
float numerator = pdf * pdf;
weight = numerator / (4 * NPdf * NPdf + numerator + VPdf * VPdf);
} else if(mainAxis == VAxis) {
const Vector3& n = fo.getNormal();
const Vector3& u = normalize(fo.getDPDU());
float NPdf = 0.5f *
gaussianSample2DPdf(pwo, pwi, n, sigmaTr, Rmax) *
absdot(n, ni);
float UPdf = 0.25f *
gaussianSample2DPdf(pwo, pwi, u, sigmaTr, Rmax) *
absdot(u, ni);
float numerator = pdf * pdf;
weight = numerator / (4 * NPdf * NPdf + UPdf * UPdf + numerator);
}
return weight;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment