Open3D (C++ API)  0.20.0
Loading...
Searching...
No Matches
GaussianSplatRenderer.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// Copyright (c) 2018-2026 www.open3d.org
5// SPDX-License-Identifier: MIT
6// ----------------------------------------------------------------------------
7
8#pragma once
9
10#include <Eigen/Core>
11#include <Eigen/Geometry>
12#include <cstdint>
13#include <memory>
14#include <unordered_map>
15#include <unordered_set>
16#include <vector>
17
20
22namespace filament {
23class Engine;
24} // namespace filament
26
27namespace open3d {
28namespace visualization {
29namespace rendering {
30
31class FilamentResourceManager;
32class FilamentScene;
33class FilamentView;
34
39public:
41 struct RenderConfig {
42 Eigen::Vector2i tile_size = Eigen::Vector2i(16, 16);
44 Eigen::Vector2i composite_group_size = Eigen::Vector2i(16, 16);
46 // Hard cap on tiles per splat; splats exceeding it are culled rather
47 // than cropped. Cropping huge splats can create hard-edged opaque
48 // blocks. The cap is independent of buffer sizing, so raising it does
49 // not increase GPU memory use. Default is 256.
50 std::uint32_t max_tiles_per_splat = 256u;
51 // Estimates average tiles per splat for buffer sizing; it is not an
52 // enforcement limit. Actual writes are bounds-checked, so excess
53 // entries are dropped with a warning rather than overflowing.
54 std::uint32_t avg_tiles_per_splat = 32u;
58 std::uint32_t max_tile_entries_total = 32u * 1024u * 1024u;
65 bool antialias = false;
66 };
67
70 Eigen::Vector2i viewport_origin = Eigen::Vector2i::Zero();
71 Eigen::Vector2i viewport_size = Eigen::Vector2i::Zero();
72 Eigen::Vector3f camera_position = Eigen::Vector3f::Zero();
73 bool screen_y_down = false;
74 Camera::Transform model_matrix = Camera::Transform::Identity();
75 Camera::Transform view_matrix = Camera::Transform::Identity();
77 Camera::ProjectionMatrix::Identity();
79 Camera::Transform::Identity();
81 double near_plane = 0.0;
82 double far_plane = 0.0;
83 };
84
93 std::uint32_t width = 0;
94 std::uint32_t height = 0;
95
99 bool uses_vulkan_interop = false;
100
104 std::uintptr_t color_vk_image = 0;
105 std::uintptr_t color_vk_memory = 0;
106 std::uintptr_t depth_vk_image = 0;
107 std::uintptr_t depth_vk_memory = 0;
108
111 std::uintptr_t scene_depth_mtl_texture = 0;
112 std::uintptr_t gs_color_mtl_texture = 0;
117 bool has_render_data = false;
118 bool has_valid_output = false;
127 std::uint64_t last_scene_change_id = 0;
128 };
129
131 class Backend {
132 public:
133 virtual ~Backend() = default;
134
135 virtual const char* GetName() const = 0;
136 virtual bool IsAvailable() const { return true; }
137 virtual void ForgetView(const FilamentView& view) = 0;
138 virtual bool RenderGeometryStage(const FilamentView& view,
139 const FilamentScene& scene,
140 const ViewRenderData& render_data,
141 OutputTargets& targets) = 0;
142 virtual bool RenderCompositeStage(const FilamentView& view,
143 const ViewRenderData& render_data,
144 OutputTargets& targets) = 0;
145
150 FilamentView& view,
151 FilamentResourceManager& resource_mgr,
152 std::uint32_t width,
153 std::uint32_t height,
154 OutputTargets& targets) = 0;
155
159 FilamentResourceManager& resource_mgr,
160 OutputTargets& targets) = 0;
161
165 virtual bool ReadMergedDepthToUint16Cpu(const FilamentView& view,
166 std::vector<std::uint16_t>& out,
167 std::uint32_t width,
168 std::uint32_t height) {
169 (void)view;
170 (void)out;
171 (void)width;
172 (void)height;
173 return false;
174 }
175
181 std::vector<float>& out,
182 std::uint32_t width,
183 std::uint32_t height) {
184 (void)view;
185 (void)out;
186 (void)width;
187 (void)height;
188 return false;
189 }
190
195 virtual bool ReadColorToRGBA16FCpu(const OutputTargets& targets,
196 std::vector<std::uint16_t>& out) {
197 (void)targets;
198 (void)out;
199 return false;
200 }
201 };
202
203 GaussianSplatRenderer(filament::Engine& engine,
204 FilamentResourceManager& resource_mgr);
206
207 void RenderGeometryStage(FilamentView& view, const FilamentScene& scene);
210 void PruneOutputs(
211 const std::unordered_set<const FilamentView*>& live_views);
212
219
226 void RequestRedrawForView(const FilamentView& view);
227
230 void RequestCompositeForView(const FilamentView& view);
231
235
239
240 bool IsEnabled() const;
241 void SetEnabled(bool enabled);
242
244 bool HasUsableBackend() const;
245
246 bool HasOutput(const FilamentView& view) const;
247 TextureHandle GetColorTexture(const FilamentView& view) const;
248 TextureHandle GetDepthTexture(const FilamentView& view) const;
252
257 std::vector<std::uint16_t>& out,
258 std::uint32_t width,
259 std::uint32_t height);
260
264 std::vector<float>& out,
265 std::uint32_t width,
266 std::uint32_t height);
267
271 bool ReadColorToRGBA16FCpu(const FilamentView& view,
272 std::vector<std::uint16_t>& out);
273
278 bool wanted = true);
279
280 const ViewRenderData* GetViewRenderData(const FilamentView& view) const;
281 const RenderConfig& GetRenderConfig() const;
282 void SetRenderConfig(const RenderConfig& config);
283 const char* GetBackendName() const;
284
285private:
286 using ViewKey = const FilamentView*;
287
288 OutputTargets& PrepareOutputTargets(FilamentView& view);
289 void ResetOutputTargets(OutputTargets& targets);
290 ViewRenderData ExtractViewRenderData(const FilamentView& view) const;
291 bool UpdateViewRenderData(OutputTargets& targets, const FilamentView& view);
292 bool ValidateRenderConfig(const RenderConfig& config) const;
293
294 filament::Engine& engine_;
295 FilamentResourceManager& resource_mgr_;
296 std::unordered_map<ViewKey, OutputTargets> outputs_;
297 RenderConfig render_config_;
298 std::unique_ptr<Backend> backend_;
299 bool enabled_ = false;
300};
301
302} // namespace rendering
303} // namespace visualization
304} // namespace open3d
Eigen::Transform< float, 3, Eigen::Projective > ProjectionMatrix
Definition Camera.h:26
Eigen::Transform< float, 3, Eigen::Affine > Transform
Definition Camera.h:25
Definition FilamentResourceManager.h:50
GPU backend for geometry and composite compute.
Definition GaussianSplatRenderer.h:131
virtual bool PrepareOutputTextures(FilamentView &view, FilamentResourceManager &resource_mgr, std::uint32_t width, std::uint32_t height, OutputTargets &targets)=0
virtual bool IsAvailable() const
Definition GaussianSplatRenderer.h:136
virtual void ReleaseOutputTextures(FilamentResourceManager &resource_mgr, OutputTargets &targets)=0
virtual bool ReadCompositeDepthToFloatCpu(const FilamentView &view, std::vector< float > &out, std::uint32_t width, std::uint32_t height)
Definition GaussianSplatRenderer.h:180
virtual void ForgetView(const FilamentView &view)=0
virtual bool ReadColorToRGBA16FCpu(const OutputTargets &targets, std::vector< std::uint16_t > &out)
Definition GaussianSplatRenderer.h:195
virtual bool ReadMergedDepthToUint16Cpu(const FilamentView &view, std::vector< std::uint16_t > &out, std::uint32_t width, std::uint32_t height)
Definition GaussianSplatRenderer.h:165
virtual bool RenderCompositeStage(const FilamentView &view, const ViewRenderData &render_data, OutputTargets &targets)=0
virtual bool RenderGeometryStage(const FilamentView &view, const FilamentScene &scene, const ViewRenderData &render_data, OutputTargets &targets)=0
Definition GaussianSplatRenderer.h:38
bool RenderCompositeStage(FilamentView &view)
Returns true if the composite pass ran and the backend reported success.
Definition GaussianSplatRenderer.cpp:254
void RequestRedrawForView(const FilamentView &view)
Definition GaussianSplatRenderer.cpp:279
bool ReadColorToRGBA16FCpu(const FilamentView &view, std::vector< std::uint16_t > &out)
Definition GaussianSplatRenderer.cpp:435
void SetRenderConfig(const RenderConfig &config)
Definition GaussianSplatRenderer.cpp:377
const ViewRenderData * GetViewRenderData(const FilamentView &view) const
Definition GaussianSplatRenderer.cpp:364
void RequestDepthReadbackForView(const FilamentView &view, bool wanted=true)
Definition GaussianSplatRenderer.cpp:445
bool ReadCompositeDepthToFloatCpu(const FilamentView &view, std::vector< float > &out, std::uint32_t width, std::uint32_t height)
Definition GaussianSplatRenderer.cpp:424
TextureHandle GetDepthTexture(const FilamentView &view) const
Definition GaussianSplatRenderer.cpp:400
void RequestCompositeForView(const FilamentView &view)
Definition GaussianSplatRenderer.cpp:288
bool ReadMergedDepthToUint16Cpu(const FilamentView &view, std::vector< std::uint16_t > &out, std::uint32_t width, std::uint32_t height)
Definition GaussianSplatRenderer.cpp:413
void RenderGeometryStage(FilamentView &view, const FilamentScene &scene)
Definition GaussianSplatRenderer.cpp:209
~GaussianSplatRenderer()
Definition GaussianSplatRenderer.cpp:202
bool ConsumeOutputReadyRedrawRequest(const FilamentView &view)
Definition GaussianSplatRenderer.cpp:295
const char * GetBackendName() const
Definition GaussianSplatRenderer.cpp:453
void PruneOutputs(const std::unordered_set< const FilamentView * > &live_views)
Definition GaussianSplatRenderer.cpp:335
bool HasOutput(const FilamentView &view) const
Definition GaussianSplatRenderer.cpp:356
RenderTargetHandle GetColorReadbackRT(const FilamentView &view) const
Definition GaussianSplatRenderer.cpp:406
void SetEnabled(bool enabled)
Definition GaussianSplatRenderer.cpp:354
bool HasUsableBackend() const
Returns whether the selected backend can render Gaussian splats.
Definition GaussianSplatRenderer.cpp:317
void InvalidateOutputForView(FilamentView &view)
Definition GaussianSplatRenderer.cpp:321
bool ConsumeFollowupSceneRenderRequest(const FilamentView &view)
Definition GaussianSplatRenderer.cpp:306
TextureHandle GetColorTexture(const FilamentView &view) const
Definition GaussianSplatRenderer.cpp:394
bool IsEnabled() const
Definition GaussianSplatRenderer.cpp:352
const RenderConfig & GetRenderConfig() const
Definition GaussianSplatRenderer.cpp:373
int width
Definition FilePCD.cpp:53
int height
Definition FilePCD.cpp:54
Definition FilamentEngine.h:15
Definition PinholeCameraIntrinsic.cpp:16
bool has_render_data
Definition GaussianSplatRenderer.h:117
std::uintptr_t color_vk_image
Definition GaussianSplatRenderer.h:104
bool needs_followup_scene_render
Definition GaussianSplatRenderer.h:122
std::uintptr_t scene_depth_mtl_texture
Definition GaussianSplatRenderer.h:111
bool wants_depth_readback
Definition GaussianSplatRenderer.h:126
std::uint32_t width
Definition GaussianSplatRenderer.h:93
RenderTargetHandle gs_readback_rt
Definition GaussianSplatRenderer.h:116
std::uint32_t height
Definition GaussianSplatRenderer.h:94
bool needs_composite_render
Definition GaussianSplatRenderer.h:120
TextureHandle depth
Definition GaussianSplatRenderer.h:91
bool needs_geometry_render
Definition GaussianSplatRenderer.h:119
std::uint64_t last_scene_change_id
Definition GaussianSplatRenderer.h:127
std::uintptr_t color_vk_memory
Definition GaussianSplatRenderer.h:105
bool has_valid_output
Definition GaussianSplatRenderer.h:118
std::uintptr_t gs_color_mtl_texture
Definition GaussianSplatRenderer.h:112
bool needs_output_ready_redraw
Definition GaussianSplatRenderer.h:121
std::uintptr_t depth_vk_memory
Definition GaussianSplatRenderer.h:107
ViewRenderData render_data
Definition GaussianSplatRenderer.h:113
RenderTargetHandle render_target
Definition GaussianSplatRenderer.h:92
TextureHandle color
Definition GaussianSplatRenderer.h:90
bool uses_vulkan_interop
Definition GaussianSplatRenderer.h:99
std::uintptr_t depth_vk_image
Definition GaussianSplatRenderer.h:106
Tunable knobs for the compute pipeline, set once at construction.
Definition GaussianSplatRenderer.h:41
std::uint32_t avg_tiles_per_splat
Definition GaussianSplatRenderer.h:54
std::uint32_t max_tiles_per_splat
Definition GaussianSplatRenderer.h:50
Eigen::Vector2i composite_group_size
Definition GaussianSplatRenderer.h:44
int projection_group_size
Definition GaussianSplatRenderer.h:43
std::uint32_t max_tile_entries_total
Definition GaussianSplatRenderer.h:58
Eigen::Vector2i tile_size
Definition GaussianSplatRenderer.h:42
Camera and viewport state extracted per-view each geometry pass.
Definition GaussianSplatRenderer.h:69
Camera::Transform model_matrix
Definition GaussianSplatRenderer.h:74
Eigen::Vector2i viewport_origin
Definition GaussianSplatRenderer.h:70
Camera::Transform culling_projection_matrix
Definition GaussianSplatRenderer.h:78
Camera::Transform view_matrix
Definition GaussianSplatRenderer.h:75
Camera::ProjectionMatrix projection_matrix
Definition GaussianSplatRenderer.h:76
Camera::ProjectionInfo projection
Definition GaussianSplatRenderer.h:80
Eigen::Vector2i viewport_size
Definition GaussianSplatRenderer.h:71
Eigen::Vector3f camera_position
Definition GaussianSplatRenderer.h:72