From 68cd58f038ff5f1d5ab6971a7a413abc419f07e1 Mon Sep 17 00:00:00 2001 From: zomseffen <steffen@tom.bi> Date: Thu, 5 Jun 2025 13:45:46 +0200 Subject: [PATCH] depth ordering volumetrics --- shaders/compiled/frag_rt_quad.spv | Bin 75396 -> 79752 bytes shaders/rt_lib.frag | 353 +++++++++++++++++------------ shaders/rt_quad.frag | 354 ++++++++++++++++++------------ 3 files changed, 415 insertions(+), 292 deletions(-) diff --git a/shaders/compiled/frag_rt_quad.spv b/shaders/compiled/frag_rt_quad.spv index 2cb51676fe4ce25969e602887b6c40c458704b28..ed483a0278a02bd315d8bb39048283cb0c6542b4 100644 GIT binary patch literal 79752 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 literal 75396 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ΕymN-j*)yg<a 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 H=g<EDF?wh9 diff --git a/shaders/rt_lib.frag b/shaders/rt_lib.frag index bc293db..e2acfd1 100644 --- a/shaders/rt_lib.frag +++ b/shaders/rt_lib.frag @@ -36,7 +36,8 @@ float pos_infinity = uintBitsToFloat(0x7F800000); // set limit for maximal iterations uint max_iterations = max_num_lights * max_iterations_per_light * raster_points; uint iteration_num = 0; -uint max_num_compounds = scene_info.infos[6]; +const uint absolute_max_compounds = 10; +uint max_num_compounds = min(scene_info.infos[6], absolute_max_compounds); uvec4 unpack_color(uint val) { // left most 8 bits first @@ -311,20 +312,39 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl vec3 color_mul_transparent; uint next_volumetric_index = 0; - uint[5] done_volumetrics; - for (int i=0; i < 5; i++) { + uint[absolute_max_compounds] done_volumetrics; + for (int i=0; i < max_num_compounds; i++) { done_volumetrics[i] = 0; } + uint[absolute_max_compounds] compound_starts; + float[absolute_max_compounds] hit_factors; + bool[absolute_max_compounds] is_x_hits; + bool[absolute_max_compounds] is_y_hits; + bool[absolute_max_compounds] is_z_hits; + bool[absolute_max_compounds] hits_inside; + while (iteration_num < max_iterations) { iteration_num ++; + for (int i=0; i < max_num_compounds; i++) { + compound_starts[i] = 0; + hit_factors[i] = 0.0; + is_x_hits[i] = false; + is_y_hits[i] = false; + is_z_hits[i] = false; + hits_inside[i] = false; + } + uint compound_num = 0; + // go over the borders by this amount + float overstep = 0.00001 / length(direction); + uint hits = 0; while (scene_info.infos[volume_index + 6 + max_num_lights + compound_num] != 0 && compound_num < max_num_compounds && iteration_num < max_iterations && !result.has_hit) { uint compound_start = scene_info.infos[volume_index + 6 + max_num_lights + compound_num]; bool already_checked = false; - for (int i=0; i < 5; i++) { + for (int i=0; i < max_num_compounds; i++) { if (compound_start == done_volumetrics[i]) { already_checked = true; break; @@ -334,8 +354,6 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl compound_num += 1; continue; } - done_volumetrics[next_volumetric_index] = compound_start; - next_volumetric_index = (next_volumetric_index + 1) % 5; //iteration_num ++; uint oct_tree_index = compounds[compound_start + 8]; @@ -347,9 +365,6 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl float y_border = compound_pos.y + float((compound_grid_size) * uint(!y_pos)) * compound_scale; float z_border = compound_pos.z + float((compound_grid_size) * uint(!z_pos)) * compound_scale; - // go over the borders by this amount - float overstep = 0.00001 / length(direction); - if (!x_null) { x_factor = (x_border - pos.x) / direction.x; } else { @@ -369,15 +384,18 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl y_factor += overstep; z_factor += overstep; - vec3 intersection_pos = pos; + vec3 intersection_pos = pos + 10.0 * overstep * direction; bool is_x_hit = false; bool is_y_hit = false; bool is_z_hit = false; bool hit_inside = false; + float hit_factor; + // check that either the hit is in range or we are inside of the compound from the start if ((compound_pos.x <= intersection_pos.x && intersection_pos.x <= compound_pos.x + float(compound_grid_size) * compound_scale) && (compound_pos.y <= intersection_pos.y && intersection_pos.y <= compound_pos.y + float(compound_grid_size) * compound_scale) && (compound_pos.z <= intersection_pos.z && intersection_pos.z <= compound_pos.z + float(compound_grid_size) * compound_scale)){ - //hit_inside = true; + hit_inside = true; + hit_factor = 10.0 * overstep; } else { vec3 intersection_pos_x = pos + x_factor * direction; vec3 intersection_pos_y = pos + y_factor * direction; @@ -388,6 +406,7 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl hit_inside = true; is_x_hit = true; intersection_pos = intersection_pos_x; + hit_factor = x_factor; } if ((compound_pos.x <= intersection_pos_y.x && intersection_pos_y.x <= compound_pos.x + float(compound_grid_size) * compound_scale) && @@ -396,6 +415,7 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl hit_inside = true; is_y_hit = true; intersection_pos = intersection_pos_y; + hit_factor = y_factor; } if ((compound_pos.x <= intersection_pos_z.x && intersection_pos_z.x <= compound_pos.x + float(compound_grid_size) * compound_scale) && @@ -404,149 +424,185 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl hit_inside = true; is_z_hit = true; intersection_pos = intersection_pos_z; + hit_factor = z_factor; } } - // check that either the hit is in range or we are inside of the compound from the start - if (hit_inside) { - vec3 oct_tree_pos = vec3(compound_pos); - uint current_size = compound_grid_size; - vec3 mid_point = oct_tree_pos + float(current_size / 2) * vec3(compound_scale, compound_scale, compound_scale); - bool children_open[8] = {true, true, true, true, true, true, true, true}; - uint oct_tree_address = oct_tree_index; - // iterate through the oct_tree - uint check_it = 0; - uint max_check_it = 60; - uint prev_child = 0; - uint prev_prev_child = 0; + compound_starts[hits] = compound_start; + hit_factors[hits] = hit_factor; + is_x_hits[hits] = is_x_hit; + is_y_hits[hits] = is_y_hit; + is_z_hits[hits] = is_z_hit; + hits_inside[hits] = hit_inside; + hits += 1 * uint(hit_inside); - uvec3 grid_pos = uvec3(0, 0, 0); - uvec3 parent_pos = uvec3(0, 0, 0); - - bool has_moved = false; - while (!result.has_hit && check_it < max_check_it) { - // failsafe to get out in case has_moved runs into an accuracy issue - check_it ++; - oct_tree_pos = vec3(grid_pos) * compound_scale + compound_pos; - mid_point = oct_tree_pos + (float(current_size / 2) * vec3(compound_scale, compound_scale, compound_scale)); - - uint child_index = next_oct_tree_child(mid_point, intersection_pos, children_open); - if (child_index == 0) { - // go up to parent - // if parent is 0 abort, as we have reached the root node again and try to exit it - if (oct_tree_mem[oct_tree_address] == 0) { - break; - } - for (int i=0; i < 8; i++) { - children_open[i] = true; - } - uint parent_index = oct_tree_mem[oct_tree_address]; - // check which child we came from - child_index = 1 * uint(oct_tree_address == oct_tree_mem[parent_index + 1]) + 2 * uint(oct_tree_address == oct_tree_mem[parent_index + 2]) + 3 * uint(oct_tree_address == oct_tree_mem[parent_index + 3]) + 4 * uint(oct_tree_address == oct_tree_mem[parent_index + 4]) + 5 * uint(oct_tree_address == oct_tree_mem[parent_index + 5]) + 6 * uint(oct_tree_address == oct_tree_mem[parent_index + 6]) + 7 * uint(oct_tree_address == oct_tree_mem[parent_index + 7]) + 8 * uint(oct_tree_address == oct_tree_mem[parent_index + 8]); - // mark as done to avoid reinvestigating, since intersection_pos is on its edge - children_open[child_index - 1] = false; - prev_prev_child = prev_child; - prev_child = oct_tree_address; - - uvec3 back_vec = parent_child_vec(current_size, child_index); - grid_pos -= parent_child_vec(current_size, child_index); - current_size *= 2; - oct_tree_address = parent_index; - } else { - // go down into child - if (current_size == 2) { - // check block if hit break - if (oct_tree_mem[oct_tree_address + child_index] != 0) { - result.has_hit = true; - result.end_color = unpack_color(oct_tree_mem[oct_tree_address + child_index]); - break; - } - } else { - // check if the child has content, else skip to next child of current parent - uint x = oct_tree_mem[oct_tree_address + child_index]; - if (oct_tree_mem[x] != 0) { - // change base address and position to child - current_size /= 2; - oct_tree_address = x; - grid_pos += parent_child_vec(current_size, child_index); - for (int i=0; i < 8; i++) { - children_open[i] = true; - } - continue; - } - } - children_open[child_index - 1] = false; - - // we did not go deeper or had a hit, so intersection pos needs to be updated - // new intersection pos calc - vec3 offset = vec3(parent_child_vec(current_size / 2, child_index)) * compound_scale; - vec3 low = oct_tree_pos + offset; - float x_border = low.x + float((compound_scale * current_size / 2) * uint(x_pos)); - float y_border = low.y + float((compound_scale * current_size / 2) * uint(y_pos)); - float z_border = low.z + float((compound_scale * current_size / 2) * uint(z_pos)); - - if (!x_null) { - x_factor = (x_border - pos.x) / direction.x; - if (x_factor <= 0.0) { - x_factor = max_factor; - } - } else { - x_factor = max_factor; - } - if (!y_null) { - y_factor = (y_border - pos.y) / direction.y; - if (y_factor <= 0.0) { - y_factor = max_factor; - } - } else { - y_factor = max_factor; - } - if (!z_null) { - z_factor = (z_border - pos.z) / direction.z; - if (z_factor <= 0.0) { - z_factor = max_factor; - } - } else { - z_factor = max_factor; - } - float smallest_factor = min(min(x_factor, y_factor), z_factor); - - if (x_factor == smallest_factor) { - is_x_hit = true; - is_y_hit = false; - is_z_hit = false; - } - if (y_factor == smallest_factor) { - is_x_hit = false; - is_y_hit = true; - is_z_hit = false; - } - if (z_factor == smallest_factor) { - is_x_hit = false; - is_y_hit = false; - is_z_hit = true; - } - - // move a bit further to fully enter the next quadrant - smallest_factor += overstep; - - //has_moved = length(intersection_pos - (pos + smallest_factor * direction)) >= 0.00001; - has_moved = intersection_pos != (pos + smallest_factor * direction); - intersection_pos = pos + smallest_factor * direction; - } - } - - uint hit_facing = uint(is_x_hit) * (2 + uint(x_pos)) + uint(is_y_hit) * (4 + uint(y_pos)) + uint(is_z_hit && !z_pos); - //result.has_hit = true; - result.end_pos = intersection_pos; - result.end_facing = hit_facing; - result.end_volume = volume_index; - result.end_direction = direction; - } + done_volumetrics[next_volumetric_index] = compound_start; + next_volumetric_index = (next_volumetric_index + 1) % max_num_compounds; compound_num += 1; } + for (int i =0; i < hits; i++) { + if (result.has_hit) { + break; + } + // find encounters in order + float min_factor = max_factor; + uint min_index = 0; + for (int j = 0; j < hits; j++) { + if (hit_factors[j] < min_factor) { + min_factor = hit_factors[j]; + min_index = j; + } + } + // set up the compound + uint compound_start = compound_starts[min_index]; + bool is_x_hit = is_x_hits[min_index]; + bool is_y_hit = is_y_hits[min_index]; + bool is_z_hit = is_z_hits[min_index]; + uint oct_tree_index = compounds[compound_start + 8]; + uint compound_grid_size = compounds[compound_start]; + float compound_scale = uintBitsToFloat(compounds[compound_start + 1]); + vec3 compound_pos = vec3(uintBitsToFloat(compounds[compound_start + 5]), uintBitsToFloat(compounds[compound_start + 6]), uintBitsToFloat(compounds[compound_start + 7])); + vec3 intersection_pos = pos + hit_factors[min_index] * direction; + // invalidate the min found + hit_factors[min_index] = max_factor; + + vec3 oct_tree_pos = vec3(compound_pos); + uint current_size = compound_grid_size; + vec3 mid_point = oct_tree_pos + float(current_size / 2) * vec3(compound_scale, compound_scale, compound_scale); + bool children_open[8] = {true, true, true, true, true, true, true, true}; + uint oct_tree_address = oct_tree_index; + // iterate through the oct_tree + uint check_it = 0; + uint max_check_it = 60; + uint prev_child = 0; + uint prev_prev_child = 0; + + uvec3 grid_pos = uvec3(0, 0, 0); + uvec3 parent_pos = uvec3(0, 0, 0); + + bool has_moved = false; + while (!result.has_hit && check_it < max_check_it) { + // failsafe to get out in case has_moved runs into an accuracy issue + check_it ++; + oct_tree_pos = vec3(grid_pos) * compound_scale + compound_pos; + mid_point = oct_tree_pos + (float(current_size / 2) * vec3(compound_scale, compound_scale, compound_scale)); + + uint child_index = next_oct_tree_child(mid_point, intersection_pos, children_open); + if (child_index == 0) { + // go up to parent + // if parent is 0 abort, as we have reached the root node again and try to exit it + if (oct_tree_mem[oct_tree_address] == 0) { + break; + } + for (int i=0; i < 8; i++) { + children_open[i] = true; + } + uint parent_index = oct_tree_mem[oct_tree_address]; + // check which child we came from + child_index = 1 * uint(oct_tree_address == oct_tree_mem[parent_index + 1]) + 2 * uint(oct_tree_address == oct_tree_mem[parent_index + 2]) + 3 * uint(oct_tree_address == oct_tree_mem[parent_index + 3]) + 4 * uint(oct_tree_address == oct_tree_mem[parent_index + 4]) + 5 * uint(oct_tree_address == oct_tree_mem[parent_index + 5]) + 6 * uint(oct_tree_address == oct_tree_mem[parent_index + 6]) + 7 * uint(oct_tree_address == oct_tree_mem[parent_index + 7]) + 8 * uint(oct_tree_address == oct_tree_mem[parent_index + 8]); + // mark as done to avoid reinvestigating, since intersection_pos is on its edge + children_open[child_index - 1] = false; + prev_prev_child = prev_child; + prev_child = oct_tree_address; + + uvec3 back_vec = parent_child_vec(current_size, child_index); + grid_pos -= parent_child_vec(current_size, child_index); + current_size *= 2; + oct_tree_address = parent_index; + } else { + // go down into child + if (current_size == 2) { + // check block if hit break + if (oct_tree_mem[oct_tree_address + child_index] != 0) { + result.has_hit = true; + result.end_color = unpack_color(oct_tree_mem[oct_tree_address + child_index]); + break; + } + } else { + // check if the child has content, else skip to next child of current parent + uint x = oct_tree_mem[oct_tree_address + child_index]; + if (oct_tree_mem[x] != 0) { + // change base address and position to child + current_size /= 2; + oct_tree_address = x; + grid_pos += parent_child_vec(current_size, child_index); + for (int i=0; i < 8; i++) { + children_open[i] = true; + } + continue; + } + } + children_open[child_index - 1] = false; + + // we did not go deeper or had a hit, so intersection pos needs to be updated + // new intersection pos calc + vec3 offset = vec3(parent_child_vec(current_size / 2, child_index)) * compound_scale; + vec3 low = oct_tree_pos + offset; + float x_border = low.x + float((compound_scale * current_size / 2) * uint(x_pos)); + float y_border = low.y + float((compound_scale * current_size / 2) * uint(y_pos)); + float z_border = low.z + float((compound_scale * current_size / 2) * uint(z_pos)); + + if (!x_null) { + x_factor = (x_border - pos.x) / direction.x; + if (x_factor <= 0.0) { + x_factor = max_factor; + } + } else { + x_factor = max_factor; + } + if (!y_null) { + y_factor = (y_border - pos.y) / direction.y; + if (y_factor <= 0.0) { + y_factor = max_factor; + } + } else { + y_factor = max_factor; + } + if (!z_null) { + z_factor = (z_border - pos.z) / direction.z; + if (z_factor <= 0.0) { + z_factor = max_factor; + } + } else { + z_factor = max_factor; + } + float smallest_factor = min(min(x_factor, y_factor), z_factor); + + if (x_factor == smallest_factor) { + is_x_hit = true; + is_y_hit = false; + is_z_hit = false; + } + if (y_factor == smallest_factor) { + is_x_hit = false; + is_y_hit = true; + is_z_hit = false; + } + if (z_factor == smallest_factor) { + is_x_hit = false; + is_y_hit = false; + is_z_hit = true; + } + + // move a bit further to fully enter the next quadrant + smallest_factor += overstep; + + //has_moved = length(intersection_pos - (pos + smallest_factor * direction)) >= 0.00001; + has_moved = intersection_pos != (pos + smallest_factor * direction); + intersection_pos = pos + smallest_factor * direction; + } + } + + uint hit_facing = uint(is_x_hit) * (2 + uint(x_pos)) + uint(is_y_hit) * (4 + uint(y_pos)) + uint(is_z_hit && !z_pos); + //result.has_hit = true; + result.end_pos = intersection_pos; + result.end_facing = hit_facing; + result.end_volume = volume_index; + result.end_direction = direction; + } + if (result.has_hit) { break; } @@ -667,6 +723,11 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl z_pos = direction.z > 0.0; z_null = (direction.z == 0.0); + + // clear volumetrics for reevaluation + for (int i=0; i < max_num_compounds; i++) { + done_volumetrics[i] = 0; + } } else { break; } diff --git a/shaders/rt_quad.frag b/shaders/rt_quad.frag index d5f4a7b..5fad61a 100644 --- a/shaders/rt_quad.frag +++ b/shaders/rt_quad.frag @@ -47,7 +47,8 @@ float pos_infinity = uintBitsToFloat(0x7F800000); // set limit for maximal iterations uint max_iterations = max_num_lights * max_iterations_per_light * raster_points; uint iteration_num = 0; -uint max_num_compounds = scene_info.infos[6]; +const uint absolute_max_compounds = 10; +uint max_num_compounds = min(scene_info.infos[6], absolute_max_compounds); uvec4 unpack_color(uint val) { // left most 8 bits first @@ -322,20 +323,40 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl vec3 color_mul_transparent; uint next_volumetric_index = 0; - uint[5] done_volumetrics; - for (int i=0; i < 5; i++) { + uint[absolute_max_compounds] done_volumetrics; + for (int i=0; i < max_num_compounds; i++) { done_volumetrics[i] = 0; } + uint[absolute_max_compounds] compound_starts; + float[absolute_max_compounds] hit_factors; + bool[absolute_max_compounds] is_x_hits; + bool[absolute_max_compounds] is_y_hits; + bool[absolute_max_compounds] is_z_hits; + bool[absolute_max_compounds] hits_inside; + while (iteration_num < max_iterations) { iteration_num ++; + for (int i=0; i < max_num_compounds; i++) { + compound_starts[i] = 0; + hit_factors[i] = 0.0; + is_x_hits[i] = false; + is_y_hits[i] = false; + is_z_hits[i] = false; + hits_inside[i] = false; + } + uint compound_num = 0; + // go over the borders by this amount + float overstep = 0.00001 / length(direction); + uint hits = 0; + // todo needs depth ordering of volumetrics inside of the volume while (scene_info.infos[volume_index + 6 + max_num_lights + compound_num] != 0 && compound_num < max_num_compounds && iteration_num < max_iterations && !result.has_hit) { uint compound_start = scene_info.infos[volume_index + 6 + max_num_lights + compound_num]; bool already_checked = false; - for (int i=0; i < 5; i++) { + for (int i=0; i < max_num_compounds; i++) { if (compound_start == done_volumetrics[i]) { already_checked = true; break; @@ -345,8 +366,6 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl compound_num += 1; continue; } - done_volumetrics[next_volumetric_index] = compound_start; - next_volumetric_index = (next_volumetric_index + 1) % 5; //iteration_num ++; uint oct_tree_index = compounds[compound_start + 8]; @@ -358,9 +377,6 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl float y_border = compound_pos.y + float((compound_grid_size) * uint(!y_pos)) * compound_scale; float z_border = compound_pos.z + float((compound_grid_size) * uint(!z_pos)) * compound_scale; - // go over the borders by this amount - float overstep = 0.00001 / length(direction); - if (!x_null) { x_factor = (x_border - pos.x) / direction.x; } else { @@ -380,15 +396,18 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl y_factor += overstep; z_factor += overstep; - vec3 intersection_pos = pos; + vec3 intersection_pos = pos + 10.0 * overstep * direction; bool is_x_hit = false; bool is_y_hit = false; bool is_z_hit = false; bool hit_inside = false; + float hit_factor; + // check that either the hit is in range or we are inside of the compound from the start if ((compound_pos.x <= intersection_pos.x && intersection_pos.x <= compound_pos.x + float(compound_grid_size) * compound_scale) && (compound_pos.y <= intersection_pos.y && intersection_pos.y <= compound_pos.y + float(compound_grid_size) * compound_scale) && (compound_pos.z <= intersection_pos.z && intersection_pos.z <= compound_pos.z + float(compound_grid_size) * compound_scale)){ - //hit_inside = true; + hit_inside = true; + hit_factor = 10.0 * overstep; } else { vec3 intersection_pos_x = pos + x_factor * direction; vec3 intersection_pos_y = pos + y_factor * direction; @@ -399,6 +418,7 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl hit_inside = true; is_x_hit = true; intersection_pos = intersection_pos_x; + hit_factor = x_factor; } if ((compound_pos.x <= intersection_pos_y.x && intersection_pos_y.x <= compound_pos.x + float(compound_grid_size) * compound_scale) && @@ -407,6 +427,7 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl hit_inside = true; is_y_hit = true; intersection_pos = intersection_pos_y; + hit_factor = y_factor; } if ((compound_pos.x <= intersection_pos_z.x && intersection_pos_z.x <= compound_pos.x + float(compound_grid_size) * compound_scale) && @@ -415,149 +436,185 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl hit_inside = true; is_z_hit = true; intersection_pos = intersection_pos_z; + hit_factor = z_factor; } } - // check that either the hit is in range or we are inside of the compound from the start - if (hit_inside) { - vec3 oct_tree_pos = vec3(compound_pos); - uint current_size = compound_grid_size; - vec3 mid_point = oct_tree_pos + float(current_size / 2) * vec3(compound_scale, compound_scale, compound_scale); - bool children_open[8] = {true, true, true, true, true, true, true, true}; - uint oct_tree_address = oct_tree_index; - // iterate through the oct_tree - uint check_it = 0; - uint max_check_it = 60; - uint prev_child = 0; - uint prev_prev_child = 0; + compound_starts[hits] = compound_start; + hit_factors[hits] = hit_factor; + is_x_hits[hits] = is_x_hit; + is_y_hits[hits] = is_y_hit; + is_z_hits[hits] = is_z_hit; + hits_inside[hits] = hit_inside; + hits += 1 * uint(hit_inside); - uvec3 grid_pos = uvec3(0, 0, 0); - uvec3 parent_pos = uvec3(0, 0, 0); - - bool has_moved = false; - while (!result.has_hit && check_it < max_check_it) { - // failsafe to get out in case has_moved runs into an accuracy issue - check_it ++; - oct_tree_pos = vec3(grid_pos) * compound_scale + compound_pos; - mid_point = oct_tree_pos + (float(current_size / 2) * vec3(compound_scale, compound_scale, compound_scale)); - - uint child_index = next_oct_tree_child(mid_point, intersection_pos, children_open); - if (child_index == 0) { - // go up to parent - // if parent is 0 abort, as we have reached the root node again and try to exit it - if (oct_tree_mem[oct_tree_address] == 0) { - break; - } - for (int i=0; i < 8; i++) { - children_open[i] = true; - } - uint parent_index = oct_tree_mem[oct_tree_address]; - // check which child we came from - child_index = 1 * uint(oct_tree_address == oct_tree_mem[parent_index + 1]) + 2 * uint(oct_tree_address == oct_tree_mem[parent_index + 2]) + 3 * uint(oct_tree_address == oct_tree_mem[parent_index + 3]) + 4 * uint(oct_tree_address == oct_tree_mem[parent_index + 4]) + 5 * uint(oct_tree_address == oct_tree_mem[parent_index + 5]) + 6 * uint(oct_tree_address == oct_tree_mem[parent_index + 6]) + 7 * uint(oct_tree_address == oct_tree_mem[parent_index + 7]) + 8 * uint(oct_tree_address == oct_tree_mem[parent_index + 8]); - // mark as done to avoid reinvestigating, since intersection_pos is on its edge - children_open[child_index - 1] = false; - prev_prev_child = prev_child; - prev_child = oct_tree_address; - - uvec3 back_vec = parent_child_vec(current_size, child_index); - grid_pos -= parent_child_vec(current_size, child_index); - current_size *= 2; - oct_tree_address = parent_index; - } else { - // go down into child - if (current_size == 2) { - // check block if hit break - if (oct_tree_mem[oct_tree_address + child_index] != 0) { - result.has_hit = true; - result.end_color = unpack_color(oct_tree_mem[oct_tree_address + child_index]); - break; - } - } else { - // check if the child has content, else skip to next child of current parent - uint x = oct_tree_mem[oct_tree_address + child_index]; - if (oct_tree_mem[x] != 0) { - // change base address and position to child - current_size /= 2; - oct_tree_address = x; - grid_pos += parent_child_vec(current_size, child_index); - for (int i=0; i < 8; i++) { - children_open[i] = true; - } - continue; - } - } - children_open[child_index - 1] = false; - - // we did not go deeper or had a hit, so intersection pos needs to be updated - // new intersection pos calc - vec3 offset = vec3(parent_child_vec(current_size / 2, child_index)) * compound_scale; - vec3 low = oct_tree_pos + offset; - float x_border = low.x + float((compound_scale * current_size / 2) * uint(x_pos)); - float y_border = low.y + float((compound_scale * current_size / 2) * uint(y_pos)); - float z_border = low.z + float((compound_scale * current_size / 2) * uint(z_pos)); - - if (!x_null) { - x_factor = (x_border - pos.x) / direction.x; - if (x_factor <= 0.0) { - x_factor = max_factor; - } - } else { - x_factor = max_factor; - } - if (!y_null) { - y_factor = (y_border - pos.y) / direction.y; - if (y_factor <= 0.0) { - y_factor = max_factor; - } - } else { - y_factor = max_factor; - } - if (!z_null) { - z_factor = (z_border - pos.z) / direction.z; - if (z_factor <= 0.0) { - z_factor = max_factor; - } - } else { - z_factor = max_factor; - } - float smallest_factor = min(min(x_factor, y_factor), z_factor); - - if (x_factor == smallest_factor) { - is_x_hit = true; - is_y_hit = false; - is_z_hit = false; - } - if (y_factor == smallest_factor) { - is_x_hit = false; - is_y_hit = true; - is_z_hit = false; - } - if (z_factor == smallest_factor) { - is_x_hit = false; - is_y_hit = false; - is_z_hit = true; - } - - // move a bit further to fully enter the next quadrant - smallest_factor += overstep; - - //has_moved = length(intersection_pos - (pos + smallest_factor * direction)) >= 0.00001; - has_moved = intersection_pos != (pos + smallest_factor * direction); - intersection_pos = pos + smallest_factor * direction; - } - } - - uint hit_facing = uint(is_x_hit) * (2 + uint(x_pos)) + uint(is_y_hit) * (4 + uint(y_pos)) + uint(is_z_hit && !z_pos); - //result.has_hit = true; - result.end_pos = intersection_pos; - result.end_facing = hit_facing; - result.end_volume = volume_index; - result.end_direction = direction; - } + done_volumetrics[next_volumetric_index] = compound_start; + next_volumetric_index = (next_volumetric_index + 1) % max_num_compounds; compound_num += 1; } + for (int i =0; i < hits; i++) { + if (result.has_hit) { + break; + } + // find encounters in order + float min_factor = max_factor; + uint min_index = 0; + for (int j = 0; j < hits; j++) { + if (hit_factors[j] < min_factor) { + min_factor = hit_factors[j]; + min_index = j; + } + } + // set up the compound + uint compound_start = compound_starts[min_index]; + bool is_x_hit = is_x_hits[min_index]; + bool is_y_hit = is_y_hits[min_index]; + bool is_z_hit = is_z_hits[min_index]; + uint oct_tree_index = compounds[compound_start + 8]; + uint compound_grid_size = compounds[compound_start]; + float compound_scale = uintBitsToFloat(compounds[compound_start + 1]); + vec3 compound_pos = vec3(uintBitsToFloat(compounds[compound_start + 5]), uintBitsToFloat(compounds[compound_start + 6]), uintBitsToFloat(compounds[compound_start + 7])); + vec3 intersection_pos = pos + hit_factors[min_index] * direction; + // invalidate the min found + hit_factors[min_index] = max_factor; + + vec3 oct_tree_pos = vec3(compound_pos); + uint current_size = compound_grid_size; + vec3 mid_point = oct_tree_pos + float(current_size / 2) * vec3(compound_scale, compound_scale, compound_scale); + bool children_open[8] = {true, true, true, true, true, true, true, true}; + uint oct_tree_address = oct_tree_index; + // iterate through the oct_tree + uint check_it = 0; + uint max_check_it = 60; + uint prev_child = 0; + uint prev_prev_child = 0; + + uvec3 grid_pos = uvec3(0, 0, 0); + uvec3 parent_pos = uvec3(0, 0, 0); + + bool has_moved = false; + while (!result.has_hit && check_it < max_check_it) { + // failsafe to get out in case has_moved runs into an accuracy issue + check_it ++; + oct_tree_pos = vec3(grid_pos) * compound_scale + compound_pos; + mid_point = oct_tree_pos + (float(current_size / 2) * vec3(compound_scale, compound_scale, compound_scale)); + + uint child_index = next_oct_tree_child(mid_point, intersection_pos, children_open); + if (child_index == 0) { + // go up to parent + // if parent is 0 abort, as we have reached the root node again and try to exit it + if (oct_tree_mem[oct_tree_address] == 0) { + break; + } + for (int i=0; i < 8; i++) { + children_open[i] = true; + } + uint parent_index = oct_tree_mem[oct_tree_address]; + // check which child we came from + child_index = 1 * uint(oct_tree_address == oct_tree_mem[parent_index + 1]) + 2 * uint(oct_tree_address == oct_tree_mem[parent_index + 2]) + 3 * uint(oct_tree_address == oct_tree_mem[parent_index + 3]) + 4 * uint(oct_tree_address == oct_tree_mem[parent_index + 4]) + 5 * uint(oct_tree_address == oct_tree_mem[parent_index + 5]) + 6 * uint(oct_tree_address == oct_tree_mem[parent_index + 6]) + 7 * uint(oct_tree_address == oct_tree_mem[parent_index + 7]) + 8 * uint(oct_tree_address == oct_tree_mem[parent_index + 8]); + // mark as done to avoid reinvestigating, since intersection_pos is on its edge + children_open[child_index - 1] = false; + prev_prev_child = prev_child; + prev_child = oct_tree_address; + + uvec3 back_vec = parent_child_vec(current_size, child_index); + grid_pos -= parent_child_vec(current_size, child_index); + current_size *= 2; + oct_tree_address = parent_index; + } else { + // go down into child + if (current_size == 2) { + // check block if hit break + if (oct_tree_mem[oct_tree_address + child_index] != 0) { + result.has_hit = true; + result.end_color = unpack_color(oct_tree_mem[oct_tree_address + child_index]); + break; + } + } else { + // check if the child has content, else skip to next child of current parent + uint x = oct_tree_mem[oct_tree_address + child_index]; + if (oct_tree_mem[x] != 0) { + // change base address and position to child + current_size /= 2; + oct_tree_address = x; + grid_pos += parent_child_vec(current_size, child_index); + for (int i=0; i < 8; i++) { + children_open[i] = true; + } + continue; + } + } + children_open[child_index - 1] = false; + + // we did not go deeper or had a hit, so intersection pos needs to be updated + // new intersection pos calc + vec3 offset = vec3(parent_child_vec(current_size / 2, child_index)) * compound_scale; + vec3 low = oct_tree_pos + offset; + float x_border = low.x + float((compound_scale * current_size / 2) * uint(x_pos)); + float y_border = low.y + float((compound_scale * current_size / 2) * uint(y_pos)); + float z_border = low.z + float((compound_scale * current_size / 2) * uint(z_pos)); + + if (!x_null) { + x_factor = (x_border - pos.x) / direction.x; + if (x_factor <= 0.0) { + x_factor = max_factor; + } + } else { + x_factor = max_factor; + } + if (!y_null) { + y_factor = (y_border - pos.y) / direction.y; + if (y_factor <= 0.0) { + y_factor = max_factor; + } + } else { + y_factor = max_factor; + } + if (!z_null) { + z_factor = (z_border - pos.z) / direction.z; + if (z_factor <= 0.0) { + z_factor = max_factor; + } + } else { + z_factor = max_factor; + } + float smallest_factor = min(min(x_factor, y_factor), z_factor); + + if (x_factor == smallest_factor) { + is_x_hit = true; + is_y_hit = false; + is_z_hit = false; + } + if (y_factor == smallest_factor) { + is_x_hit = false; + is_y_hit = true; + is_z_hit = false; + } + if (z_factor == smallest_factor) { + is_x_hit = false; + is_y_hit = false; + is_z_hit = true; + } + + // move a bit further to fully enter the next quadrant + smallest_factor += overstep; + + //has_moved = length(intersection_pos - (pos + smallest_factor * direction)) >= 0.00001; + has_moved = intersection_pos != (pos + smallest_factor * direction); + intersection_pos = pos + smallest_factor * direction; + } + } + + uint hit_facing = uint(is_x_hit) * (2 + uint(x_pos)) + uint(is_y_hit) * (4 + uint(y_pos)) + uint(is_z_hit && !z_pos); + //result.has_hit = true; + result.end_pos = intersection_pos; + result.end_facing = hit_facing; + result.end_volume = volume_index; + result.end_direction = direction; + } + if (result.has_hit) { break; } @@ -678,6 +735,11 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl z_pos = direction.z > 0.0; z_null = (direction.z == 0.0); + + // clear volumetrics for reevaluation + for (int i=0; i < max_num_compounds; i++) { + done_volumetrics[i] = 0; + } } else { break; }