31 static constexpr uint32_t k_default_face_size = 128;
33 static constexpr uint32_t k_max_face_size = 512;
35 static constexpr uint32_t k_irradiance_size = 32;
37 ReflectionProbePass(
const VulkanCore& core, vk::Format color_format, vk::Format depth_format);
40 auto name() const -> std::string_view
override {
41 return "Reflection Probes";
44 void record(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index)
override;
46 void recordPre(vk::CommandBuffer cmd, uint32_t frame_index, uint32_t image_index)
override;
48 void queueSave(uint32_t probe, std::string_view uri);
50 auto loadProbe(uint32_t probe, std::string_view uri) -> bool;
53 auto stage() const -> RenderStage
override {
54 return RenderStage::world;
58 void captureFace(vk::CommandBuffer cmd, vk::Image scene_color, vk::Extent2D scene_extent, uint32_t probe, uint32_t face);
60 void captureIrradianceFace(vk::CommandBuffer cmd, vk::Image scene_color, vk::Extent2D scene_extent, uint32_t face);
62 void projectStagingToSh(vk::CommandBuffer cmd, uint32_t probe);
65 auto getShBuffer() const -> vk::Buffer;
67 void queueShSave(uint32_t base, uint32_t count, std::string_view uri, const ShGridKey& key);
69 auto loadShRange(uint32_t base, uint32_t count, std::string_view uri, const ShGridKey& key) ->
bool;
75 auto getProbeResolution(uint32_t probe) const -> uint32_t;
78 auto getProbeView(uint32_t probe) const -> vk::ImageView;
81 auto getProbeIrradianceView(uint32_t probe) const -> vk::ImageView;
84 auto getSampler() const -> vk::Sampler {
89 auto getMipCount() const noexcept -> uint32_t {
94 auto isBaked(uint32_t probe)
const -> bool;
96 void setBakedTransform(uint32_t probe,
const glm::vec3& position,
const glm::vec3& extents);
99 auto isStale(uint32_t probe,
const glm::vec3& position,
const glm::vec3& extents)
const -> bool;
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};
115 glm::vec3 baked_position {0.0f};
116 glm::vec3 baked_extents {0.0f};
119 void createPipelines(
const VulkanCore& core);
120 void createDescriptors(
const VulkanCore& core);
122 void rebindProbeViews(uint32_t probe);
125 static auto cubeByteSize(
const ProbeCube& cube) -> vk::DeviceSize;
127 auto readbackCube(ProbeCube& cube, std::vector<uint8_t>& out) -> bool;
129 auto uploadCube(ProbeCube& cube,
const std::vector<uint8_t>& bytes,
size_t offset) -> bool;
131 std::vector<std::pair<uint32_t, std::string>> m_pending_saves;
133 struct PendingShSave {
140 std::vector<PendingShSave> m_pending_sh_saves;
142 void prefilterInto(vk::CommandBuffer cmd, uint32_t probe);
144 void convolveIrradianceInto(vk::CommandBuffer cmd, uint32_t probe);
147 vk::CommandBuffer cmd,
const VulkanPipeline& pipeline,
const ProbeCube& target, uint32_t size, uint32_t mip, uint32_t face,
151 const VulkanCore* m_core =
nullptr;
152 vk::Format m_format = vk::Format::eUndefined;
153 uint32_t m_mip_levels = 1;
155 vk::raii::Sampler m_sampler =
nullptr;
156 std::vector<ProbeCube> m_probes;
158 std::vector<ProbeCube> m_probe_irradiance;
162 void createShResources(
const VulkanCore& core);
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;
170 ShaderLayout m_shader_layout;
171 VulkanPipeline m_prefilter_pipeline;
172 VulkanPipeline m_irradiance_pipeline;
173 vk::raii::DescriptorSet m_staging_source_set =
nullptr;
176 struct PreviewParams {
177 glm::mat4 view_projection {1.0f};
178 glm::vec4 center_radius {0.0f};
179 glm::vec4 camera_position {0.0f};
182 vk::Format m_depth_format = vk::Format::eUndefined;
183 ShaderLayout m_preview_layout;
184 VulkanPipeline m_preview_pipeline;
186 std::vector<vk::raii::DescriptorSet> m_preview_sets;