Changed the pixel rendering function to include anti-aliasing using Sobol sampling in Renderer.c. Changed the path tracing function to adjust light shading context and Russian roulette logic in PathTracing.c. Changed the normal calculation logic to use a ternary operator in RayIntersection.c. Changed the Sobol sample calculation for consistency in Debug.c. Removed some items from the project roadmap in README.md. Modified the sample count from 64 to 16 in main.c, affecting rendering quality and performance.
66 lines
1.8 KiB
C
66 lines
1.8 KiB
C
#include "Rendering/Debug.h"
|
|
#include "Algorithm/RayIntersection.h"
|
|
|
|
static void ray_intersect_bvh_count(ray_t ray, bvh_tree_t bvh_tree, uint64_t node_index, uint32_t* count_out)
|
|
{
|
|
const float _MAX_DIST = 1e6f;
|
|
if (bvh_tree.nodes == NULL || bvh_tree.primitive_indices == NULL || count_out == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
const bvh_node_t* node = &bvh_tree.nodes[node_index];
|
|
|
|
float enter, exit;
|
|
if (!ray_intersect_aabb(&ray, node->bounds, &enter, &exit))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (enter > _MAX_DIST || exit < 0.0f)
|
|
{
|
|
return;
|
|
}
|
|
|
|
(*count_out)++;
|
|
if (node->primitive_count == 0)
|
|
{
|
|
// Internal node
|
|
ray_intersect_bvh_count(ray, bvh_tree, node->left_child_offset, count_out);
|
|
ray_intersect_bvh_count(ray, bvh_tree, node->right_child_offset, count_out);
|
|
}
|
|
}
|
|
|
|
vec4s render_debug(scene_t* scene, ray_t ray, uint16_t sample_index, int flag)
|
|
{
|
|
if (scene == NULL)
|
|
{
|
|
return glms_vec4_zero();
|
|
}
|
|
|
|
switch (flag & 0xFF)
|
|
{
|
|
case DEBUG_BVH:
|
|
uint32_t count = 0;
|
|
ray_intersect_bvh_count(ray, scene->bvh_tree, 0, &count);
|
|
|
|
vec4s result = glms_vec4_zero();
|
|
for (uint32_t i = 0; i < count; i++)
|
|
{
|
|
result = glms_vec4_add(result, DEBUG_COLOR_BVH);
|
|
}
|
|
return result;
|
|
|
|
case DEBUG_SOBOL:
|
|
float sobol_sample_value = sobol_sample(sample_index, 1); // Assuming dimension 0 for simplicity
|
|
return (vec4s){sobol_sample_value, sobol_sample_value, sobol_sample_value, 1.0f};
|
|
|
|
case DEBUG_UV:
|
|
hit_result_t hit_result = ray_intersect_scene(&ray, scene);
|
|
return (vec4s){fmodf(fabsf(hit_result.uv.x), 1.0f), fmodf(fabsf(hit_result.uv.y), 1.0f), 0.0f, 1.0f};
|
|
|
|
default:
|
|
return glms_vec4_zero();
|
|
}
|
|
}
|