Esempio n. 1
0
void LightSampler::sample(
    const Vector3d&         s,
    LightSample&            sample) const
{
    assert(m_emitter_cdf.valid());

    const EmitterCDF::ItemWeightPair result = m_emitter_cdf.sample(s[0]);
    const size_t emitter_index = result.first;
    const double emitter_prob = result.second;

    if (emitter_index < m_light_count)
    {
        sample.m_triangle = 0;
        sample_light(
            Vector2d(s[1], s[2]),
            emitter_index,
            emitter_prob,
            sample);
    }
    else
    {
        sample.m_light = 0;
        sample_emitting_triangle(
            Vector2d(s[1], s[2]),
            emitter_index - m_light_count,
            emitter_prob,
            sample);
    }

    assert(sample.m_triangle || sample.m_light);
    assert(sample.m_triangle == 0 || sample.m_triangle->m_edf);
    assert(sample.m_probability > 0.0);
}
Esempio n. 2
0
void LightSampler::sample_single_light(
    const size_t            light_index,
    const Vector2d&         s,
    LightSample&            sample) const
{
    sample.m_triangle = 0;
    sample_light(s, light_index, 1.0, sample);

    assert(sample.m_light);
    assert(sample.m_probability == 1.0);
}
	void main1(void *arg)
	{
		color Kd = color(diffuse(), diffuse(), diffuse());

		normal Nf = faceforward(normalize(N()), I());
		vector V = -normalize(I());

		while (illuminance(P(), Nf, PI / 2.0f))
		{
			color	C = 0.0f;
			color	last = 0.0f;
			int		num_samples = 0;

			while (sample_light())
			{
				C += Cl() * (
					color_() * Kd * (normalize(L()) % Nf) 
					+ cosinePower() * specularColor() * specularbrdf(normalize(L()), Nf, V, 0.1f/*roughness()*/)
					);

				++ num_samples;

				if ((num_samples % 4) == 0)
				{
					color	current = C * (1.0f / (scalar)num_samples);

					if (converged(current, last)){
						break;
					}
					last = current;
				}
			}

			C *= (1.0f / (scalar)num_samples);
			Ci() += C;
		}

		if ( ! less_than( &transparency(), LIQ_SCALAR_ALMOST_ZERO ) )
		{//transparent
			Ci() = Ci() * ( 1.0f - transparency() ) + trace_transparent() * transparency();
		}//else{ opacity }
		setOutputForMaya();
	}