コード例 #1
0
ファイル: spot.cpp プロジェクト: zq317157782/RayTracer
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);
}
コード例 #2
0
ファイル: spot.cpp プロジェクト: jwzhang/pbrt-v2
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);
}
コード例 #3
0
ファイル: spot.cpp プロジェクト: jwzhang/pbrt-v2
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);
}
コード例 #4
0
ファイル: spot.cpp プロジェクト: RobertoMalatesta/pbrt-v3
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);
}
コード例 #5
0
ファイル: spot.cpp プロジェクト: Drooids/pbrt-v3
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);
}
コード例 #6
0
ファイル: spotLight.cpp プロジェクト: valdersoul/NoriV2
    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);
    }
コード例 #7
0
ファイル: spotLight.cpp プロジェクト: valdersoul/NoriV2
    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);
    }