Open3D (C++ API)  0.20.0
Loading...
Searching...
No Matches
FilamentRenderer.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 <memory>
11#include <unordered_map>
12#include <unordered_set>
13#if defined(__APPLE__)
14#include <vector>
15#endif
16
19
21namespace filament {
22class Engine;
23class Renderer;
24class Scene;
25class SwapChain;
26class VertexBuffer;
27} // namespace filament
29
30namespace open3d {
31namespace visualization {
32namespace rendering {
33
34class FilamentMaterialModifier;
35class FilamentRenderToBuffer;
36class FilamentResourceManager;
37class GaussianSplatRenderer;
38class FilamentScene;
39class FilamentView;
40
41class FilamentRenderer : public Renderer {
42public:
43 FilamentRenderer(filament::Engine& engine,
44 void* native_drawable,
45 FilamentResourceManager& resource_mgr);
46 // This will create an offscreen renderer
47 explicit FilamentRenderer(filament::Engine& engine,
48 int width,
49 int height,
50 FilamentResourceManager& resource_mgr);
51 ~FilamentRenderer() override;
52
53 SceneHandle CreateScene() override;
54 Scene* GetScene(const SceneHandle& id) const override;
55 void DestroyScene(const SceneHandle& id) override;
56
57 void SetClearColor(const Eigen::Vector4f& color) override;
58 void UpdateSwapChain() override;
59 void UpdateBitmapSwapChain(int width, int height) override;
60
61 void BeginFrame() override;
62 void Draw() override;
63 void RequestReadPixels(int width,
64 int height,
65 std::function<void(std::shared_ptr<core::Tensor>)>
66 callback) override;
67 void EndFrame() override;
68
69 void SetOnAfterDraw(std::function<void()> callback) override;
70
71 bool LastBeginFrameSubmitted() const override { return frame_started_; }
72
76 void SetOnGaussianCompositeComplete(std::function<void()> callback);
77
78 MaterialHandle AddMaterial(const ResourceLoadRequest& request) override;
80 const MaterialHandle& material) override;
83 void RemoveMaterialInstance(const MaterialInstanceHandle& id) override;
84
86 bool srgb = false) override;
87 TextureHandle AddTexture(const std::shared_ptr<geometry::Image> image,
88 bool srgb = false) override;
90 bool srgb = false) override;
91 bool UpdateTexture(TextureHandle texture,
92 const std::shared_ptr<geometry::Image> image,
93 bool srgb) override;
94 bool UpdateTexture(TextureHandle texture,
96 bool srgb) override;
97 void RemoveTexture(const TextureHandle& id) override;
98
100 const ResourceLoadRequest& request) override;
101 void RemoveIndirectLight(const IndirectLightHandle& id) override;
102
103 SkyboxHandle AddSkybox(const ResourceLoadRequest& request) override;
104 void RemoveSkybox(const SkyboxHandle& id) override;
105
106 std::shared_ptr<visualization::rendering::RenderToBuffer>
107 CreateBufferRenderer() override;
108
109 // Removes scene from scenes list and draws it last
110 // WARNING: will destroy previous gui scene if there was any
111 void ConvertToGuiScene(const SceneHandle& id);
112 FilamentScene* GetGuiScene() const { return gui_scene_.get(); }
113
114 bool HasGaussianSplatOutput(const FilamentView& view) const;
117 int GetGaussianSplatMaxShDegree() const;
119 return gaussian_splat_renderer_.get();
120 }
125
126 filament::Renderer* GetNative() { return renderer_; }
127
131
132private:
134
135 filament::Engine& engine_;
136 filament::Renderer* renderer_ = nullptr;
137 filament::SwapChain* swap_chain_ = nullptr;
138 filament::SwapChain* swap_chain_cached_ = nullptr;
139
140 std::unordered_map<REHandle_abstract, std::unique_ptr<FilamentScene>>
141 scenes_;
142 std::unique_ptr<FilamentScene> gui_scene_;
143
144 std::unique_ptr<FilamentMaterialModifier> materials_modifier_;
145 std::unique_ptr<GaussianSplatRenderer> gaussian_splat_renderer_;
146 FilamentResourceManager& resource_mgr_;
147
148 std::unordered_set<std::shared_ptr<FilamentRenderToBuffer>>
149 buffer_renderers_;
150 std::vector<FilamentView*> rendered_views_;
151
152 bool frame_started_ = false;
153 std::function<void()> on_after_draw_;
154 std::function<void()> on_gaussian_composite_complete_;
155 bool needs_wait_after_draw_ = false;
156#if defined(__APPLE__)
157 // Scratch buffer for RequestReadPixels' Metal RGBA readback workaround;
158 std::vector<uint8_t> read_pixels_rgba_buffer_;
159#endif
160};
161
162} // namespace rendering
163} // namespace visualization
164} // namespace open3d
std::shared_ptr< core::Tensor > image
Definition FilamentRenderer.cpp:347
std::function< void(std::shared_ptr< core::Tensor >)> callback
Definition FilamentRenderer.cpp:346
math::float4 color
Definition LineSetBuffers.cpp:45
The Image class stores image with customizable rows, cols, channels, dtype and device.
Definition Image.h:29
static RenderingType GetBackendType()
Definition FilamentEngine.h:46
Definition FilamentRenderToBuffer.h:30
void SetClearColor(const Eigen::Vector4f &color) override
Definition FilamentRenderer.cpp:163
SkyboxHandle AddSkybox(const ResourceLoadRequest &request) override
Definition FilamentRenderer.cpp:504
TextureHandle GetGaussianSplatColorTexture(const FilamentView &view) const
Definition FilamentRenderer.cpp:137
filament::Renderer * GetNative()
Definition FilamentRenderer.h:126
void InvalidateGaussianSplatOutput(FilamentView &view)
Definition FilamentRenderer.cpp:157
void SetOnAfterDraw(std::function< void()> callback) override
Definition FilamentRenderer.cpp:174
SceneHandle CreateScene() override
Definition FilamentRenderer.cpp:112
void RemoveSkybox(const SkyboxHandle &id) override
Definition FilamentRenderer.cpp:514
TextureHandle AddTexture(const ResourceLoadRequest &request, bool srgb=false) override
Definition FilamentRenderer.cpp:461
bool UpdateTexture(TextureHandle texture, const std::shared_ptr< geometry::Image > image, bool srgb) override
Definition FilamentRenderer.cpp:472
void BeginFrame() override
Definition FilamentRenderer.cpp:195
MaterialModifier & ModifyMaterial(const MaterialHandle &id) override
Definition FilamentRenderer.cpp:422
void SetOnGaussianCompositeComplete(std::function< void()> callback)
Definition FilamentRenderer.cpp:178
void UpdateSwapChain() override
Definition FilamentRenderer.cpp:183
void RequestReadPixels(int width, int height, std::function< void(std::shared_ptr< core::Tensor >)> callback) override
Definition FilamentRenderer.cpp:377
void UpdateBitmapSwapChain(int width, int height) override
Definition FilamentRenderer.cpp:189
TextureHandle GetGaussianSplatDepthTexture(const FilamentView &view) const
Definition FilamentRenderer.cpp:144
bool HasGaussianSplatOutput(const FilamentView &view) const
Definition FilamentRenderer.cpp:132
void ConvertToGuiScene(const SceneHandle &id)
Definition FilamentRenderer.cpp:527
MaterialInstanceHandle AddMaterialInstance(const MaterialHandle &material) override
Definition FilamentRenderer.cpp:417
std::shared_ptr< visualization::rendering::RenderToBuffer > CreateBufferRenderer() override
Definition FilamentRenderer.cpp:518
void RemoveTexture(const TextureHandle &id) override
Definition FilamentRenderer.cpp:485
void Draw() override
Definition FilamentRenderer.cpp:251
void EndFrame() override
Definition FilamentRenderer.cpp:296
FilamentScene * GetGuiScene() const
Definition FilamentRenderer.h:112
IndirectLightHandle AddIndirectLight(const ResourceLoadRequest &request) override
Definition FilamentRenderer.cpp:489
int GetGaussianSplatMaxShDegree() const
Definition FilamentRenderer.cpp:151
bool LastBeginFrameSubmitted() const override
Definition FilamentRenderer.h:71
void RemoveIndirectLight(const IndirectLightHandle &id) override
Definition FilamentRenderer.cpp:500
GaussianSplatRenderer * GetGaussianSplatRenderer()
Definition FilamentRenderer.h:118
Scene * GetScene(const SceneHandle &id) const override
Definition FilamentRenderer.cpp:120
~FilamentRenderer() override
Definition FilamentRenderer.cpp:99
void RemoveMaterialInstance(const MaterialInstanceHandle &id) override
Definition FilamentRenderer.cpp:456
MaterialHandle AddMaterial(const ResourceLoadRequest &request) override
Definition FilamentRenderer.cpp:412
RenderingType GetBackendType() override
Return if the rendering backend is OpenGL, Vulkan or Metal.
Definition FilamentRenderer.h:128
void DestroyScene(const SceneHandle &id) override
Definition FilamentRenderer.cpp:128
Definition FilamentResourceManager.h:50
Definition GaussianSplatRenderer.h:38
int width
Definition FilePCD.cpp:53
int height
Definition FilePCD.cpp:54
Definition FilamentEngine.h:15
RenderingType
Definition Renderer.h:57
Definition PinholeCameraIntrinsic.cpp:16