#include "Lighting/SkyLight.h" #include "Algorithm/BSDF.h" #include "Algorithm/RayIntersection.h" #include "Material/Material.h" vec3s evaluate_bsdf_const_sky(const void* data, const light_shading_context_t* context, vec3s throughput, uint32_t sample_index) { constant_sky_data_t sky_data = *(const constant_sky_data_t*)data; vec3s sky_color = glms_vec3_scale(sky_data.color, sky_data.intensity); if (context == NULL) { return glms_vec3_mul(sky_color, throughput); // return sky_data.color; } uint16_t d1 = sobol_get_dimension(context->bounce_depth, PRNG_LIGHT_U); uint16_t d2 = sobol_get_dimension(context->bounce_depth, PRNG_LIGHT_V); vec3s wi = random_uniform_cdf_direction(context->normal, sample_index, d1, d2); float pdf = 1.0f / (4.0f * (float)M_PI); ray_t shadow_ray = { .origin = BIAS_RAY_ORIGION(context->hit_point, context->normal), .direction = wi, }; float closest = FLT_MAX; hit_result_t shadow_hit = {1}; ray_intersect_bvh(shadow_ray, context->bvh_tree->nodes, context->bvh_tree->primitive_indices, context->bvh_tree->triangles, 0, &closest, &shadow_hit); if (shadow_hit.hit) { return glms_vec3_zero(); } shading_context_t shading_context = { .normal = context->normal, .wi = wi, .wo = glms_vec3_negate(context->wo) }; vec3s bsdf = evaluate_material_bsdf(context->material, &shading_context); bsdf = glms_vec3_mul(bsdf, sky_color); float cos_theta = fmaxf(glms_vec3_dot(wi, context->normal), 0.0f); float pdf_bsdf = sample_material_bsdf_pdf(context->material, shading_context.normal, shading_context.wo, shading_context.wi); float weight = power_heuristic(pdf, pdf_bsdf); vec3s env_contrib = glms_vec3_scale(glms_vec3_mul(throughput, bsdf), cos_theta / pdf); return glms_vec3_scale(env_contrib, weight); }