ogl_beamforming

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

Commit: 1b0b83be19180a8071ac6efdc4784b7d3e1bac72
Parent: de7f254f888a3f0632037bfee56993b28d42bc87
Author: Randy Palamar
Date:   Wed,  4 Mar 2026 21:28:03 -0700

das: prebake xdc_transform * voxel_transform for (u)FORCES

no need to do this extra math over and over again for every pixel

Diffstat:
Mbeamformer_core.c | 12++++++++----
Mbeamformer_internal.h | 2+-
Mshaders/das.glsl | 3+--
3 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/beamformer_core.c b/beamformer_core.c @@ -633,15 +633,19 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb) mem_copy(du->voxel_transform.E, pb->parameters.das_voxel_transform.E, sizeof(du->voxel_transform)); mem_copy(du->xdc_transform.E, pb->parameters.xdc_transform.E, sizeof(du->xdc_transform)); + u32 id = pb->parameters.acquisition_kind; + + if (id == BeamformerAcquisitionKind_UFORCES || id == BeamformerAcquisitionKind_FORCES) + du->voxel_transform = m4_mul(du->xdc_transform, du->voxel_transform); + + if (id == BeamformerAcquisitionKind_UFORCES || id == BeamformerAcquisitionKind_UHERCULES) + sd->bake.flags |= BeamformerShaderDASFlags_Sparse; + if (pb->parameters.single_focus) sd->bake.flags |= BeamformerShaderDASFlags_SingleFocus; if (pb->parameters.single_orientation) sd->bake.flags |= BeamformerShaderDASFlags_SingleOrientation; if (pb->parameters.coherency_weighting) sd->bake.flags |= BeamformerShaderDASFlags_CoherencyWeighting; else sd->bake.flags |= BeamformerShaderDASFlags_Fast; - u32 id = pb->parameters.acquisition_kind; - if (id == BeamformerAcquisitionKind_UFORCES || id == BeamformerAcquisitionKind_UHERCULES) - sd->bake.flags |= BeamformerShaderDASFlags_Sparse; - sd->layout = (uv3){{1, 1, 1}}; b32 has_x = cp->output_points.x > 1; diff --git a/beamformer_internal.h b/beamformer_internal.h @@ -101,8 +101,8 @@ typedef struct { /* X(name, type, gltype) */ #define BEAMFORMER_DAS_UBO_PARAM_LIST \ - X(voxel_transform, m4, mat4) \ X(xdc_transform, m4, mat4) \ + X(voxel_transform, m4, mat4) \ X(xdc_element_pitch, v2, vec2) typedef alignas(16) struct { diff --git a/shaders/das.glsl b/shaders/das.glsl @@ -251,13 +251,12 @@ RESULT_TYPE HERCULES(const vec3 world_point) return result; } -RESULT_TYPE FORCES(const vec3 world_point) +RESULT_TYPE FORCES(const vec3 xdc_world_point) { const int rx_channel_start = bool(Fast)? u_channel : 0; const int rx_channel_end = bool(Fast)? u_channel + 1 : ChannelCount; RESULT_TYPE result = RESULT_TYPE(0); - vec3 xdc_world_point = (xdc_transform * vec4(world_point, 1)).xyz; for (int rx_channel = rx_channel_start; rx_channel < rx_channel_end; rx_channel++) { float receive_distance = distance(xdc_world_point.xz, vec2(rx_channel * xdc_element_pitch.x, 0)); float a_arg = abs(FNumber * (xdc_world_point.x - rx_channel * xdc_element_pitch.x) /