RGB SpotLight::Sample_L(const Point &p, Float pEpsilon, const LightSample &ls, Vector3f *wi, Float *pdf, VisibilityTester *vis) const { *wi = Normalize(mPos - p); //标准化的点到光源的向量 *pdf = 1.0f; vis->SetSegment(p, pEpsilon, mPos, 0.0f); return mIntensity * Falloff(-*wi) / DistanceSqr(mPos, p); }
Spectrum SpotLight::Sample_L(const Scene *scene, const LightSample &ls, float u1, float u2, float time, Ray *ray, Normal *Ns, float *pdf) const { Vector v = UniformSampleCone(ls.uPos[0], ls.uPos[1], cosTotalWidth); *ray = Ray(lightPos, LightToWorld(v), 0.f, INFINITY, time); *Ns = (Normal)ray->d; *pdf = UniformConePdf(cosTotalWidth); return Intensity * Falloff(ray->d); }
Spectrum SpotLight::Sample_L(const Point &p, float pEpsilon, const LightSample &ls, float time, Vector *wi, float *pdf, VisibilityTester *visibility) const { *wi = Normalize(lightPos - p); *pdf = 1.f; visibility->SetSegment(p, pEpsilon, lightPos, 0., time); return Intensity * Falloff(-*wi) / DistanceSquared(lightPos, p); }
Spectrum SpotLight::Sample_Li(const Interaction &ref, const Point2f &u, Vector3f *wi, Float *pdf, VisibilityTester *vis) const { *wi = Normalize(pLight - ref.p); *pdf = 1.f; *vis = VisibilityTester(ref, Interaction(pLight, ref.time, medium)); return intensity * Falloff(-*wi) / DistanceSquared(pLight, ref.p); }
Spectrum SpotLight::Sample_Le(const Point2f &u1, const Point2f &u2, Float time, Ray *ray, Normal3f *nLight, Float *pdfPos, Float *pdfDir) const { Vector3f w = UniformSampleCone(u1, cosTotalWidth); *ray = Ray(pLight, LightToWorld(w), Infinity, time, mediumInterface.inside); *nLight = (Normal3f)ray->d; *pdfPos = 1; *pdfDir = UniformConePdf(cosTotalWidth); return I * Falloff(ray->d); }
void samplePhoton(Sampler *sampler, Photon &photon, int N, int nLights, Vector3f &unQuantDir) const { const Point2f ls2 = sampler->next2D(); const Point3f pos = m_position; //get a direction const Vector3f cosDir = Warp::squareToUniformSphereCap(ls2, m_theta); // transform it to world coordinates Frame globalFrame = Frame(m_direction); const Vector3f dir = globalFrame.toWorld(cosDir); unQuantDir = dir; const Color3f power = (Falloff(dir) * Power() * float(nLights)) / (float(N)); // create the photon photon = Photon(pos, dir, power); }
Color3f sampleL(Point3f &p, float pEpsilon, const Point2f &ls, /*float time,*/ Vector3f *wi, float *pdf, VisibilityTester *vis) const { //set the direction to the light *wi = (m_position - p).normalized(); //pdf i one, because it is a point light *pdf = 1.f; if(wi->dot(m_direction) > m_theta) *pdf = 0.0f; //init the visibility tester vis->SetSegment(p, pEpsilon, m_position, 0.0f); // calc dist squared between m_position and p float distSquared = (m_position - p).squaredNorm(); //retrun the power divided squared distance and four pi return Falloff(- *wi) * m_intensity / (distSquared); }