Open3D (C++ API)  0.19.0
GaussianSplatRenderer.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 #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 
22 namespace filament {
23 class Engine;
24 } // namespace filament
26 
27 namespace open3d {
28 namespace visualization {
29 namespace rendering {
30 
31 class FilamentResourceManager;
32 class FilamentScene;
33 class FilamentView;
34 
39 public:
41  struct RenderConfig {
42  Eigen::Vector2i tile_size = Eigen::Vector2i(16, 16);
44  Eigen::Vector2i composite_group_size = Eigen::Vector2i(16, 16);
45  int max_sh_degree = 2;
53  std::uint32_t max_tile_entries_total = 32u * 1024u * 1024u;
60  bool antialias = false;
61  };
62 
64  struct ViewRenderData {
65  Eigen::Vector2i viewport_origin = Eigen::Vector2i::Zero();
66  Eigen::Vector2i viewport_size = Eigen::Vector2i::Zero();
67  Eigen::Vector3f camera_position = Eigen::Vector3f::Zero();
68  bool screen_y_down = false;
69  Camera::Transform model_matrix = Camera::Transform::Identity();
70  Camera::Transform view_matrix = Camera::Transform::Identity();
72  Camera::ProjectionMatrix::Identity();
74  Camera::Transform::Identity();
76  double near_plane = 0.0;
77  double far_plane = 0.0;
78  };
79 
84  struct OutputTargets {
96 
101  bool uses_vulkan_interop = false;
102 
106  std::uintptr_t color_vk_image = 0;
107  std::uintptr_t color_vk_memory = 0;
109  std::uintptr_t depth_vk_image = 0;
110  std::uintptr_t depth_vk_memory = 0;
112 
115  std::uintptr_t scene_depth_mtl_texture = 0;
116  std::uintptr_t gs_color_mtl_texture = 0;
121  bool has_render_data = false;
122  bool has_valid_output = false;
123  bool needs_render = true;
127  bool wants_depth_readback = false;
130  };
131 
133  class Backend {
134  public:
135  virtual ~Backend() = default;
136 
137  virtual const char* GetName() const = 0;
138  virtual void BeginFrame(std::uint64_t frame_index) = 0;
139  virtual void ForgetView(const FilamentView& view) = 0;
140  virtual bool RenderGeometryStage(const FilamentView& view,
141  const FilamentScene& scene,
142  const ViewRenderData& render_data,
143  OutputTargets& targets) = 0;
144  virtual bool RenderCompositeStage(const FilamentView& view,
145  const ViewRenderData& render_data,
146  OutputTargets& targets) = 0;
147 
154  virtual bool PrepareOutputTextures(
155  FilamentView& view,
156  FilamentResourceManager& resource_mgr,
159  OutputTargets& targets) = 0;
160 
163  virtual void ReleaseOutputTextures(
164  FilamentResourceManager& resource_mgr,
165  OutputTargets& targets) = 0;
166 
170  virtual bool ReadMergedDepthToUint16Cpu(const FilamentView& view,
171  std::vector<std::uint16_t>& out,
174  (void)view;
175  (void)out;
176  (void)width;
177  (void)height;
178  return false;
179  }
180 
185  virtual bool ReadCompositeDepthToFloatCpu(const FilamentView& view,
186  std::vector<float>& out,
189  (void)view;
190  (void)out;
191  (void)width;
192  (void)height;
193  return false;
194  }
195  };
196 
197  GaussianSplatRenderer(filament::Engine& engine,
198  FilamentResourceManager& resource_mgr);
200 
201  void BeginFrame();
202 
203  void RenderGeometryStage(FilamentView& view, const FilamentScene& scene);
206  void PruneOutputs(
207  const std::unordered_set<const FilamentView*>& live_views);
208 
215 
222  void RequestRedrawForView(const FilamentView& view);
223 
224  bool IsEnabled() const;
225  void SetEnabled(bool enabled);
226  bool IsSupported() const;
227 
228  bool HasOutput(const FilamentView& view) const;
229  TextureHandle GetColorTexture(const FilamentView& view) const;
230  TextureHandle GetDepthTexture(const FilamentView& view) const;
234 
238  bool ReadMergedDepthToUint16Cpu(const FilamentView& view,
239  std::vector<std::uint16_t>& out,
242 
246  std::vector<float>& out,
249 
253  void RequestDepthReadbackForView(const FilamentView& view,
254  bool wanted = true);
255 
259  const ViewRenderData* GetViewRenderData(const FilamentView& view) const;
260  const RenderConfig& GetRenderConfig() const;
261  void SetRenderConfig(const RenderConfig& config);
262  const char* GetBackendName() const;
263 
264 private:
265  using ViewKey = const FilamentView*;
266 
267  OutputTargets& PrepareOutputTargets(FilamentView& view);
268  void ResetOutputTargets(OutputTargets& targets);
269  ViewRenderData ExtractViewRenderData(const FilamentView& view) const;
270  bool UpdateViewRenderData(OutputTargets& targets, const FilamentView& view);
271  bool ValidateRenderConfig(const RenderConfig& config) const;
272 
273  filament::Engine& engine_;
274  FilamentResourceManager& resource_mgr_;
275  std::unordered_map<ViewKey, OutputTargets> outputs_;
276  RenderConfig render_config_;
277  std::unique_ptr<Backend> backend_;
278  bool enabled_ = false;
279  std::uint64_t frame_index_ = 0;
280 };
281 
282 } // namespace rendering
283 } // namespace visualization
284 } // 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 + composite compute (OpenGL or Metal).
Definition: GaussianSplatRenderer.h:133
virtual bool PrepareOutputTextures(FilamentView &view, FilamentResourceManager &resource_mgr, std::uint32_t width, std::uint32_t height, OutputTargets &targets)=0
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:185
virtual void ForgetView(const FilamentView &view)=0
virtual void BeginFrame(std::uint64_t frame_index)=0
virtual bool ReadMergedDepthToUint16Cpu(const FilamentView &view, std::vector< std::uint16_t > &out, std::uint32_t width, std::uint32_t height)
Definition: GaussianSplatRenderer.h:170
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
GaussianSplatRenderer(filament::Engine &engine, FilamentResourceManager &resource_mgr)
Definition: GaussianSplatRenderer.cpp:220
bool RenderCompositeStage(FilamentView &view)
Returns true if the composite pass ran and the backend reported success.
Definition: GaussianSplatRenderer.cpp:283
void RequestRedrawForView(const FilamentView &view)
Definition: GaussianSplatRenderer.cpp:309
void SetRenderConfig(const RenderConfig &config)
Definition: GaussianSplatRenderer.cpp:379
const ViewRenderData * GetViewRenderData(const FilamentView &view) const
Definition: GaussianSplatRenderer.cpp:366
void BeginFrame()
Definition: GaussianSplatRenderer.cpp:235
void RequestDepthReadbackForView(const FilamentView &view, bool wanted=true)
Definition: GaussianSplatRenderer.cpp:436
bool ReadCompositeDepthToFloatCpu(const FilamentView &view, std::vector< float > &out, std::uint32_t width, std::uint32_t height)
Definition: GaussianSplatRenderer.cpp:425
TextureHandle GetDepthTexture(const FilamentView &view) const
Definition: GaussianSplatRenderer.cpp:401
bool ReadMergedDepthToUint16Cpu(const FilamentView &view, std::vector< std::uint16_t > &out, std::uint32_t width, std::uint32_t height)
Definition: GaussianSplatRenderer.cpp:414
std::uint32_t GetSceneDepthGLHandle(const FilamentView &view) const
Definition: GaussianSplatRenderer.cpp:444
void RenderGeometryStage(FilamentView &view, const FilamentScene &scene)
Definition: GaussianSplatRenderer.cpp:244
~GaussianSplatRenderer()
Definition: GaussianSplatRenderer.cpp:228
const char * GetBackendName() const
Definition: GaussianSplatRenderer.cpp:450
void PruneOutputs(const std::unordered_set< const FilamentView * > &live_views)
Definition: GaussianSplatRenderer.cpp:331
bool IsSupported() const
Definition: GaussianSplatRenderer.cpp:354
bool HasOutput(const FilamentView &view) const
Definition: GaussianSplatRenderer.cpp:358
RenderTargetHandle GetColorReadbackRT(const FilamentView &view) const
Definition: GaussianSplatRenderer.cpp:407
void SetEnabled(bool enabled)
Definition: GaussianSplatRenderer.cpp:350
void InvalidateOutputForView(FilamentView &view)
Definition: GaussianSplatRenderer.cpp:317
TextureHandle GetColorTexture(const FilamentView &view) const
Definition: GaussianSplatRenderer.cpp:395
bool IsEnabled() const
Definition: GaussianSplatRenderer.cpp:348
const RenderConfig & GetRenderConfig() const
Definition: GaussianSplatRenderer.cpp:375
int width
Definition: FilePCD.cpp:52
int height
Definition: FilePCD.cpp:53
Definition: FilamentEngine.h:15
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 void
Definition: K4aPlugin.cpp:250
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 uint64_t
Definition: K4aPlugin.cpp:343
Definition: PinholeCameraIntrinsic.cpp:16
bool has_render_data
Definition: GaussianSplatRenderer.h:121
std::uintptr_t color_vk_image
Definition: GaussianSplatRenderer.h:106
std::uint32_t depth_gl_mem_obj
glCreateMemoryObjectsEXT name
Definition: GaussianSplatRenderer.h:111
std::uintptr_t scene_depth_mtl_texture
Definition: GaussianSplatRenderer.h:115
bool wants_depth_readback
Definition: GaussianSplatRenderer.h:127
std::uint32_t color_gl_mem_obj
glCreateMemoryObjectsEXT name
Definition: GaussianSplatRenderer.h:108
std::uint32_t width
Definition: GaussianSplatRenderer.h:88
RenderTargetHandle gs_readback_rt
Definition: GaussianSplatRenderer.h:120
std::uint32_t height
Definition: GaussianSplatRenderer.h:89
TextureHandle depth
Definition: GaussianSplatRenderer.h:86
std::uint64_t last_scene_change_id
Definition: GaussianSplatRenderer.h:128
std::uintptr_t color_vk_memory
Definition: GaussianSplatRenderer.h:107
bool has_valid_output
Definition: GaussianSplatRenderer.h:122
std::uintptr_t gs_color_mtl_texture
Definition: GaussianSplatRenderer.h:116
std::uint64_t last_updated_frame
Definition: GaussianSplatRenderer.h:129
std::uintptr_t depth_vk_memory
Definition: GaussianSplatRenderer.h:110
ViewRenderData render_data
Definition: GaussianSplatRenderer.h:117
RenderTargetHandle render_target
Definition: GaussianSplatRenderer.h:87
bool needs_render
Definition: GaussianSplatRenderer.h:123
TextureHandle color
Definition: GaussianSplatRenderer.h:85
std::uint32_t scene_depth_gl_handle
Definition: GaussianSplatRenderer.h:92
std::uint32_t color_gl_handle
Definition: GaussianSplatRenderer.h:95
bool uses_vulkan_interop
Definition: GaussianSplatRenderer.h:101
std::uintptr_t depth_vk_image
Definition: GaussianSplatRenderer.h:109
Tunable knobs for the compute pipeline, set once at construction.
Definition: GaussianSplatRenderer.h:41
std::uint32_t max_tiles_per_splat
Definition: GaussianSplatRenderer.h:49
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:53
Eigen::Vector2i tile_size
Definition: GaussianSplatRenderer.h:42
Camera and viewport state extracted per-view each geometry pass.
Definition: GaussianSplatRenderer.h:64
Camera::Transform model_matrix
Definition: GaussianSplatRenderer.h:69
Eigen::Vector2i viewport_origin
Definition: GaussianSplatRenderer.h:65
Camera::Transform culling_projection_matrix
Definition: GaussianSplatRenderer.h:73
Camera::Transform view_matrix
Definition: GaussianSplatRenderer.h:70
Camera::ProjectionMatrix projection_matrix
Definition: GaussianSplatRenderer.h:71
Camera::ProjectionInfo projection
Definition: GaussianSplatRenderer.h:75
Eigen::Vector2i viewport_size
Definition: GaussianSplatRenderer.h:66
Eigen::Vector3f camera_position
Definition: GaussianSplatRenderer.h:67