Added LICENSE file with MIT License and copyright notice. Added preview.png binary file for project assets. Changed CMakeLists.txt to include asset copying command. Changed mesh loading in Mesh.c to support smooth normals. Changed ray origin biasing in PathTracing.c and shadow rays. Changed ray-triangle intersection logic in RayIntersection.c. Changed ray_intersect_bvh_count function in Debug.c to static. Changed rendering functions in Scene.c with TODO for optimization. Updated README.md with project description and build instructions. Updated window dimensions in main.c for testing purposes.
52 lines
1.9 KiB
C
52 lines
1.9 KiB
C
#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);
|
|
}
|