Open3D (C++ API)  0.19.0
Loading...
Searching...
No Matches
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
23namespace open3d {
24namespace visualization {
25namespace rendering {
26
27// ----- GPU-compatible structure definitions ----------------------------------
28// These must be tightly packed to match the std140/std430 GLSL layouts.
29
31struct Std430Vec4 {
32 float x = 0.f, y = 0.f, z = 0.f, w = 0.f;
33};
34
38struct alignas(16) GaussianViewParams {
39 // mat4 world_from_model (row-major, 4 vec4)
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)
51 std::uint32_t scene[4];
52 // uvec4 tiles (xy=tile_size, zw=tile_count)
53 std::uint32_t tiles[4];
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)
57 std::uint32_t limits[4];
58 // vec4 depth_range_and_flags (x=near, y=far, z=reserved, w=0)
60};
61static_assert(sizeof(GaussianViewParams) == 288,
62 "GaussianViewParams must be 288 bytes to match GLSL layout");
63
74struct alignas(16) ProjectedComposite {
75 std::uint32_t center_xy_fp16;
76 float depth;
77 float alpha;
78 std::uint32_t packed_rgba8;
79 alignas(16) Std430Vec4 inv_basis;
80};
81static_assert(sizeof(ProjectedComposite) == 32,
82 "ProjectedComposite must be 32 bytes to match GLSL layout");
83
89 std::uint32_t total_entries =
90 0;
91 std::uint32_t error_flags = 0;
92 std::uint32_t tile_count = 0;
93 std::uint32_t splat_count = 0;
94};
95static_assert(sizeof(GaussianGpuCounters) == 4 * sizeof(std::uint32_t),
96 "GaussianGpuCounters must be 16 bytes");
97static 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.
102static constexpr std::size_t kGaussianCounterTotalEntriesIndex = 0;
103static constexpr std::size_t kGaussianCounterErrorFlagsIndex = 1;
104static constexpr std::size_t kGaussianCounterTileCountIndex = 2;
105static constexpr std::size_t kGaussianCounterSplatCountIndex = 3;
106
108inline constexpr std::uint32_t kGaussianGpuErrorTileEntryOverflow = 1u << 0;
110inline constexpr std::uint32_t kGaussianGpuErrorSortCountClamped = 1u << 1;
113inline constexpr std::uint32_t kGaussianGpuErrorMaxTilesPerSplatExceeded = 1u
114 << 2;
115inline constexpr std::uint32_t kGaussianGpuErrorKnownMask =
118
119// ----- CPU-side representation -----------------------------------------------
120
130 std::vector<Std430Vec4> positions;
131 std::vector<std::uint32_t>
133 std::vector<std::uint32_t>
135 std::vector<std::uint32_t> dc_opacity;
136 std::vector<std::uint32_t>
141 std::vector<std::uint32_t> visibility_mask;
142 std::uint32_t splat_count = 0;
143 int sh_degree = 0;
144 bool antialias = false;
145};
146
151 bool visible = true;
152};
153
160 std::uint32_t splat_count = 0;
161 std::uint32_t tile_count = 0;
162 std::uint32_t pixel_count = 0;
163 bool valid = false;
164};
165
166// ----- GPU buffer sizing (absorbed from GaussianSplatBuffers) ----------------
167
171inline constexpr std::uint32_t kGaussianRadixParamsStride = 256;
172
181 std::size_t tile_scalar_size = 0;
183 std::size_t key_cap_size = 0;
184 std::size_t histogram_buf_size = 0;
186 std::size_t dispatch_args_size = 0;
187 std::size_t radix_params_size = 0;
188 std::uint32_t entries_capacity = 0;
189 std::uint32_t radix_num_wg_cap = 0;
190};
191
196
197// ----- Packing helpers -------------------------------------------------------
198
206 const GaussianSplatPackedAttrs& attrs,
207 const GaussianSplatRenderer::ViewRenderData& render_data,
209
228void PackGaussianSplatAttrsDirect(const float* pts_ptr,
229 std::size_t n,
230 const float* scale_ptr,
231 const float* rot_ptr,
232 const float* f_dc_ptr,
233 const float* opacity_ptr,
234 const float* f_rest_ptr,
235 int source_sh_degree,
236 int desired_sh_degree,
237 float min_opacity_logit,
238 bool antialias,
240
250 const std::vector<GaussianSplatMergeItem>& items,
252 std::vector<std::uint32_t>* splat_starts = nullptr);
253
254} // namespace rendering
255} // namespace visualization
256} // namespace open3d
constexpr std::uint32_t kGaussianGpuErrorMaxTilesPerSplatExceeded
Definition GaussianSplatDataPacking.h:113
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:282
constexpr std::uint32_t kGaussianGpuErrorTileEntryOverflow
Set when the shared sort-entry buffer overflows (total entries > capacity).
Definition GaussianSplatDataPacking.h:108
constexpr std::uint32_t kGaussianGpuErrorKnownMask
Definition GaussianSplatDataPacking.h:115
void MergeGaussianSplatPackedAttrs(const std::vector< GaussianSplatMergeItem > &items, GaussianSplatPackedAttrs *out, std::vector< std::uint32_t > *splat_starts)
Definition GaussianSplatDataPacking.cpp:370
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:171
constexpr std::uint32_t kGaussianGpuErrorSortCountClamped
Set when the radix-sort dispatch count is clamped to the entry capacity.
Definition GaussianSplatDataPacking.h:110
void ComputeGaussianGpuBufferSizes(const PackedGaussianScene &packed, GaussianGpuBufferSizes *out)
Definition GaussianSplatDataPacking.cpp:148
Definition PinholeCameraIntrinsic.cpp:16
Definition GaussianSplatDataPacking.h:176
std::size_t radix_params_size
Definition GaussianSplatDataPacking.h:187
std::size_t histogram_buf_size
Definition GaussianSplatDataPacking.h:184
std::uint32_t radix_num_wg_cap
Definition GaussianSplatDataPacking.h:189
std::size_t key_cap_size
Sort key/value ping-pong buffers (entry_capacity × 4 B each, ×2 arrays).
Definition GaussianSplatDataPacking.h:183
std::size_t dispatch_args_size
8 indirect dispatch entries (4×histogram + 4×scatter).
Definition GaussianSplatDataPacking.h:186
std::size_t projected_composite_size
Composite-pass projected data (32 B/splat, binding 6).
Definition GaussianSplatDataPacking.h:178
std::size_t tile_scalar_size
Definition GaussianSplatDataPacking.h:181
std::uint32_t entries_capacity
Definition GaussianSplatDataPacking.h:188
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:149
const GaussianSplatPackedAttrs * attrs
Definition GaussianSplatDataPacking.h:150
bool visible
Definition GaussianSplatDataPacking.h:151
Definition GaussianSplatDataPacking.h:129
std::uint32_t splat_count
Definition GaussianSplatDataPacking.h:142
std::vector< Std430Vec4 > positions
fp32 vec4, 16 B/splat
Definition GaussianSplatDataPacking.h:130
std::vector< std::uint32_t > dc_opacity
fp16×4 in uvec2 pair, 8 B/splat
Definition GaussianSplatDataPacking.h:135
std::vector< std::uint32_t > rotations
snorm8-biased×4 in uint, 4 B/splat
Definition GaussianSplatDataPacking.h:134
int sh_degree
Effective SH degree packed here.
Definition GaussianSplatDataPacking.h:143
std::vector< std::uint32_t > visibility_mask
Definition GaussianSplatDataPacking.h:141
std::vector< std::uint32_t > scales
fp16×4 in uvec2 pair, 8 B/splat; linear
Definition GaussianSplatDataPacking.h:132
std::vector< std::uint32_t > sh_coefficients
Definition GaussianSplatDataPacking.h:137
bool antialias
Definition GaussianSplatDataPacking.h:144
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:69
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:158
bool valid
Definition GaussianSplatDataPacking.h:163
GaussianViewParams view_params
Definition GaussianSplatDataPacking.h:159
std::uint32_t tile_count
Definition GaussianSplatDataPacking.h:161
std::uint32_t pixel_count
Definition GaussianSplatDataPacking.h:162
std::uint32_t splat_count
Definition GaussianSplatDataPacking.h:160
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