Toast Engine
Loading...
Searching...
No Matches
reflection_probe_pass.hpp
Go to the documentation of this file.
1
6
7#pragma once
8
10#include "../render_pass_base.hpp"
11#include "../shader_layout.hpp"
12#include "../vulkan_common.hpp"
13#include "../vulkan_pipeline.hpp"
14
15#include <cstdint>
16#include <glm/glm.hpp>
17#include <optional>
18#include <string>
19#include <string_view>
20#include <utility>
21#include <vector>
22
23namespace renderer {
24class VulkanCore;
25
26class ReflectionProbePass : public IRenderPass {
27public:
29 static constexpr uint32_t k_max_probes = 8;
30
31 static constexpr uint32_t k_default_face_size = 128;
32
33 static constexpr uint32_t k_max_face_size = 512;
34
35 static constexpr uint32_t k_irradiance_size = 32;
36
37 ReflectionProbePass(const VulkanCore& core, vk::Format color_format, vk::Format depth_format);
38
39 [[nodiscard]]
40 auto name() const -> std::string_view override {
41 return "Reflection Probes";
42 }
43
44 void record(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override;
45
46 void recordPre(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override;
47
48 void queueSave(uint32_t probe, std::string_view uri);
49
50 auto loadProbe(uint32_t probe, std::string_view uri) -> bool;
51
52 [[nodiscard]]
53 auto stage() const -> RenderStage override {
54 return RenderStage::world;
55 }
56
58 void captureFace(vk::CommandBuffer cmd, vk::Image scene_color, vk::Extent2D scene_extent, uint32_t probe, uint32_t face);
59
60 void captureIrradianceFace(vk::CommandBuffer cmd, vk::Image scene_color, vk::Extent2D scene_extent, uint32_t face);
61
62 void projectStagingToSh(vk::CommandBuffer cmd, uint32_t probe);
63
64 [[nodiscard]]
65 auto getShBuffer() const -> vk::Buffer;
66
67 void queueShSave(uint32_t base, uint32_t count, std::string_view uri, const ShGridKey& key);
68
69 auto loadShRange(uint32_t base, uint32_t count, std::string_view uri, const ShGridKey& key) -> bool;
70
72 void setProbeResolution(uint32_t probe, uint32_t face_size);
73
74 [[nodiscard]]
75 auto getProbeResolution(uint32_t probe) const -> uint32_t;
76
77 [[nodiscard]]
78 auto getProbeView(uint32_t probe) const -> vk::ImageView;
79
80 [[nodiscard]]
81 auto getProbeIrradianceView(uint32_t probe) const -> vk::ImageView;
82
83 [[nodiscard]]
84 auto getSampler() const -> vk::Sampler {
85 return *m_sampler;
86 }
87
88 [[nodiscard]]
89 auto getMipCount() const noexcept -> uint32_t {
90 return m_mip_levels;
91 }
92
93 [[nodiscard]]
94 auto isBaked(uint32_t probe) const -> bool;
95
96 void setBakedTransform(uint32_t probe, const glm::vec3& position, const glm::vec3& extents);
97
98 [[nodiscard]]
99 auto isStale(uint32_t probe, const glm::vec3& position, const glm::vec3& extents) const -> bool;
100
101private:
103 struct Params {
104 glm::vec4 face_right {0.0f};
105 glm::vec4 face_up {0.0f};
106 glm::vec4 face_forward {0.0f};
107 float roughness = 0.0f;
108 float intensity = 1.0f;
109 glm::vec2 pad0 {0.0f};
110 };
111
112 struct ProbeCube {
113 CubemapTarget cube;
114 bool baked = false;
115 glm::vec3 baked_position {0.0f};
116 glm::vec3 baked_extents {0.0f};
117 };
118
119 void createPipelines(const VulkanCore& core);
120 void createDescriptors(const VulkanCore& core);
121
122 void rebindProbeViews(uint32_t probe);
123
124 [[nodiscard]]
125 static auto cubeByteSize(const ProbeCube& cube) -> vk::DeviceSize;
126
127 auto readbackCube(ProbeCube& cube, std::vector<uint8_t>& out) -> bool;
128
129 auto uploadCube(ProbeCube& cube, const std::vector<uint8_t>& bytes, size_t offset) -> bool;
130
131 std::vector<std::pair<uint32_t, std::string>> m_pending_saves;
132
133 struct PendingShSave {
134 uint32_t base = 0;
135 uint32_t count = 0;
136 std::string uri;
137 ShGridKey key;
138 };
139
140 std::vector<PendingShSave> m_pending_sh_saves;
141
142 void prefilterInto(vk::CommandBuffer cmd, uint32_t probe);
143
144 void convolveIrradianceInto(vk::CommandBuffer cmd, uint32_t probe);
145
146 void renderFace(
147 vk::CommandBuffer cmd, const VulkanPipeline& pipeline, const ProbeCube& target, uint32_t size, uint32_t mip, uint32_t face,
148 float roughness
149 );
150
151 const VulkanCore* m_core = nullptr;
152 vk::Format m_format = vk::Format::eUndefined;
153 uint32_t m_mip_levels = 1;
154
155 vk::raii::Sampler m_sampler = nullptr;
156 std::vector<ProbeCube> m_probes;
157
158 std::vector<ProbeCube> m_probe_irradiance;
159
160 ProbeCube m_staging;
161
162 void createShResources(const VulkanCore& core);
163
165 std::optional<vma::raii::Buffer> m_sh_buffer;
166 ShaderLayout m_sh_layout;
167 VulkanPipeline m_sh_pipeline;
168 vk::raii::DescriptorSet m_sh_set = nullptr;
169
170 ShaderLayout m_shader_layout;
171 VulkanPipeline m_prefilter_pipeline;
172 VulkanPipeline m_irradiance_pipeline;
173 vk::raii::DescriptorSet m_staging_source_set = nullptr;
174
176 struct PreviewParams {
177 glm::mat4 view_projection {1.0f};
178 glm::vec4 center_radius {0.0f};
179 glm::vec4 camera_position {0.0f};
180 };
181
182 vk::Format m_depth_format = vk::Format::eUndefined;
183 ShaderLayout m_preview_layout;
184 VulkanPipeline m_preview_pipeline;
185
186 std::vector<vk::raii::DescriptorSet> m_preview_sets;
187};
188
189}
Definition render_pass_base.hpp:19
void captureFace(vk::CommandBuffer cmd, vk::Image scene_color, vk::Extent2D scene_extent, uint32_t probe, uint32_t face)
Definition reflection_probe_pass.cpp:199
static constexpr uint32_t k_max_probes
Matches VulkanRenderer::k_max_reflection_probes.
Definition reflection_probe_pass.hpp:29
void recordPre(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index) override
Records outside any rendering scope before the main scope opens.
Definition reflection_probe_pass.cpp:750
void setProbeResolution(uint32_t probe, uint32_t face_size)
Definition reflection_probe_pass.cpp:921
Definition vulkan_core.hpp:48