Point Triangle::Sample(float u1, float u2, Normal *Ns) const { float b1, b2; UniformSampleTriangle(u1, u2, &b1, &b2); // Get triangle vertices in _p1_, _p2_, and _p3_ const Point &p1 = mesh->p[v[0]]; const Point &p2 = mesh->p[v[1]]; const Point &p3 = mesh->p[v[2]]; Point p = b1 * p1 + b2 * p2 + (1.f - b1 - b2) * p3; Normal n = Normal(Cross(p2-p1, p3-p1)); *Ns = Normalize(n); if (ReverseOrientation) *Ns *= -1.f; return p; }
Interaction Triangle::Sample(const Point2f &u) const { Point2f b = UniformSampleTriangle(u); // Get triangle vertices in _p0_, _p1_, and _p2_ const Point3f &p0 = mesh->p[v[0]]; const Point3f &p1 = mesh->p[v[1]]; const Point3f &p2 = mesh->p[v[2]]; Interaction it; it.p = b[0] * p0 + b[1] * p1 + (1 - b[0] - b[1]) * p2; // Compute surface normal for sampled point on triangle if (mesh->n) it.n = Normalize(b[0] * mesh->n[v[0]] + b[1] * mesh->n[v[1]] + (1 - b[0] - b[1]) * mesh->n[v[2]]); else it.n = Normalize(Normal3f(Cross(p1 - p0, p2 - p0))); if (reverseOrientation) it.n *= -1; // Compute error bounds for sampled point on triangle Point3f pAbsSum = Abs(b[0] * p0) + Abs(b[1] * p1) + Abs((1 - b[0] - b[1]) * p2); it.pError = gamma(6) * Vector3f(pAbsSum.x, pAbsSum.y, pAbsSum.z); return it; }