ogl_beamforming

Ultrasound Beamforming Implemented with OpenGL
git clone anongit@rnpnr.xyz:ogl_beamforming.git
Log | Files | Refs | Feed | Submodules | LICENSE

Commit: c02ab502868b59bcde040c1ae3ab24a176a9c2df
Parent: ba51d2eaa3468f41aa24be1cb14753561bbb7673
Author: Randy Palamar
Date:   Wed, 10 Jul 2024 08:56:25 -0600

send beamforming region in UBO

Diffstat:
Mbeamformer_parameters.h | 2++
Mhelpers/ogl_beamformer_lib.h | 1+
Mshaders/hadamard.glsl | 2++
Mshaders/uforces.glsl | 10+++++++---
4 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/beamformer_parameters.h b/beamformer_parameters.h @@ -7,6 +7,8 @@ typedef struct { u32 uforces_channels[128]; /* Channels used for virtual UFORCES elements */ uv4 rf_data_dim; /* Samples * Channels * Acquisitions; last element ignored */ uv4 output_points; /* Width * Height * Depth; last element ignored */ + v2 output_min_xz; /* [m] Top left corner of output region */ + v2 output_max_xz; /* [m] Bottom right corner of output region */ u32 channel_data_stride; /* Data points between channels (samples * acq + padding) */ u32 channel_offset; /* Offset into channel_mapping: 0 or 128 (rows or columns) */ f32 speed_of_sound; /* [m/s] */ diff --git a/helpers/ogl_beamformer_lib.h b/helpers/ogl_beamformer_lib.h @@ -19,6 +19,7 @@ typedef ptrdiff_t size; #define LIB_FN #endif +typedef struct { f32 x, y; } v2; typedef struct { u32 x, y, z, w; } uv4; #include "../beamformer_parameters.h" diff --git a/shaders/hadamard.glsl b/shaders/hadamard.glsl @@ -19,6 +19,8 @@ layout(std140, binding = 0) uniform parameters { uvec4 uforces_channels[32]; /* Channels used for virtual UFORCES elements */ uvec4 rf_data_dim; /* Samples * Channels * Acquisitions; last element ignored */ uvec4 output_points; /* Width * Height * Depth; last element ignored */ + vec2 output_min_xz; /* [m] Top left corner of output region */ + vec2 output_max_xz; /* [m] Bottom right corner of output region */ uint channel_data_stride; /* Data points between channels (samples * acq + padding) */ uint channel_offset; /* Offset into channel_mapping: 0 or 128 (rows or columns) */ float speed_of_sound; /* [m/s] */ diff --git a/shaders/uforces.glsl b/shaders/uforces.glsl @@ -11,6 +11,8 @@ layout(std140, binding = 0) uniform parameters { uvec4 uforces_channels[32]; /* Channels used for virtual UFORCES elements */ uvec4 rf_data_dim; /* Samples * Channels * Acquisitions; last element ignored */ uvec4 output_points; /* Width * Height * Depth; last element ignored */ + vec2 output_min_xz; /* [m] Top left corner of output region */ + vec2 output_max_xz; /* [m] Bottom right corner of output region */ uint channel_data_stride; /* Data points between channels (samples * acq + padding) */ uint channel_offset; /* Offset into channel_mapping: 0 or 128 (rows or columns) */ float speed_of_sound; /* [m/s] */ @@ -63,13 +65,14 @@ void main() vec2 xdc_upper_left = vec2(-0.0096, -0.0096); vec2 xdc_bottom_right = vec2( 0.0096, 0.0096); vec2 xdc_size = abs(xdc_upper_left - xdc_bottom_right); + vec2 output_size = abs(output_max_xz - output_min_xz); /* TODO: image extent can be different than xdc_size */ /* TODO: for now assume y-dimension is along transducer center */ vec3 image_point = vec3( - xdc_upper_left.x + pixel.x * xdc_size.x / out_data_dim.x, + output_min_xz.x + pixel.x * output_size.x / out_data_dim.x, 0, - pixel.y * 60e-3 / out_data_dim.y + 10e-3 + output_min_xz.y + pixel.y * output_size.y / out_data_dim.y ); /* TODO: Send this into the GPU */ @@ -80,8 +83,9 @@ void main() float dzsign = sign(image_point.z - focal_depth); float sum = 0; - /* NOTE: skip first acquisition since its garbage */ + uint ridx = rf_data_dim.y * rf_data_dim.x; + /* NOTE: skip first acquisition since its garbage */ for (uint i = 1; i < rf_data_dim.z; i++) { vec3 focal_point = vec3(sparse_elems[i - 1] * dx, 0, focal_depth); float transmit_dist = focal_depth + dzsign * distance(image_point, focal_point);