Example #1
0
nex::color path_tracer::radiance(const sampler* sampler, nex::ray* ray, bool emittance) const
{
        surface surface;
        if (!acceleration->intersect(ray, &surface)) {
                nex::color color;

                for (const auto& light : lights) {
                        color += light->emission(ray->direction);
                }

                return color;
        }

        if (ray->depth >= max_depth) {
                return nex::color::black();
        }

        nex::color radiance;

        if (emittance) {
                radiance += surface.bsdf->emittance(surface, ray->direction);
        }

        radiance += direct_illumination(sampler, ray, surface);
        radiance += indirect_illumination(sampler, ray, surface);

        return radiance;
}
glm::vec3 evaluate_illumination(
	RenderData &data,           // class containing raytracing information
	MaterialSample const& mat,  // the material at position
	glm::vec3 const& P,         // world space position
	glm::vec3 const& N,         // normal at the position (already normalized)
	glm::vec3 const& V,         // view vector (already normalized)
	int depth)                  // the current recursion depth
{
	glm::vec3 direct_illumination(0.f);

	if (data.context.params.soft_shadow)
	{
		for (auto& light : data.context.scene->area_lights)
		{
			// TODO SoftShadow: sample point on light source for soft shadows
			glm::vec3 current_direct_illumination(0.f);

            for (int i = 0; i < data.context.params.shadow_rays; i++)
            {
                glm::vec3 light_point = light->uniform_sample_point(data.tld->rand(), data.tld->rand());

                if (visible(data, P, light_point))
                {
                    glm::vec3 p_coeff = evaluate_phong_BRDF(data, mat, glm::normalize(light_point - P), N, V); //f(izé) * cos(theta(i))
                    glm::vec3 dir_to_light = light->getEmission(glm::normalize(P - light_point));
                    float cos_thetha0 = 1.f;
                    current_direct_illumination += p_coeff * dir_to_light * cos_thetha0/ glm::dot(P - light_point, P - light_point);
					//current_direct_illumination += glm::vec3(1.f);
				}
			}

			current_direct_illumination *= light->get_area() / data.context.params.shadow_rays;
			direct_illumination += current_direct_illumination;
			(void)light; // prevent unused warning*/
		}
		//direct_illumination /= 100.f; //random leosztottam 100-al hogy lássam mi van a nagyon fehér részeken
	}
    else
    {
        for (auto& l : data.context.scene->lights)
        {
            const glm::vec3 light_position = l->getPosition();
			direct_illumination += evaluate_illumination_from_light(
                    data, mat, *l, light_position, P, N, V);
		}

		direct_illumination /= data.context.scene->lights.size();
	}

	glm::vec3 indirect_illumination(0.f);

	if (data.context.params.indirect) 
	{
		// TODO IndirectIllumination: compute indirect illumination
        for (int i = 0; i < data.context.params.indirect_rays; i++)
        {
            glm::vec3 ray_dir = uniform_sample_hemisphere(data, N);
            glm::vec3 trace_rec = trace_recursive(data, Ray(P, ray_dir), depth+1);
            glm::vec3 p_coeff = evaluate_phong_BRDF(data, mat, ray_dir, N, V);

            indirect_illumination += p_coeff * trace_rec;
		}

		indirect_illumination *= 2 * M_PI / (float)data.context.params.indirect_rays;
	}

	return direct_illumination + indirect_illumination;
}