Update project roadmap and improve rendering logic

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.
This commit is contained in:
2025-04-29 20:43:04 +09:00
parent fb1ff5cac6
commit 2c0d5a2364
8 changed files with 34 additions and 27 deletions

View File

@@ -52,8 +52,7 @@ vec4s render_debug(scene_t* scene, ray_t ray, uint16_t sample_index, int flag)
return result;
case DEBUG_SOBOL:
uint16_t i = sample_index ^ (sample_index >> 1);
float sobol_sample_value = sobol_sample(i, 1); // Assuming dimension 0 for simplicity
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:

View File

@@ -43,17 +43,24 @@ static inline uint16_t get_sample_count(uint16_t sample_count, int flag)
static void render_pixel(const rendering_config_t* config, scene_t* scene, vec3s coord, uint32_t x, uint32_t y, debug_flag_t flag, vec4s* pixel_color)
{
vec4s accumulated_color = glms_vec4_zero();
uint32_t pixel_id = y * config->width + x;
uint32_t pixel_id = y * config->width + x;
uint16_t sample_count = get_sample_count(config->sample_count, flag);
float inv_sample = 1.0f / (float)sample_count;
vec2s position_ndc = compute_ndc((float)x, (float)y, config->width, config->height);
vec3s camera_right = quat_get_right(scene->camera.rotation);
vec3s camera_up = quat_get_up(scene->camera.rotation);
for (uint16_t k = 0; k < sample_count; k++)
{
// TODO: Hash it
uint32_t sobol_idx = pixel_id * config->sample_count + (k + 1);
// Apply AA
float du = sobol_sample(sobol_idx, PRNG_FILTER_U);
float dv = sobol_sample(sobol_idx, PRNG_FILTER_V);
vec2s position_ndc = compute_ndc((float)x + du, (float)y + dv, config->width, config->height);
float screen_x = position_ndc.x * 2.0f - 1.0f;
float screen_y = position_ndc.y * 2.0f - 1.0f;
float sensor_offset_x = screen_x * scene->camera.size_x * 0.5f;
@@ -65,19 +72,7 @@ static void render_pixel(const rendering_config_t* config, scene_t* scene, vec3s
ray_t ray = ray_create(scene->camera.position, glms_vec3_normalize(glms_vec3_sub(image_plane_point, scene->camera.position)));
vec4s out_color = glms_vec4_zero();
if (flag != 0)
{
out_color = render_debug(scene, ray, k, flag);
}
else
{
// TODO: Hash it
uint32_t sobol_idx = pixel_id * config->sample_count + (k + 1);
out_color = path_trace(scene, ray, sobol_idx, config->max_depth);
}
vec4s out_color = flag == 0 ? path_trace(scene, ray, sobol_idx, config->max_depth) : render_debug(scene, ray, sobol_idx, flag);
accumulated_color = glms_vec4_add(accumulated_color, out_color);
}