void SphericalMapping2D::sphere(const Point &p, float *s, float *t) const { Vector vec = Normalize(WorldToTexture(p) - Point(0,0,0)); float theta = SphericalTheta(vec); float phi = SphericalPhi(vec); *s = theta * INV_PI; *t = phi * INV_TWOPI; }
Spectrum Scale(const Vector &w) const { Vector wp = Normalize(WorldToLight(w)); swap(wp.y, wp.z); float theta = SphericalTheta(wp); float phi = SphericalPhi(wp); float s = phi * INV_TWOPI, t = theta * INV_PI; return mipmap ? mipmap->Lookup(s, t) : 1.f; }
Float InfiniteAreaLight::Pdf_Li(const Interaction &, const Vector3f &w) const { Vector3f wi = WorldToLight(w); Float theta = SphericalTheta(wi), phi = SphericalPhi(wi); Float sinTheta = std::sin(theta); if (sinTheta == 0) return 0; return distribution->Pdf(Point2f(phi * Inv2Pi, theta * InvPi)) / (2 * Pi * Pi * sinTheta); }
void InfiniteAreaLight::Pdf_Le(const Ray &ray, const Normal3f &, Float *pdfPos, Float *pdfDir) const { Vector3f d = -WorldToLight(ray.d); Float theta = SphericalTheta(d), phi = SphericalPhi(d); Point2f uv(phi * Inv2Pi, theta * InvPi); Float mapPdf = distribution->Pdf(uv); *pdfDir = mapPdf / (2 * Pi * Pi * std::sin(theta)); *pdfPos = 1 / (Pi * worldRadius * worldRadius); }
float InfiniteAreaLightIS::Pdf(const Point &, const Vector &w) const { Vector wi = WorldToLight(w); float theta = SphericalTheta(wi), phi = SphericalPhi(wi); int u = Clamp(Float2Int(phi * INV_TWOPI * uDistrib->count), 0, uDistrib->count-1); int v = Clamp(Float2Int(theta * INV_PI * vDistribs[u]->count), 0, vDistribs[u]->count-1); return (uDistrib->func[u] * vDistribs[u]->func[v]) / (uDistrib->funcInt * vDistribs[u]->funcInt) * 1.f / (2.f * M_PI * M_PI * sin(theta)); }
Spectrum InfiniteAreaLightIS::Le(const RayDifferential &r) const { Vector w = r.d; // Compute infinite light radiance for direction Spectrum L = Lbase; if (radianceMap != NULL) { Vector wh = Normalize(WorldToLight(w)); float s = SphericalPhi(wh) * INV_TWOPI; float t = SphericalTheta(wh) * INV_PI; L *= radianceMap->Lookup(s, t); } return L; }
Spectrum InfiniteAreaLight::Le(const RayDifferential &ray) const { Vector3f w = Normalize(WorldToLight(ray.d)); Point2f st(SphericalPhi(w) * Inv2Pi, SphericalTheta(w) * InvPi); return Spectrum(Lmap->Lookup(st), SpectrumType::Illuminant); }
Point2f SphericalMapping2D::sphere(const Point3f &p) const { Vector3f vec = Normalize(WorldToTexture(p) - Point3f(0, 0, 0)); Float theta = SphericalTheta(vec), phi = SphericalPhi(vec); return Point2f(theta * InvPi, phi * Inv2Pi); }