Dynamic resolution

This commit is contained in:
2024-10-08 14:58:07 +02:00
parent 51189d0f57
commit 565ae7e5cf
+56 -29
View File
@@ -687,17 +687,20 @@ Vector3 *frame = NULL;
int frame_w = 0; int frame_w = 0;
int frame_h = 0; int frame_h = 0;
unsigned int frame_texture; unsigned int frame_texture;
uint64_t accum_count = 0; float accum_count = 0;
os_mutex_t frame_mutex; os_mutex_t frame_mutex;
os_threadreturn worker(void*) os_threadreturn worker(void *arg)
{ {
uint32_t local_accum_generation = 0; uint32_t local_accum_generation = 0;
Vector3 *local_accum = NULL; Vector3 *local_accum = NULL;
uint64_t local_accum_count = 0; float local_accum_count = 0;
int local_frame_w = 0; int local_frame_w = 0;
int local_frame_h = 0; int local_frame_h = 0;
int init_scale = (int) arg;
int scale = init_scale;
for (;;) { for (;;) {
bool resize = false; bool resize = false;
@@ -707,6 +710,10 @@ os_threadreturn worker(void*)
for (int i = 0; i < frame_w * frame_h; i++) for (int i = 0; i < frame_w * frame_h; i++)
accum[i] = combine(accum[i], local_accum[i], 1, 1); accum[i] = combine(accum[i], local_accum[i], 1, 1);
accum_count += local_accum_count; accum_count += local_accum_count;
//if (scale > 1)
// scale >>= 1;
} else {
//scale = init_scale;
} }
memset(local_accum, 0, sizeof(Vector3) * local_frame_w * local_frame_h); memset(local_accum, 0, sizeof(Vector3) * local_frame_w * local_frame_h);
if (local_frame_w != frame_w || local_frame_h != frame_h) if (local_frame_w != frame_w || local_frame_h != frame_h)
@@ -732,30 +739,36 @@ os_threadreturn worker(void*)
} }
if (local_accum) { if (local_accum) {
/*
float aspect_ratio = (float) screen_w/screen_h;
if (isnan(aspect_ratio)) {
fprintf(stderr, "screen_w=%d, screen_h=%d\n", screen_w, screen_h);
}
assert(!isnan(aspect_ratio));
*/
for (int k = 0; k < 1; k++) {
for (int j = 0; j < local_frame_h; j++) float scale2inv = 1.0f / (scale * scale);
for (int i = 0; i < local_frame_w; i++) {
float u = (float) i / (local_frame_w - 1); int lowres_frame_h = local_frame_h / scale;
float v = (float) j / (local_frame_h - 1); int lowres_frame_w = local_frame_w / scale;
float aspect_ratio = (float) local_frame_w / local_frame_h;
for (int j = 0; j < lowres_frame_h; j++)
for (int i = 0; i < lowres_frame_w; i++) {
float u = (float) i / (lowres_frame_w - 1);
float v = (float) j / (lowres_frame_h - 1);
u = 1 - u; u = 1 - u;
v = 1 - v; v = 1 - v;
Vector3 color = pixel(u, v, (float) local_frame_w/local_frame_h); int tile_w = scale;
int tile_h = scale;
if (tile_w > local_frame_w - i * scale) tile_w = local_frame_w - i * scale;
if (tile_h > local_frame_h - j * scale) tile_h = local_frame_h - j * scale;
int pixel_index = j * local_frame_w + i; Vector3 color = pixel(u, v, aspect_ratio);
local_accum[pixel_index] = combine(local_accum[pixel_index], color, 1, 1); for (int g = 0; g < tile_h; g++)
for (int t = 0; t < tile_w; t++) {
int real_i = i * scale + t;
int real_j = j * scale + g;
int pixel_index = real_j * frame_w + real_i;
local_accum[pixel_index] = combine(local_accum[pixel_index], color, 1, scale2inv);
}
} }
local_accum_count++; local_accum_count += scale2inv;
}
} }
} }
} }
@@ -790,17 +803,28 @@ void update_frame_texture(float s)
if (accum_count == 0) { if (accum_count == 0) {
for (int j = 0; j < frame_h; j++) int scale_ = 16;
for (int i = 0; i < frame_w; i++) { float scale2inv = 1.0f / (scale_ * scale_);
float u = (float) i / (frame_w - 1);
float v = (float) j / (frame_h - 1); int fake_frame_w = frame_w / scale_;
int fake_frame_h = frame_h / scale_;
float aspect_ratio = (float) fake_frame_w/fake_frame_h;
for (int j = 0; j < fake_frame_h; j++)
for (int i = 0; i < fake_frame_w; i++) {
float u = (float) i / (fake_frame_w - 1);
float v = (float) j / (fake_frame_h - 1);
u = 1 - u; u = 1 - u;
v = 1 - v; v = 1 - v;
int pixel_index = j * frame_w + i; Vector3 color = pixel(u, v, aspect_ratio);
accum[pixel_index] = pixel(u, v, (float) frame_w/frame_h); for (int g = 0; g < scale_; g++)
for (int t = 0; t < scale_; t++) {
int pixel_index = (j * scale_ + g) * frame_w + (i * scale_ + t);
accum[pixel_index] = scale(color, scale2inv);
}
} }
accum_count++; accum_count += scale2inv;
} }
for (int j = 0; j < frame_h; j++) for (int j = 0; j < frame_h; j++)
@@ -1048,7 +1072,7 @@ int main(void)
add_object(sphere((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=0, .roughness=1, .albedo=(Vector3) {1, 0.4, 0}}, (Vector3) {3, 1, 3}, 1)); add_object(sphere((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=0, .roughness=1, .albedo=(Vector3) {1, 0.4, 0}}, (Vector3) {3, 1, 3}, 1));
add_object(sphere((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=1, .roughness=0, .albedo=(Vector3) {0, 1, 0}}, (Vector3) {5, 1, 3}, 1)); add_object(sphere((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=1, .roughness=0, .albedo=(Vector3) {0, 1, 0}}, (Vector3) {5, 1, 3}, 1));
add_object(sphere((Material) {.emission_color={1, 0.5, 0.5}, .emission_power=5, .metallic=0, .reflectance=0, .roughness=1, .albedo=(Vector3) {1, 0.4, 0}}, (Vector3) {3, 5, 3}, 1)); add_object(sphere((Material) {.emission_color={1, 0.5, 0.5}, .emission_power=5, .metallic=0, .reflectance=0, .roughness=1, .albedo=(Vector3) {1, 0.4, 0}}, (Vector3) {3, 5, 3}, 1));
#elif 1 #elif 0
// add_object(cube ((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=0, .roughness=0, .albedo=(Vector3) {1, 0.3, 0.3}}, (Vector3) {0, 0, 0}, (Vector3) {10, 5, 0.1})); // add_object(cube ((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=0, .roughness=0, .albedo=(Vector3) {1, 0.3, 0.3}}, (Vector3) {0, 0, 0}, (Vector3) {10, 5, 0.1}));
// add_object(cube ((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=0, .roughness=0.6, .albedo=(Vector3) {0.3, 1, 0.3}}, (Vector3) {0, 0, 0}, (Vector3) {0.1, 5, 10})); // add_object(cube ((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=0, .roughness=0.6, .albedo=(Vector3) {0.3, 1, 0.3}}, (Vector3) {0, 0, 0}, (Vector3) {0.1, 5, 10}));
add_object(cube ((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=0, .roughness=1, .albedo=(Vector3) {0.4, 0.3, 0.9}}, (Vector3) {0, -0.1, 0}, (Vector3) {10, 0.1, 10})); add_object(cube ((Material) {.emission_color={0}, .emission_power=0, .metallic=0, .reflectance=0, .roughness=1, .albedo=(Vector3) {0.4, 0.3, 0.9}}, (Vector3) {0, -0.1, 0}, (Vector3) {10, 0.1, 10}));
@@ -1111,7 +1135,10 @@ int main(void)
int num_workers = 0; int num_workers = 0;
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
os_thread_create(&workers[i], NULL, worker); int init_scale = 1 << i;
if (init_scale > 16)
init_scale = 1;
os_thread_create(&workers[i], (void*) init_scale, worker);
num_workers++; num_workers++;
} }