From 4a6dde4535d6b3787627f785d0c7d1b6f16d5701 Mon Sep 17 00:00:00 2001 From: zomseffen <steffen@tom.bi> Date: Fri, 7 Feb 2025 12:19:48 +0100 Subject: [PATCH] reflection for transparent objects --- shaders/compiled/frag_rt_quad.spv | Bin 41856 -> 43712 bytes shaders/rt_quad.frag | 34 +++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/shaders/compiled/frag_rt_quad.spv b/shaders/compiled/frag_rt_quad.spv index e329b50f31dd8c87aa00603e4e73614fdc96349b..8b8614a0b3ce271441a2226b28ab4daaee5436e2 100644 GIT binary patch literal 43712 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�CF`!g!@8K+%8 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 literal 41856 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 diff --git a/shaders/rt_quad.frag b/shaders/rt_quad.frag index 9fd62a9..7094bd4 100644 --- a/shaders/rt_quad.frag +++ b/shaders/rt_quad.frag @@ -31,6 +31,7 @@ uint max_iterations_per_light = scene_info.infos[1]; int half_diffuse_raster_steps = int(scene_info.infos[2]); float raster_distance = uintBitsToFloat(scene_info.infos[3]); int raster_points = (2 * half_diffuse_raster_steps + 1) * (2 * half_diffuse_raster_steps + 1); +float pos_infinity = uintBitsToFloat(0x7F800000); uvec4 unpack_color(uint val) { // left most 8 bits first @@ -194,6 +195,7 @@ struct Tracing { vec3 color_mul; uvec2 end_raster; + vec3 end_direction; bool has_transparent_hit; }; @@ -303,6 +305,7 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl result.color_mul = result.color_mul * vec3(float(color_sample.x) / 255.0, float(color_sample.y) / 255.0, float(color_sample.z) / 255.0); result.has_transparent_hit = true; result.end_volume = volume_index; + result.end_direction = direction; end_color_transparent = color_sample; end_raster_transparent = uvec2(u, v); @@ -321,6 +324,7 @@ Tracing trace_ray(uint volume_start, vec3 starting_pos, vec3 start_direction, fl result.end_raster = uvec2(u, v); result.has_hit = true; result.end_volume = volume_index; + result.end_direction = direction; float reflectivity = 1.0 - float(color_sample.w) / 255.0; vec3 refltective_color_mul = result.color_mul * vec3(float(color_sample.x) / 255.0, float(color_sample.y) / 255.0, float(color_sample.z) / 255.0); @@ -440,6 +444,20 @@ vec3 clamp_to_volume(uint volume_start, vec3 position) { return vec3(min(max(position.x, low_x_border), high_x_border), min(max(position.y, low_y_border), high_y_border), min(max(position.z, low_z_border), high_z_border)); } +vec3 add_reflection(vec3 view_vector, uint f, uint volume_start, vec3 pos, uvec4 color_sample, vec3 color_sum) { + vec3 orig_color_sample = vec3(float(color_sample.x) / 255.0, float(color_sample.y) / 255.0, float(color_sample.z) / 255.0); + + vec3 reflection_direction = reflect_vector(view_vector, f); + Tracing reflection_tracing = trace_ray(volume_start, pos, reflection_direction, pos_infinity, 0, max_iterations_per_light, true); + float reflectivity = 1.0 - float(color_sample.w) / 255.0; + if (reflection_tracing.has_hit || reflection_tracing.has_transparent_hit) { + vec3 color_from_reflection = diffuse_tracing(reflection_tracing.end_volume, reflection_tracing.end_raster, reflection_tracing.end_pos, reflection_tracing.end_facing) * orig_color_sample; + color_sum = color_sum * (1.0 - reflectivity) + color_from_reflection * reflectivity; + } + + return color_sum; +} + void main() { vec3 clamped_pos = clamp_to_volume(fragVolumeStart, origPosition); uvec4 color_roughness = sample_color_from_scene_info(fragVolumeStart, fragRasterPos, facing); @@ -447,31 +465,27 @@ void main() { vec3 color_sum; uint orig_neighbor = sample_neighbor_from_scene_info(fragVolumeStart, fragRasterPos, facing); - float pos_infinity = uintBitsToFloat(0x7F800000); if (orig_neighbor != 0) { + vec3 color_direct = diffuse_tracing(fragVolumeStart, fragRasterPos, clamped_pos, facing); + color_direct = add_reflection(normalize(clamped_pos - ubo.camera_pos), facing, fragVolumeStart, clamped_pos, color_roughness, color_direct); + Tracing t = trace_ray(fragVolumeStart, ubo.camera_pos, clamped_pos - ubo.camera_pos, pos_infinity, 0, max_iterations_per_light, false); float opacity = float(color_roughness.w) / 255.0; if (t.has_hit) { vec3 color_seen_through = diffuse_tracing(t.end_volume, t.end_raster, t.end_pos, t.end_facing) * orig_color_sample * t.color_mul; - vec3 color_direct = diffuse_tracing(fragVolumeStart, fragRasterPos, clamped_pos, facing); + color_seen_through = add_reflection(t.end_direction, t.end_facing, t.end_volume, t.end_pos, t.end_color, color_seen_through); + color_sum = opacity * color_direct + (1.0 - opacity) * color_seen_through; } else { // Todo: hit sky box - vec3 color_direct = diffuse_tracing(fragVolumeStart, fragRasterPos, clamped_pos, facing); color_sum = opacity * color_direct + (1.0 - opacity) * vec3(0.0, 0.0, 0.0); } } else { color_sum = diffuse_tracing(fragVolumeStart, fragRasterPos, clamped_pos, facing); - vec3 reflection_direction = reflect_vector(normalize(clamped_pos - ubo.camera_pos), facing); - Tracing reflection_tracing = trace_ray(fragVolumeStart, clamped_pos, reflection_direction, pos_infinity, 0, max_iterations_per_light, true); - float reflectivity = 1.0 - float(color_roughness.w) / 255.0; - if (reflection_tracing.has_hit || reflection_tracing.has_transparent_hit) { - vec3 color_from_reflection = diffuse_tracing(reflection_tracing.end_volume, reflection_tracing.end_raster, reflection_tracing.end_pos, reflection_tracing.end_facing) * orig_color_sample; - color_sum = color_sum * (1.0 - reflectivity) + color_from_reflection * reflectivity; - } + color_sum = add_reflection(normalize(clamped_pos - ubo.camera_pos), facing, fragVolumeStart, clamped_pos, color_roughness, color_sum); } outColor = vec4(color_sum, 1.0);