Open3D (C++ API)  0.19.0
GaussianSplatDataPacking.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - Open3D: www.open3d.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.open3d.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 // CPU data structures and packing helpers shared by the OpenGL and Metal
9 // Gaussian splat compute backends. The structures mirror the std140/std430
10 // layouts expected by the GLSL/MSL compute shaders.
11 
12 #pragma once
13 
14 #include <Eigen/Core>
15 #include <Eigen/Geometry>
16 #include <cstdint>
17 #include <cstring>
18 #include <vector>
19 
22 
23 namespace open3d {
24 namespace visualization {
25 namespace rendering {
26 
27 // ----- GPU-compatible structure definitions ----------------------------------
28 // These must be tightly packed to match the std140/std430 GLSL layouts.
29 
31 struct Std430Vec4 {
32  float x = 0.f, y = 0.f, z = 0.f, w = 0.f;
33 };
34 
38 struct alignas(16) GaussianViewParams {
39  // mat4 world_from_model (row-major, 4 vec4)
40  float world_from_model[16];
41  // mat4 view_from_world
42  float view_from_world[16];
43  // mat4 clip_from_view
44  float clip_from_view[16];
45  // vec4 camera_position_and_near
47  // vec4 viewport_origin_and_size
49  // uvec4 scene (x=splat_count, y=gaussian_splat_sh_degree,
50  // z=antialias_flag, w=screen_y_down_flag)
52  // uvec4 tiles (xy=tile_size, zw=tile_count)
54  // uvec4 limits (x=entry_capacity, y=max_tiles_per_splat,
55  // z=max_tile_entries_total, w=tile_key_bits T = ceil(log2(tile_count)),
56  // clamped to [1,31]: T bits for tile index, (32-T) bits for depth)
58  // vec4 depth_range_and_flags (x=near, y=far, z=reserved, w=0)
60 };
61 static_assert(sizeof(GaussianViewParams) == 288,
62  "GaussianViewParams must be 288 bytes to match GLSL layout");
63 
74 struct alignas(16) ProjectedComposite {
76  float depth;
77  float alpha;
79  alignas(16) Std430Vec4 inv_basis;
80 };
81 static_assert(sizeof(ProjectedComposite) == 32,
82  "ProjectedComposite must be 32 bytes to match GLSL layout");
83 
90  0;
94 };
95 static_assert(sizeof(GaussianGpuCounters) == 4 * sizeof(std::uint32_t),
96  "GaussianGpuCounters must be 16 bytes");
97 static constexpr std::size_t kGaussianCounterCount =
98  sizeof(GaussianGpuCounters) / sizeof(std::uint32_t); // 4
99 
100 // Index constants for code that accesses the counters buffer as a raw uint32
101 // array rather than through the struct.
102 static constexpr std::size_t kGaussianCounterTotalEntriesIndex = 0;
103 static constexpr std::size_t kGaussianCounterErrorFlagsIndex = 1;
104 static constexpr std::size_t kGaussianCounterTileCountIndex = 2;
105 static constexpr std::size_t kGaussianCounterSplatCountIndex = 3;
106 
111 
112 // ----- CPU-side representation -----------------------------------------------
113 
123  std::vector<Std430Vec4> positions;
124  std::vector<std::uint32_t>
126  std::vector<std::uint32_t>
128  std::vector<std::uint32_t> dc_opacity;
129  std::vector<std::uint32_t>
134  std::vector<std::uint32_t> visibility_mask;
136  int sh_degree = 0;
137  bool antialias = false;
138 };
139 
143  const GaussianSplatPackedAttrs* attrs = nullptr;
144  bool visible = true;
145 };
146 
156  bool valid = false;
157 };
158 
159 // ----- GPU buffer sizing (absorbed from GaussianSplatBuffers) ----------------
160 
165 
183 };
184 
189 
190 // ----- Packing helpers -------------------------------------------------------
191 
196  const GaussianSplatPackedAttrs& attrs,
197  const GaussianSplatRenderer::ViewRenderData& render_data,
199 
218 void PackGaussianSplatAttrsDirect(const float* pts_ptr,
219  std::size_t n,
220  const float* scale_ptr,
221  const float* rot_ptr,
222  const float* f_dc_ptr,
223  const float* opacity_ptr,
224  const float* f_rest_ptr,
225  int source_sh_degree,
226  int desired_sh_degree,
227  float min_opacity_logit,
228  bool antialias,
230 
240  const std::vector<GaussianSplatMergeItem>& items,
242  std::vector<std::uint32_t>* splat_starts = nullptr);
243 
244 } // namespace rendering
245 } // namespace visualization
246 } // namespace open3d
const char const char value recording_handle imu_sample recording_handle uint8_t size_t data_size k4a_record_configuration_t config target_format k4a_capture_t capture_handle k4a_imu_sample_t imu_sample playback_handle k4a_logging_message_cb_t void min_level device_handle k4a_imu_sample_t timeout_in_ms capture_handle capture_handle capture_handle image_handle temperature_c k4a_image_t image_handle uint8_t image_handle image_handle image_handle image_handle uint32_t
Definition: K4aPlugin.cpp:548
const char const char value recording_handle imu_sample recording_handle uint8_t size_t data_size k4a_record_configuration_t config target_format k4a_capture_t capture_handle k4a_imu_sample_t imu_sample playback_handle k4a_logging_message_cb_t void min_level device_handle k4a_imu_sample_t timeout_in_ms capture_handle capture_handle capture_handle image_handle temperature_c k4a_image_t image_handle uint8_t image_handle image_handle image_handle image_handle image_handle timestamp_usec white_balance image_handle k4a_device_configuration_t config device_handle char size_t serial_number_size bool int32_t int32_t int32_t int32_t k4a_color_control_mode_t default_mode value const const k4a_calibration_t calibration char size_t
Definition: K4aPlugin.cpp:719
void PackGaussianSplatAttrsDirect(const float *pts_ptr, std::size_t n, const float *scale_ptr, const float *rot_ptr, const float *f_dc_ptr, const float *opacity_ptr, const float *f_rest_ptr, int source_sh_degree, int desired_sh_degree, float min_opacity_logit, bool antialias, GaussianSplatPackedAttrs &out)
Definition: GaussianSplatDataPacking.cpp:277
constexpr std::uint32_t kGaussianGpuErrorTileEntryOverflow
Definition: GaussianSplatDataPacking.h:107
constexpr std::uint32_t kGaussianGpuErrorKnownMask
Definition: GaussianSplatDataPacking.h:109
void MergeGaussianSplatPackedAttrs(const std::vector< GaussianSplatMergeItem > &items, GaussianSplatPackedAttrs *out, std::vector< std::uint32_t > *splat_starts)
Definition: GaussianSplatDataPacking.cpp:365
PackedGaussianScene PackGaussianViewParams(const GaussianSplatPackedAttrs &attrs, const GaussianSplatRenderer::ViewRenderData &render_data, const GaussianSplatRenderer::RenderConfig &config)
Definition: GaussianSplatDataPacking.cpp:185
constexpr std::uint32_t kGaussianRadixParamsStride
Definition: GaussianSplatDataPacking.h:164
constexpr std::uint32_t kGaussianGpuErrorSortCountClamped
Definition: GaussianSplatDataPacking.h:108
void ComputeGaussianGpuBufferSizes(const PackedGaussianScene &packed, GaussianGpuBufferSizes *out)
Definition: GaussianSplatDataPacking.cpp:148
Definition: PinholeCameraIntrinsic.cpp:16
Definition: GaussianSplatDataPacking.h:169
std::size_t radix_params_size
Definition: GaussianSplatDataPacking.h:180
std::size_t histogram_buf_size
Definition: GaussianSplatDataPacking.h:177
std::uint32_t radix_num_wg_cap
Definition: GaussianSplatDataPacking.h:182
std::size_t key_cap_size
Sort key/value ping-pong buffers (entry_capacity × 4 B each, ×2 arrays).
Definition: GaussianSplatDataPacking.h:176
std::size_t dispatch_args_size
8 indirect dispatch entries (4×histogram + 4×scatter).
Definition: GaussianSplatDataPacking.h:179
std::size_t projected_composite_size
Composite-pass projected data (32 B/splat, binding 6).
Definition: GaussianSplatDataPacking.h:171
std::size_t tile_scalar_size
Definition: GaussianSplatDataPacking.h:174
std::uint32_t entries_capacity
Definition: GaussianSplatDataPacking.h:181
Definition: GaussianSplatDataPacking.h:88
std::uint32_t splat_count
Visible splat count for the frame.
Definition: GaussianSplatDataPacking.h:93
std::uint32_t error_flags
GPU error bitmask (kGaussianGpuError*).
Definition: GaussianSplatDataPacking.h:91
std::uint32_t total_entries
Raw total tile entries from prefix-sum.
Definition: GaussianSplatDataPacking.h:89
std::uint32_t tile_count
Total tile count for the frame.
Definition: GaussianSplatDataPacking.h:92
Definition: GaussianSplatDataPacking.h:142
const GaussianSplatPackedAttrs * attrs
Definition: GaussianSplatDataPacking.h:143
bool visible
Definition: GaussianSplatDataPacking.h:144
Definition: GaussianSplatDataPacking.h:122
std::uint32_t splat_count
Definition: GaussianSplatDataPacking.h:135
std::vector< Std430Vec4 > positions
fp32 vec4, 16 B/splat
Definition: GaussianSplatDataPacking.h:123
std::vector< std::uint32_t > dc_opacity
fp16×4 in uvec2 pair, 8 B/splat
Definition: GaussianSplatDataPacking.h:128
std::vector< std::uint32_t > rotations
snorm8-biased×4 in uint, 4 B/splat
Definition: GaussianSplatDataPacking.h:127
int sh_degree
Effective SH degree packed here.
Definition: GaussianSplatDataPacking.h:136
std::vector< std::uint32_t > visibility_mask
Definition: GaussianSplatDataPacking.h:134
std::vector< std::uint32_t > scales
fp16×4 in uvec2 pair, 8 B/splat; linear
Definition: GaussianSplatDataPacking.h:125
std::vector< std::uint32_t > sh_coefficients
Definition: GaussianSplatDataPacking.h:130
bool antialias
Definition: GaussianSplatDataPacking.h:137
Tunable knobs for the compute pipeline, set once at construction.
Definition: GaussianSplatRenderer.h:41
Camera and viewport state extracted per-view each geometry pass.
Definition: GaussianSplatRenderer.h:64
Definition: GaussianSplatDataPacking.h:38
std::uint32_t scene[4]
Definition: GaussianSplatDataPacking.h:51
float world_from_model[16]
Definition: GaussianSplatDataPacking.h:40
float depth_range_and_flags[4]
Definition: GaussianSplatDataPacking.h:59
std::uint32_t tiles[4]
Definition: GaussianSplatDataPacking.h:53
std::uint32_t limits[4]
Definition: GaussianSplatDataPacking.h:57
float clip_from_view[16]
Definition: GaussianSplatDataPacking.h:44
float viewport_origin_and_size[4]
Definition: GaussianSplatDataPacking.h:48
float camera_position_and_near[4]
Definition: GaussianSplatDataPacking.h:46
float view_from_world[16]
Definition: GaussianSplatDataPacking.h:42
Definition: GaussianSplatDataPacking.h:151
bool valid
Definition: GaussianSplatDataPacking.h:156
GaussianViewParams view_params
Definition: GaussianSplatDataPacking.h:152
std::uint32_t tile_count
Definition: GaussianSplatDataPacking.h:154
std::uint32_t pixel_count
Definition: GaussianSplatDataPacking.h:155
std::uint32_t splat_count
Definition: GaussianSplatDataPacking.h:153
Definition: GaussianSplatDataPacking.h:74
std::uint32_t center_xy_fp16
Definition: GaussianSplatDataPacking.h:75
float depth
Definition: GaussianSplatDataPacking.h:76
Std430Vec4 inv_basis
Definition: GaussianSplatDataPacking.h:79
float alpha
Definition: GaussianSplatDataPacking.h:77
std::uint32_t packed_rgba8
Definition: GaussianSplatDataPacking.h:78
vec4 stored as 4 floats (std430 layout).
Definition: GaussianSplatDataPacking.h:31
float w
Definition: GaussianSplatDataPacking.h:32
float z
Definition: GaussianSplatDataPacking.h:32
float x
Definition: GaussianSplatDataPacking.h:32
float y
Definition: GaussianSplatDataPacking.h:32