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; }